项羽姓秦 发表于 2020-3-6 00:08:28

检测点10.4作业练习

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值为000Bh
;因为sp的值为FFFE,所以把FFFE赋值给了bp
;执行add ax,时,=SS:FFFE=0005h
;所以ax=6+5=000Bh

文小诗 发表于 2020-3-28 15:17:55

为什么sp的值是fffe

文小诗 发表于 2020-3-28 15:22:52

我知道了因为是空栈

文小诗 发表于 2020-3-28 15:39:15

不对不对,应该是因为把call   ax

文小诗 发表于 2020-3-28 15:52:26

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值为000Bh
;因为sp的值为FFFE,所以把FFFE赋值给了bp
;执行add ax,时,=SS:FFFE=0005h/为什么这里是0005h
;所以ax=6+5=000Bh

项羽姓秦 发表于 2020-3-30 16:34:46

文小诗 发表于 2020-3-28 15:52
assume cs:code

code segment


你可以直接上程序看一下;

因为SP的值为FFFE;
然后赋值给了bp;
执行add ax,时,=SS:FFFE;
所以add ax,等于add ax,SS:等于add ax,SS:FFFE;
而SS:FFFE的值为0005h;
所以最后结果就是000Bh。

文小诗 发表于 2020-3-30 23:01:31

callax
功能puship
      jmp16位寄存器
ip不是应该等于6吗?

项羽姓秦 发表于 2020-3-30 23:30:52

文小诗 发表于 2020-3-30 23:01
callax
功能puship
      jmp16位寄存器


是的,ip是等于6;

call ax的功能就是:

当执行这条代码之后,直接跳转到ip值为6的代码段那里去了,你没发现call ax下面的inc ax没有执行到吗?

直接执行ip等于6 的代码段那里了,而刚好就是mov bp,sp。

文小诗 发表于 2020-3-31 19:31:48

懂了,谢谢

mrthreepa 发表于 2020-5-9 18:07:31

文小诗 发表于 2020-3-30 23:01
callax
功能puship
      jmp16位寄存器


push ip的ip是这条指令的下一个
call ax的地址为3,此时ip已经指向下一条指令了,所以入栈的ip为5.
页: [1]
查看完整版本: 检测点10.4作业练习