字,字节,单字,双字

一个 bit 是1个二进制位,一个 byte (字节)是八个二进制位,也就是两个十六进制数,例如一个全是1的字节可以表示为 0xFF

一个字在32位的机器上是两个个字节,即十六位,而双字是四个字节,三十二位

小端方式和大端方式

小端方式是低有效字节存放在低地址,高有效字节存放在高地址,大段方式相反。

注意,在机器码反汇编的时候,从左到右依次是低地址到高地址,不用反过来,而且在每一个字节,即两个十六进制数表示一个数的时候,也不用在字节内进行翻转,例如,在一个小端机器的反汇编中,一个数是 b8 01 00 00它对应的数学真值是 0x01B8 即是十进制下的 440

整形

无符号数

无符号数直接按照二进制表示,没有歧义,其每一位都是有效位,乘以对应的权值即可转换成对应的数学真值

有符号数

有符号数一般按照补码表示,其特征是最高位为符号位,如果是 0 表示是一个正数,否则为负数

在将一个正数转换为无符号数的时候,如果不超出范围,没有发生溢出的现象,此时的有符号数的机器表示和无符号数是一样的。

将一个负数转换为无符号数的时候,先取出它的绝对值,将其转换为机器码,然后实行操作 各位取反,末位加一 即可得到对应的无符号数的机器码

将一个有符号数的机器码转换为数学真值时,如果符号位为0,那么就按照无符号数解释即可。否则,应该将除了最高有效位的所有位解释为一个无符号数,然后减去 2^(n-1) 即可得到对应的数学真值。或者可以末尾减一之后再各位取反,得到其绝对值。

关于补码原理的简述

补码的原理就是构造一个模运算系统,利用加减运算的溢出机制,是的一个数和它的相反数的补码相加之后正好是 模长 << 1即让最高位的1溢出,使得运算的结果为0,这样只通过一个加法器就可以实现加法和减法的运算。

整数运算的注意事项

逻辑右移和算术右移

逻辑右移在移动的时候,前面补的位是0,但是算数右移的时候,补位补的是符号位,所以算数右移可以实现负数右移相当于是除以2,即 ,可行的原因还是模运算系统的原理。

标志位的置位

标志位包括 OFCFPFSFZFAF ,其含义分别为溢出标志位、进位标志位,奇偶标记为,符号标志位,零标志位,辅助进位标志位。

OF在加法中的判断方式

详情见图片
加法器置位方法
对于OF的理解:如果输入的两个数A和B是同号的,但是输出的C是不同号的,那么就发生了溢出,置位。

而CF则是判断进位、借位情况是否发生了变化,如果变化就置位为1,否则为0

浮点型

对于小数,比较好的表示方式是浮点数表示,具体方法见下图
浮点数表示方法

规格化数

在32位浮点表示中,阶码的位数为8位,可以表示 之间的指数。需要注意的是,对规格化数来说,阶码是需要加上127的偏置的,即阶码的真值为 阶码的机器码 - 127

对于规格化数来说,尾数部分的值是1.xxxxx(binary)即尾数的第一位代表 后面以此类推