监测点10.4不明白啊
本帖最后由 todhacker 于 2011-10-2 20:47 编辑assume cs:code
code segment
start:
mov ax,6
call ax
inc ax
mov bp,sp
add ax,
mov ax,4c00h
int 21h
code ends
end start
算出ax是000B,,,BP是FFFE。。。怎么算出AX的
本帖最后由 老头子学汇编 于 2011-10-3 02:37 编辑
内存地址 机器码 汇编指令
1000:0000 B80600 mov ax,0006
1000:0003 FFD0 call ax
1000:0005 40 inc ax
1000:0006 89E5 mov bp,sp
1000:0008 034600 add ax,
--------------------------------------------
mov ax,0006 ;这个不用说你也知道的!
call ax ;将下一条指令的IP=0005压入栈,此时栈顶应该是sp=FFFE ,
因为AX=0006,然后跳转(位移)到1000:0006,
inc ax ;因为上一条指令CALL AX,已经跳转到1000:0006,
这一步没有执行
mov bp,sp ;sp=FFFE放入bp
add ax, ; ax+,结果存放在AX中:0006+0005=000b
ax=0006
的内容就=0005,因为CALL AX把0005压入栈了!
在前面没有规定段寄存器,它默认的段地址是SS的
比如(es,ds)它的段地址就是ES和DS 如果看不明白,请体谅下!
因我的表达能力,有限!
老头子学汇编 发表于 2011-10-2 21:14 static/image/common/back.gif
call ax ;将下一条指令的IP=0005压入栈,此时栈顶应该是sp=FFFE ,
因为AX=0006,然后跳转(位移)到1000:0006,
这里跳到1000:0006 是因为 ax=0006? 如果ax=ffff,那不是直接跳到1000:ffff? 丶Haw 发表于 2012-7-31 23:59
call ax ;将下一条指令的IP=0005压入栈,此时栈顶应该是sp=FFFE ,
因为AX=00 ...
call 16位reg
执行过程是这样描述的
(sp)=(sp)-2
((ss)*16+(sp))=(ip)
(ip)=(16位reg)
bp是啥,我都不知道 mov bp,sp ;sp=FFFE放入bp
add ax, ; ax+, 结果存放在AX中:0006+0005=000b
========================================
那么ss: 结果是啥 搞不明白呢
没有指明栈是默认最大栈吗
页:
[1]