todhacker 发表于 2011-10-2 20:36:38

监测点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-2 21:14:10

本帖最后由 老头子学汇编 于 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:16:45

如果看不明白,请体谅下!
因我的表达能力,有限!

丶Haw 发表于 2012-7-31 23:59:23

老头子学汇编 发表于 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?

T.Monstor 发表于 2020-2-24 22:59:59

丶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)

maikehong 发表于 2023-7-21 19:00:11

bp是啥,我都不知道

maikehong 发表于 2023-7-21 19:09:36

mov bp,sp       ;sp=FFFE放入bp
add ax,   ; ax+, 结果存放在AX中:0006+0005=000b
========================================
那么ss: 结果是啥 搞不明白呢







DDLYZH 发表于 2023-7-29 10:58:26

没有指明栈是默认最大栈吗
页: [1]
查看完整版本: 监测点10.4不明白啊