转移地址在内存中的call指令有两种格式
(1) call word ptr 内存单元地址
用汇编语法来解释此种格式的call指令,CPU执行“call word ptr内存单元地址”时,相当于进行:
push IP jmp dword ptr 内存单元地址
比如,下面的指令:
mov sp,10h mov ax,0123h mov ds:[0],ax call word ptr ds:[0]
执行后
(IP)= 0123h, (sp) = 0Eh
(2) call dword ptr 内存单元地址
用汇编语法来解释此种格式的call指令,则:
push CS push IP jmp dword ptr 内存单元地址,相当于:
push CS push IP jmp dword ptr 内存单元地址
比如,下面的指令:
mov sp,10h mov ax,0123h mov ds:[0],ax mov word ptr ds:[2],0 call dword ptr ds:[0]
执行后(CS)=0, (IP)=0123h, (sp)=0Ch
问题
(1)下面的程序执行后,ax中的数值为多少?
(用call指令原理分析,不要用debug执行,中断会导致结果不一致)
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 call word ptr ds:[0eH] inc ax inc ax inc ax mov ax, 4c00h int 21h code ends end start
ax中的值为3