数据的表示
字,字节,单字,双字
一个 bit
是1个二进制位,一个 byte
(字节)是八个二进制位,也就是两个十六进制数,例如一个全是1的字节可以表示为 0xFF
一个字在32位的机器上是两个个字节,即十六位,而双字是四个字节,三十二位
小端方式和大端方式
小端方式是低有效字节存放在低地址,高有效字节存放在高地址,大段方式相反。
注意,在机器码反汇编的时候,从左到右依次是低地址到高地址,不用反过来,而且在每一个字节,即两个十六进制数表示一个数的时候,也不用在字节内进行翻转,例如,在一个小端机器的反汇编中,一个数是 b8 01 00 00
它对应的数学真值是 0x01B8
即是十进制下的 440
整形
无符号数
无符号数直接按照二进制表示,没有歧义,其每一位都是有效位,乘以对应的权值即可转换成对应的数学真值
有符号数
有符号数一般按照补码表示,其特征是最高位为符号位,如果是 0
表示是一个正数,否则为负数
在将一个正数转换为无符号数的时候,如果不超出范围,没有发生溢出的现象,此时的有符号数的机器表示和无符号数是一样的。
将一个负数转换为无符号数的时候,先取出它的绝对值,将其转换为机器码,然后实行操作 各位取反,末位加一 即可得到对应的无符号数的机器码
将一个有符号数的机器码转换为数学真值时,如果符号位为0,那么就按照无符号数解释即可。否则,应该将除了最高有效位的所有位解释为一个无符号数,然后减去 2^(n-1)
即可得到对应的数学真值。或者可以末尾减一之后再各位取反,得到其绝对值。
关于补码原理的简述
补码的原理就是构造一个模运算系统,利用加减运算的溢出机制,是的一个数和它的相反数的补码相加之后正好是 模长 << 1
即让最高位的1溢出,使得运算的结果为0,这样只通过一个加法器就可以实现加法和减法的运算。
整数运算的注意事项
逻辑右移和算术右移
逻辑右移在移动的时候,前面补的位是0,但是算数右移的时候,补位补的是符号位,所以算数右移可以实现负数右移相当于是除以2,即
标志位的置位
标志位包括 OF
、CF
、PF
、SF
、ZF
、AF
,其含义分别为溢出标志位、进位标志位,奇偶标记为,符号标志位,零标志位,辅助进位标志位。
OF在加法中的判断方式
详情见图片
对于OF的理解:如果输入的两个数A和B是同号的,但是输出的C是不同号的,那么就发生了溢出,置位。
而CF则是判断进位、借位情况是否发生了变化,如果变化就置位为1,否则为0
浮点型
对于小数,比较好的表示方式是浮点数表示,具体方法见下图
规格化数
在32位浮点表示中,阶码的位数为8位,可以表示 阶码的机器码 - 127
。
对于规格化数来说,尾数部分的值是1.xxxxx(binary)
即尾数的第一位代表