检测点 10.3
下面的程序执行后,ax 中的数值为多少?
内存地址 机器码 汇编指令
1000:0 B8 00 00 mov ax,0
1000:3 9A 09 00 00 10 call far ptr s
1000:8 40 inc ax
1000:9 58 s: pop ax
add ax,ax
pop bx
add ax,bx
程序执行过程如下:
1. 在 IP=0 处读取 mov ax,0 指令,由于该指令占用 3 个字节,所以执行 (IP)=(IP)+3=3,然后执行该指令,于是 (ax)=0。
2. 在 IP=3 处读取 call far ptr s 指令,由于该指令占用 5 个字节,所以执行 (IP)=(IP)+5=8,然后执行该指令,即将 CS 和 IP 压栈:
(sp)=(sp)-2
(ss)*16+(sp))=(CS)=1000H
(sp)=(sp)-2
((ss)*16+(sp))=(IP)=8H
然后程序跳至标号 s 处:
(CS)=标号所在段的段地址=1000H
(IP)=标号在段中的偏移地址=9H
读取并执行 s 标号处的指令:
pop ax ; (ax)=8H
add ax,ax ; (ax)=(ax)+(ax)=8H*2=10H
pop bx ; (bx)=1000H
add ax,bx ; (ax)=(ax)+(bx)=10H+1000H=1010H
可见,程序执行后,AX 寄存器中存储的数据值为 1010H。