鱼C论坛

 找回密码
 立即注册
查看: 1603|回复: 3

斑竹求助CALL指令

[复制链接]
发表于 2013-10-14 17:11:49 | 显示全部楼层 |阅读模式
2鱼币
mov sp,10h
mov ax,0123h
mov ds:[0],ax
call word ptr ds:[0]
执行后ip=0123h,sp=0eh
这个SP的0eh是怎么得来的?为什么会把0123H推入栈?

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
那这个CS IP SP的值有事怎么得来的?书上写的很模糊。只说了SP等于什么,怎么得来的?

最佳答案

查看完整内容

这个地方看不懂也不怪你,我看这本书的时候到了第10章也不懂了,后面看了另外一本汇编的书《80X86汇编语言程序设计教程》才懂得,王爽的书省略了太多内容,仅适合入门,完事后可看别的书继续深造。 第一个: call word ptr ds:[0] 属于段内间接调用 call OPRD OPRD是16位通用寄存器或字存储器操作数 该指令进行的具体操作分解如下: sp = sp -2 此题 sp = sp -2 = 10h - 2h = 0eh [sp] = ip 将ip的值入栈 ip = ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-14 17:11:50 | 显示全部楼层
本帖最后由 福禄娃娃 于 2013-10-14 19:08 编辑

这个地方看不懂也不怪你,我看这本书的时候到了第10章也不懂了,后面看了另外一本汇编的书《80X86汇编语言程序设计教程》才懂得,王爽的书省略了太多内容,仅适合入门,完事后可看别的书继续深造。
第一个:
call word ptr ds:[0] 属于段内间接调用
call OPRD   OPRD是16位通用寄存器或字存储器操作数
该指令进行的具体操作分解如下:
sp = sp -2    此题 sp = sp -2 = 10h - 2h = 0eh
[sp] = ip       将ip的值入栈
ip = (OPRD)  将ds:[0]中的内容送入ip中,ds:[0]中的内容为0123h,所以执行完后ip = 0123h

第二个:
call dword prt ds:[2], 0 属于 段间间接调用
call OPRD    OPRD是双字存储器操作数
该指令具体分解如下:
sp = sp - 2  题中 sp = sp - 2 = 10h - 2h = 0eh
[sp] = cs  先将cs的值压入栈,可理解为栈底存放着cs中的值
sp = sp -2   题中 sp = sp - 2 = 0eh - 2h = 0ch
[sp] = ip  接着将ip的值压入栈,可理解为栈顶存放着ip的值
ip = OPRD的低字值
cs = OPRD的高字值
题中栈中存放内容为 0000 0123h 所以 ip = 0123h  cs = 0000h
栈的增长方向是从高地址到地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-14 21:09:59 | 显示全部楼层
好吧,大概是动了~就是SP这个还不是很懂~为什么SP会减2?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-14 21:25:48 | 显示全部楼层

书上67页栈的综述那儿:
push指令执行步骤:
1. sp = sp - 2
2. 向SS:SP指向的字单元中送入数据
在入栈的时候栈顶会先减一个字单元,也就是两个字节(16位),一个内存单元为1个字节。
执行CALL时为了能返回继续执行指令,需要先保存现场,把CS和IP入栈了才能ret返回后继续执行下一条指令。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 14:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表