linha0 发表于 2011-7-14 12:26:10

为什么AX不等于0??

本帖最后由 linha0 于 2011-7-15 13:10 编辑

mov ax,0
push ax      ;将 0 压入栈中
popf             ;将所有标志位,重置为 0
pushf         ;将为 0 的标志位压入栈中
pop ax         ;从栈中取出标志位

最后结果,AX为什么不等于0?

要求讲解原理过程?(我能看明白就行了)

(^o^)/ 发表于 2011-7-14 12:26:11

yulin3192 发表于 2011-7-14 13:17:13

沙发
我是菜鸟
现在只会加减

天灾 发表于 2011-7-14 17:45:11

本帖最后由 天灾 于 2011-7-14 17:47 编辑

入栈出栈顺序出错,栈被破坏
mov ax,0
push ax
popf为何标志先出栈?与第四句对换测试正常
pushf 为何标志后入栈?
pop ax

linha0 发表于 2011-7-14 18:58:32

天灾 发表于 2011-7-14 17:45 static/image/common/back.gif
入栈出栈顺序出错,栈被破坏
mov ax,0
push ax


不是这样的,上面我已经重新注释过了:L

天灾 发表于 2011-7-14 19:04:23

本帖最后由 天灾 于 2011-7-14 19:59 编辑

linha0 发表于 2011-7-14 18:58 http://bbs.fishc.com/static/image/common/back.gif
不是这样的,上面我已经重新注释过了

好吧 加我研究下 谢谢

linha0 发表于 2011-7-15 13:08:50

哈哈哈,悬赏还是我自己拿吧!(哎,还是被小甲鱼剥削一个鱼币去了!)

通过上面的测试,反过来想,标志寄存器默认为1100000000000010。也就是说标志寄存器的第15、14、1 位必定为1。如果要设置其它标志位,就是在这个基础上设置的。

因此,检测点11.4就说得通了。

linha0 发表于 2011-7-15 13:12:52

:'(:'(:'(
小甲鱼,还我10个鱼币……………………
竟然不能自己拿自己的悬赏:Q:Q:Q

linha0 发表于 2011-7-15 13:13:53

:'(:'(:'(
小甲鱼,还我10个鱼币……………………
竟然不能自己拿自己的悬赏:Q:Q:Q

GeV20 发表于 2012-8-20 20:10:26

最高两位没试出来.只有一个位是1,不知道有没有弄错了.

XBOY 发表于 2012-8-20 22:25:43

哥们。。既然领不了。。赏给我好么。。。谢谢了

网络小薪 发表于 2012-8-21 21:46:01

路过刚刚很久很久花见花开很快就还款计划计划法国风格和混合接口和计划各方各分行客户

メ㊣逆ご帅☆ 发表于 2012-8-21 22:14:37

本帖最后由 メ㊣逆ご帅☆ 于 2012-8-21 22:49 编辑

mov ax,0

push ax      ;将 0 压入栈中

popf             ;将所有标志位,重置为 0

pushf         ;将为 0 的标志位压入栈中

pop ax         ;从栈中取出标志位
冒着采纳率降低的风险,回答你
你有好好看书么popf是讲堆栈内的数据弹出给标志寄存器
pushf是将所有标志寄存器入栈
把检测点11.4顺便给你讲一下
下面的程序执行后,ax的值是多少?




assume cs:codesg

datasg segment

db 16 dup(0)

datasg ends

codesg segment

start:

       mov ax,0

       push ax ;将0压栈

       popf ;把栈中数据弹出给标志寄存器,也就是标志位清零

       mov ax,0fff0h
       add ax,0010h ;执行完ax值为0,进位,但没溢出

执行完
CF       OF       SF       ZF       PF
1         0          0          1         1
这里不知道的我们就用X代替(小邪恶)
XXXX    0XXX    01XX    X1X1
                   OF            SF ZF               PF   CF



      pushf;把状态寄存器入栈
      pop ax ;放给ax
      and al,11000101b ;取al=01XXX1X1b和11000101与操作完之后al=0100 0101b
      and ah,00001000b ;取ah=XXXX0XXX和00001000b进行与操作ah=00000000b


       mov ax,4c00h

       int 21h


       codesg ends

       end start

那么结果就为45h


GeV20 发表于 2012-8-21 23:36:03

本帖最后由 GeV20 于 2012-8-21 23:45 编辑

To:13楼
你有没有看过,在执行到那两条and运算前的一行,"pop ax",这句执行过后,ax的值是多少?
注意它的二进制形式的第1位,也就是对应的CF位和PF位之间的位.
看完了就知道楼主在问什么了.

http://blog.csdn.net/do2jiang/article/details/5394350

e马先森 发表于 2017-2-16 13:07:02

围观大神们都好厉害的说!
页: [1]
查看完整版本: 为什么AX不等于0??