斑竹求助CALL指令
mov sp,10hmov ax,0123h
mov ds:,ax
call word ptr ds:
执行后ip=0123h,sp=0eh
这个SP的0eh是怎么得来的?为什么会把0123H推入栈?
mov sp,10h
mov ax,0123h
mov ds:,ax
mov word ptr ds:,0
call dword ptr ds:
执行后CS=0 ,IP=0123H ,SP=0CH
那这个CS IP SP的值有事怎么得来的?书上写的很模糊。只说了SP等于什么,怎么得来的?
本帖最后由 福禄娃娃 于 2013-10-14 19:08 编辑
这个地方看不懂也不怪你,我看这本书的时候到了第10章也不懂了,后面看了另外一本汇编的书《80X86汇编语言程序设计教程》才懂得,王爽的书省略了太多内容,仅适合入门,完事后可看别的书继续深造。
第一个:
call word ptr ds: 属于段内间接调用
call OPRD OPRD是16位通用寄存器或字存储器操作数
该指令进行的具体操作分解如下:
sp = sp -2 此题 sp = sp -2 = 10h - 2h = 0eh
= ip 将ip的值入栈
ip = (OPRD)将ds:中的内容送入ip中,ds:中的内容为0123h,所以执行完后ip = 0123h
第二个:
call dword prt ds:, 0 属于 段间间接调用
call OPRD OPRD是双字存储器操作数
该指令具体分解如下:
sp = sp - 2题中 sp = sp - 2 = 10h - 2h = 0eh
= cs先将cs的值压入栈,可理解为栈底存放着cs中的值
sp = sp -2 题中 sp = sp - 2 = 0eh - 2h = 0ch
= ip接着将ip的值压入栈,可理解为栈顶存放着ip的值
ip = OPRD的低字值
cs = OPRD的高字值
题中栈中存放内容为 0000 0123h 所以 ip = 0123hcs = 0000h
栈的增长方向是从高地址到地址 好吧,大概是动了~就是SP这个还不是很懂~为什么SP会减2?
我是外星猪 发表于 2013-10-14 21:09 static/image/common/back.gif
好吧,大概是动了~就是SP这个还不是很懂~为什么SP会减2?
书上67页栈的综述那儿:
push指令执行步骤:
1. sp = sp - 2
2. 向SS:SP指向的字单元中送入数据
在入栈的时候栈顶会先减一个字单元,也就是两个字节(16位),一个内存单元为1个字节。
执行CALL时为了能返回继续执行指令,需要先保存现场,把CS和IP入栈了才能ret返回后继续执行下一条指令。
页:
[1]