|
发表于 2015-12-18 02:41:50
|
显示全部楼层
本帖最后由 ultralqxq 于 2015-12-18 03:02 编辑
分析:
and al,11000101b
and ah,00001000b
由这两句得出ax的值为 0000 *000 **00 0*0*这样的形式【带*的为不确定是1还是0】
pushf
pop ax
这两句的意思就是将标志寄存器的值传给ax,所以分析*的位置从左到右依次为OF SF ZF PF CF【不记得位置可以查书本】
mov ax,0
push ax
popf
这三句分析:由于mov和push 指令不影响以上标志位,所以popf时,以上的标志位都为0
mov ax,0fff0h
add ax,0010h
从这两句得到 ax=0,那么OF =0[没有溢出] SF=0【我的理解是看结果的最高位,最高位是0就置0,是1就置1】 ZF=1【结果为0,所以置1】 PF = 1【奇偶标志1的个数为偶数时置1】 CF=1 【产生进位】
所以得到的结果是 ax = 0000 0000 0100 0101B =45H = 69
-------------------------------------------------------------------------------------------
附上溢出的和进位的区别:
溢出与进位是针对加法而言,在计算机里,减法会被转化为加法来进行运算:
x-y => x+(-y) => x+~y+1
5-3 => 5+(-3) => 0000 0101 + 1111 1100 + 1 = 0000 0010
0000 0101:5 的补码
1111 1100:-3的反码,加1后变成 -3 的补码
1111 1101:在计算机里,-3 就是这样表示的
溢出
当要判断运算是否溢出时,cpu 总是把寄存器里面的数据当成 有 符号数来处理
正数和负数相加不会溢出
两个正数相加,如果结果为负数(符号位为 1),表明发生溢出
两个负数相加,如果结果为正数(符号位为 0),表明发生溢出
设:
x 为第一个加数的符号位
y 为第二个加数的符号位
r 为结果的符号位
那么:
xy = 00 r=1,溢出,r=0,未溢出
xy = 11 r=0,溢出,r=1,未溢出
xy = 10 不会溢出
XY = 01 不会溢出
进位
当要判断运算是否进位时,cpu 总是把寄存器里面的数据当成是无符号数来处理
将两个寄存器的内容相加,如果两个数的最高位都为0,则不论结果的最高位是什么都不会进位
如果两个数的最高位都为1,则不论结果的最高位是什么都一定会进位,
如果两个数的最高位不相同,而结果的最高位却是0,那么一定是产生了进位,反之则是未进位
设:
x 为第一个加数的符号位(准确点,这时应叫做最高位)
y 为第二个加数的符号位
r 为结果的符号位
那么:
xy = 00 决不会产生进位
xy = 11 一定会进位
xy = 10 r = 0 ,有进位,r = 1,无进位
XY = 01 r = 0 ,有进位,r = 1,无进位 |
|