检测点10.1 10.2
10.1补全程序,实现从内存1000:0000处开始执行指令。
assume cs:code
stack segment
db 16 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax,___1___
push ax
mov ax,___2___
push ax
retf
code ends
end start
A:1.1000h 2.0h
由于retf是先pop IP再pop CS,所以要先push CS再push IP。
10.2
下面的程序执行后,ax中的数值为多少?
内存地址 汇编指令
1000:0 mov ax,0
1000:3 call s
1000:6 inc ax
1000:7 s:pop ax
A:0006
1000:3 call s 指令將下一行指令的IP 0006 push進堆棧,後跳轉至s標號處,而s標號處的指令pop ax則又將剛才push進堆棧的數據0006 pop out至ax中。
检测点10.1 解答
需要填入的空缺为:
1. 1000h
2. 0h
原因分析:
[*]retf 指令会先 pop IP 后 pop CS
[*]因此要先压入 CS 值(1000h),再压入 IP 值(0h)
[*]最终会跳转到 1000h:0h 处执行指令
正确补全后的代码:
mov ax,1000h; 对应空1
push ax
mov ax,0h ; 对应空2
push ax
检测点10.2 解答
最终 ax 的值为 0006h
执行流程分析:
[*]执行 call s 时:
[*]将下条指令地址 1000:0006 的 IP(0006h)压入栈
[*]跳转到标号 s(地址 1000:0007)
[*]执行 pop ax 时:
[*]将栈顶的 0006h 弹出到 ax
关键点说明:
[*]call 指令的段内调用只压入 IP 值
[*]pop 操作会直接修改 ax 的值
[*]inc ax 指令在跳转后不会被执行
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]