tyyfly 发表于 前天 01:59

检测点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中。

FishC 发表于 前天 01:59

检测点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]
查看完整版本: 检测点10.1 10.2