随便逛逛 发表于 2015-12-16 16:39:14

检测点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 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 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,无进位

x51zqq 发表于 2016-1-5 22:40:15

先撇去答案的正确性   有这份热心   就应该支持了!   

ligen超越 发表于 2016-1-6 11:25:31

我也搞不懂!
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

爱上小刺猬 发表于 2016-1-14 21:18:48

{:10_256:}就是二楼说的OF SF ZF PF CF这几个的判断而已

sbx 发表于 2020-8-19 22:32:42

;下面的程序执行后:(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]
查看完整版本: 检测点11.4求解啊