汇编语言检测点10.5
建议先自己思考问题的答案,不懂则返回看书
1、下面的程序执行后,AX的值为 3
解析: 关键是对call word ptr ds:[0EH]的执行分析, 关键 ds:[0EH]就是push进去的IP的位置
执行 call word ptr ds:[0EH] 的过程:
- CPU取该指令 : (call word ptr ds:[0EH])
- ip自增,指向了下一条指令 (inc ax)
- 开始执行 call word ptr ds:[0EH] 指令。 push ip ; 将 ip 压入栈, jmp ds:[0EH] ,即程序从 ds:[0EH] 中取出数据赋值给 ip
所以ds:[0EH]就是刚才push进去的IP的位置 - 执行三个 inc ax
- 因此最终 ax 值为 3
assume cs:code,ss:stack
stack segment
dw 8 dup(0)
stack ends
code segment
start:
mov ax, stack
mov ss, ax
mov sp, 0010H
mov ds, ax ;ds与ss值相同,指向同一段内存空间
call word ptr ds:[0EH]
inc ax
inc ax
inc ax
code ends
end start
2、下面的程序执行后,AX的值为 1,BX中的值为 0
assume cs:code,ds:data
data segment
dw 8 dup(0)
data ends
code segment
start:
mov ax, data
mov ss, ax
mov sp, 16
mov word ptr ss:[0], offset second
mov ss:[2], cs
call dword ptr ss:[0]
nop
second:
mov ax, offset second
sub ax, ss:[0CH]
mov bx, cs
sub bx, ss:[0EH]
code ends
end start
解析: 打字太麻烦,直接看笔记截图。关键是nop占一个字节,CS值没有改变。