王素《汇编语言》 检测10.4
汇编程序如下 :
assume cs:code |
|
stack segment |
|
dw 8 dup (0) |
|
stack ends |
|
code segment |
|
start :mov ax,stack |
1000:0000 |
mov ss,ax |
1000:0003 |
mov sp,16 |
1000:0005 |
mov ds,ax |
1000:0008 |
mov ax,0 |
1000:000A |
call word ptr ds:[0eH] |
1000:000D |
inc ax |
1000:000E |
inc ax |
|
inc ax |
|
code ends |
|
end start |
stack段用 dw 8 dup (0)定义了16字节内存为0的栈段,所以ds:[0]~ds:[f]的内存单元全部为0,当然,ds:[0E]单元的内存自然就为0了!
从程序中得知ss== sp
call word ptr ds:[0eh] 指令执行的是push ip (这里的ip值为INC AX的偏移地址 为0eh。)
mov sp =16 告诉栈顶指针为16 当执行push ip的时候 sp =sp-2 使sp指向14,也就是ss:[0eh]
再将call word ptr ds:[0eh]的下一条指令INC AX的偏移地址入栈到ss:[oeh]处 ,而ds=ss,因此此时ds:[0eh]处存放着的已经是INC AX的偏移地址了
当程序再一次执行到call word ptr ds:[0EH]时,指针将跳转到ds:[0eh] ,而此时的:[0eh]处的值已经不是0了,它已变成上次执行call时被压栈的INC AX处的偏移地址,
所以进行 执行 inc ax 指令。