首页
社区
课程
招聘
[求助]关于call命令的问题
发表于: 2006-12-8 21:51 3918

[求助]关于call命令的问题

2006-12-8 21:51
3918
正在学习汇编,遇到了点困难......
书上有这样一段代码:
内存地址    机器码      汇编指令
1000:0     b8 00 00    mov ax,6
1000:3     ff d0       call ax
1000:5     40          inc ax
1000:6                 mov bp,sp
                        add ax,[bp]
问:这段程序执行后,ax中的数值为多少?

其中我有两处不明白:
(1)到call ax这条指令时,首先0005进栈,之后是不是就跳到以ax中的数据为偏移地址的代码处?
(2)到mov bp,sp这条指令时,我只知道栈顶的元素是0005。sp的值是多少?怎么来的?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
CALL处的AX为6
又寄存器直接寻址,所以是直接跳到6的地方,不是偏移地址

你不需要知道SP是怎么来的,你只需要知道SP是堆栈寄存器。用于堆栈的寻址。

由于对堆栈的任何操作,都会引起SP的变化。所以SP一般用作释放堆栈或者预留栈空间。

同样因为SP经常变化,不利于访问固定数据,所以常常会将SP的值转到BP中,这样你便能用固定的偏移访问同一个数据了。

举个例子:SP=10

PUSH FFFF
MOV BP,SP
然后中间无论你进行多少堆栈操作,你都可以通过MOV EAX,[BP]来访问那个FFFF。
2006-12-8 22:13
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
3
总算看到一个学汇编不懂而问问题,而不是不懂汇编,随便一个代码就问的人了
2006-12-8 22:14
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 笨笨雄 发布
CALL处的AX为6
又寄存器直接寻址,所以是直接跳到6的地方,不是偏移地址

你不需要知道SP是怎么来的,你只需要知道SP是堆栈寄存器。用于堆栈的寻址。

由于对堆栈的任何操作,都会引起SP的变化。所以SP一般用作释放堆栈或者预留栈空间。

同样因为SP经常变化,不利于访问固定数据,所以常常会将SP的值转到BP中,这样你便能用固定的偏移访问同一个数据了。

举个例子:SP=10

PUSH FFFF
MOV BP,SP
然后中间无论你进行多少堆栈操作,你都可以通过MOV EAX,[BP]来访问那个FFFF。


感谢版主细致地回复!

看了您的指点,并且经上机实验后,使我知道了这个mov bp,sp的意思。
这样下来,程序执行后,ax中的数值应该是11。
2006-12-8 23:29
0
游客
登录 | 注册 方可回帖
返回
//