汇编基础之路-2nd
上节说到了数据宽度,例如数据宽度为一个字节,那么可表示的范围就是0~0xFF, 那下面的数据表示什么意思呢?
0101 0101
当然不同的角度得出的答案是不同,例如假设它是表示一个二进制文件,那么01可表示一个逗号,接下来就进入今天的正题。
Part3
一.有符号数与无符号数
1.无符号数:也就是正数,例如:1001 1010 (十六进制为0x9A)
2.有符号数:储存的时候以0开头,为正数;储存的时候以1开头为负数
【其中,有符号的正数的编码规则与无符号数一致】
二.编码规则
1.无符号数的编码规则
2.有符号数的编码规则:
原码:最高位为符号位,其余各位为数值本身的绝对值
反码:对于正数而言,反码与原码一致;对于负数,符号位为1,其余各位对源码取反。
补码:对于正数而言,补码与原码一致;对于负数,符号位为1,其余位对原码取反后,再加1.
3.举例如下:
不妨用8个字节来储存数据,以-7为例,它的原码为 1000 0111, 反码为1111 1000(注意符号位不变),补码为1111 1001
另外负数的储存方法是补码,验证结果如下:



其中,F9即为1111 1001,从而为-7的补码
4.正数与负数的储存
1)假设数据宽度为1byte

1)假设数据宽度为doubleword:

Part4
一.位运算
1.为何要学位运算:某些功能只能用位运算解决,例如调试器的编写
2.位运算的分类
1)与运算:两个为都为1时,结果才为1;可以借用物理学当中的串联电路来理解(括号内的写法为C语言的写法,以下同)

2)或运算:有一个位为1,结果就为1;可以借用物理学当中的并联电路来理解

3)异或运算:只有位不同时,结果为1,若相同则为0;可以借用物理学当中的交叉电路来理解

4)非运算:0算出的结果为1,1算出的结果为0;

5)左移:各二进为全部左移若干位,高位丢弃,低位补0
6)右移:各二进为全部左移若干位,低位丢弃,高位补0或者补符号位

二.位运算之加减乘除
计算机其实不会做加减乘除法,都是通过位运算实现的,以下介绍通过位运算实现加减法的过程
1.加法的实现过程:
以4 + 5 =?为例
其中4 可表示为 0000 0100, 5可表示为 0000 0101,首先进行异或运算,得到的结果为0000 0001,然后判断是否有进位的现象,
这时可以用与运算,此时的结果为0000 0100,只要有1出现,说明需要进位,又注意到进位是进到下一位,因此与运算的结果要
左移一位,即是0000 1000,最后用异或运算的结果和与运算的结果相加,得到0000 1001,此时,计算还未结束,还要判断这一步
是否有进位,再一次用与运算得到的结果为0000 0000,这时已经没有1,说明没有进位,计算结束,结果为0000 1001,即为9
2.减法:其实质还是加法,只不过要找负数的补码。
浙公网安备 33010602011771号