鱼C论坛

 找回密码
 立即注册
查看: 6780|回复: 5

检测点11.4求解啊

[复制链接]
发表于 2015-12-16 16:39:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面的程序执行后:(AX)=?

mov ax,0
push ax
popf
mov ax,0fff0h
add ax,0010h
pushf
pop ax     ;为什么执行后ax=3047 ???
and al,11000101b
ad ah,00001000b
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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,无进位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 4 反对 0

使用道具 举报

发表于 2016-1-5 22:40:15 | 显示全部楼层
先撇去答案的正确性   有这份热心   就应该支持了!     
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-14 21:18:48 | 显示全部楼层
就是二楼说的OF SF ZF PF CF这几个的判断而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 07:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表