格式天下 发表于 2012-3-10 19:58:14

监测点11.4,求高手详细解读,先谢了

各种不懂呀,pop ax后(ax)=00001011?

莫名其妙 发表于 2012-3-10 19:58:15

本帖最后由 莫名其妙 于 2012-3-12 08:30 编辑

首先   标志寄存器是个16位的数据       ax 是个16位寄存器    这个你要知道


ax =0   push ax    这时候寄存器那保存的 ax 的值 和 栈中的值都是    0000   
然后popf    注意这个是将栈中数据按位保存进标志寄存器(flag) 其实就是给标志寄存器所有的值都置0
然后 mov ax 0fff0h赋值语句
add ax 0010h    加法 将结果存进ax中 关键在这里 这里因为加法产生了进位所以进位标志位CF变为1刚才因为给 标记寄存器全都置0了所以现在CF为1了标志寄存器这个16位数据你把它当作16为数据来看的话他的值也就改变了不再是0000了
( 具体是多少呢   自己按照本章开始的表格找找CF在哪一位上其他各标志位的值是多少然后用2进制转换成16进制看看!!)
pushf   将改变后的标志寄存器进栈
pop ax 将栈中数据 出栈保存在ax中
and al, *****                  只看al的值   将 al 的高八位用0代替
andah,*******            只看ah的值   将   ah 的低八位用0代替   
这两句就不说了把高八位 低八位拆开 然后按位进行与运算1and1 =1 0and0=0 1and0=0 0and1=0   
然后合并   得出 ax

夏洛 发表于 2012-3-10 21:04:53

这个程序要在debug中验证,pop ax这条指令执行后,从栈中取出的数据是标志寄存器的值

格式天下 发表于 2012-3-11 19:25:16

本帖最后由 格式天下 于 2012-3-11 19:26 编辑

莫名其妙 发表于 2012-3-10 19:58 static/image/common/back.gif
首先   标志寄存器是个16位的数据       ax 是个16位寄存器    这个你要知道



我先前没搞懂这个,现在明白了,谢谢啊
页: [1]
查看完整版本: 监测点11.4,求高手详细解读,先谢了