我是外星猪 发表于 2013-10-14 17:11:49

斑竹求助CALL指令

mov sp,10h
mov 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 17:11:50

本帖最后由 福禄娃娃 于 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
栈的增长方向是从高地址到地址

我是外星猪 发表于 2013-10-14 21:09:59

好吧,大概是动了~就是SP这个还不是很懂~为什么SP会减2?

福禄娃娃 发表于 2013-10-14 21:25:48

我是外星猪 发表于 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]
查看完整版本: 斑竹求助CALL指令