检测点10.1
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, ____①____
push ax
mov ax, ____②____
push ax
retf
mov ax,4c00H
int 21H
code ends
end start
Q: 补全程序,实现从内存1000:0000处开始执行指令
A:
- 1000H
- 0
检测点10.2
Q: 上面的程序执行后,ax中的数值为多少?
A: ax = 6
检测点10.3
Q: 上面的程序执行后,ax中的数值为多少?
A: ax = 1010H
分析:
-
call far ptr a
将cs=1000压入栈,ip=3压入栈(call指令后的第一条指令的地址压入栈) -
pop ax
后ax=8H、bx=1000H - 不解释了
检测点10.4
Q: 上面的程序执行后,ax中的数值为多少?
A: ax = 0BH
检测点10.5
A: ax = 3
分析:
-
call word ptr ds:[0EH]
先将IP(第一条inc ax) 压入栈,随后从栈中去除最新压入的数值(因为整个栈的大小为0FH,所以压入一个数值后,SP指向0EH),即IP。 - 跳转过去后就是三条连着的
inc ax
,从而得到ax=3
检测点10.6
Q: 下面的程序执行后,ax和bx中的数值为多少?
A: ax = 1, bx = 0
分析:
-
mov word ptr ss:[0], offset s
后,ss:[0]
的字地址 保存了s的偏移量 -
mov ss:[2], cs
后,ss:[2]
的字地址 保存了cs - 调用了
call
指令后,ss:[0EH]
的字地址 里面保存了cs,ss:[0CH]
的字地址里保存了 nop指令所在的地址 -
sub ax, ss:[0CH]
后,ax=1 - 后面一个同理可得,bx = 0