问:执行程序后,ax中值为多少?
assume cs:code
stack segment
dw 8 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ds,ax
mov ax,0 ;程序执行到这里的时候,谁都明白,
;结果就是ss:sp指向stack:10h处,ds=stack,ax = 0
call word ptr ds:[0EH] ;这一句是看汇编语言论坛的里高手的解释后自己再慢慢想明
;白的,但跟他们的解释不那么一样。看下面
;书上是这样说的,先push ip。
;那么ip是多少呢?根据第三版第32页的描述,
;将call word ptr ds:[0EH]加载入CPU后,ip指向下一条指令
;即ip 指向 inc ax 的偏移地址。然后将ip的值入栈。
;即sp = sp - 2,
;即(SS:SP)=(stack:0EH)=(inc ax 的偏移地址)。
;然后执行call word ptr ds:[0EH]
;那么call word ptr ds:[0EH]是什么意思呢?
;就是将ds:[0EH]处的一个字取出来给ip,
inc ax
- - - - - - - - - - - - - - - -
0 1 2 3 4 5 6 7 8 9 a b c d e f
ss:0e
ds:0e
;因为刚刚才将ip(inc ax的偏移地址)存入SS:[0EH],
;而ds:[0EH] 正好是 ss:[0EH]
;所以就是将inc ax指令的偏移地址给ip,
;所以CS:IP就指向了inc ax这条指令。
;所以接下来就是执行inc ax,以及之后的指令。
;结果就是ax = 3
inc ax
inc ax
inc ax
mov ax,4c00h
int 21h
code ends
end start |