检测点11.4求解啊
下面的程序执行后:(AX)=?mov ax,0
push ax
popf
mov ax,0fff0h
add ax,0010h
pushf
pop ax ;为什么执行后ax=3047 ???
and al,11000101b
ad ah,00001000b
本帖最后由 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 00000100 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 = 10r = 0 ,有进位,r = 1,无进位
XY = 01 r = 0 ,有进位,r = 1,无进位 先撇去答案的正确性 有这份热心 就应该支持了! 我也搞不懂!
mov ax,0 ;ax=0
push ax ;ax=0
popf ;ax=0
mov ax,0fff0h ;ax=0fff0h
add ax,0010h ;ax=0 (发生了进位 cf=1)
pushf ;ax=0
pop ax ;ax=0
and al,11000101b ;al=00000000b
ad ah,00001000b ;ah=00001000b {:10_256:}就是二楼说的OF SF ZF PF CF这几个的判断而已 ;下面的程序执行后:(ax)=?
mov ax,0
push ax
popf
mov ax,0fff0h
add ax,0010h ;(ax)=0h;OF=0 ,SF=0,ZF=1,PF=1,CF=1,
pushf ;0000000001000101b
pop ax ;0000000001000101b
and al,11000101b;01000101b=45h
and ah,00001000b;00000000b=00h,则(ax)=45h
页:
[1]