检测点 10.4
下面的程序执行后,ax 中的数值为多少?
内存地址 机器码 汇编指令
1000:0 B8 06 00 mov ax,6
1000:3 ff d0 call ax
1000:5 40 inc ax
1000:6 mov bp,sp
add ax,[bp]
程序执行过程如下:
1. 在 IP=0 处读取 mov ax,0 指令,由于该指令占用 3 个字节,所以执行 (IP)=(IP)+3=3,然后执行该指令,于是 (ax)=6。
2. 在 IP=3 处读取 call ax 指令,由于该指令占用 2 个字节,所以执行 (IP)=(IP)+2=5,然后执行该指令,即将 IP 压栈:
(sp)=(sp)-2
((ss)*16+(sp))=(IP)=5H
由于 SP 寄存器初始化值为 0,所以执行 (sp)=(sp)-2 的结果使得 (sp)=FFFEh。
然后执行:
(IP)=(ax)=6H
程序跳至 CS:IP = 1000:6 处执行以下指令:
mov bp,sp ; (bp)=(sp)=FFFEh
add ax,[bp] ; BP 寄存器用作寻址时,默认段寄存器为 SS,因此指令中的 [bp] 就是 ss:[bp]。SS:BP 地址存储的就是刚刚压入栈中的值 5H,于是 (ax)=(ax)+ss:[bp]=06H+05H=0BH
可见,程序执行后,AX 寄存器中存储的数据值为 000BH。