汇编:从%esp到%eax

时间:2014-04-18 21:17:37

标签: function assembly cpu-registers

我正在尝试在汇编中编写一个具有未知数量参数的函数,并且我希望在某一点上利用%esp来获取堆栈上某个偏移量的字节。我试着这样做:

movl        offset,%eax
leal        (%eax,%esp,1),%eax #
movb        %bl,(%eax)

其中offset是4字节.long存储最近使用的参数在%esp中的偏移量。但是,在汇编这段代码时,我收到了这条消息:

  

错误:`(%eax,%esp,1)'不是有效的基础/索引表达式

我正在使用GCC4.8在kubuntu中为IA32组装。 Gnu语法,请:)

提前致谢!

2 个答案:

答案 0 :(得分:2)

实际上它无效,esp不能用作index寄存器。解决方案很简单,因为它允许作为base:只需交换操作数并使用leal (%esp, %eax), %eax。或者,add %esp, %eax

PS:movb %bl,(%eax)是一个内存写入,而不是读取,你说你试图“获取”一个字节。

PS#2:当然你甚至不需要计算地址,你可以在mov指令中做到这一点:movb (%esp, %eax), %bl

答案 1 :(得分:0)

假设这是32位代码,这不会起作用,因为使用esp作为基址寄存器使用ss(堆栈分段)而不是ds(数据段),并且取决于OS,ss和ds可能不是逻辑上相等。你可以用

        movb    (%esp+offset), %bl

我不知道GNU语法,但由于操作数bl是一个字节,你可以使用“mov”而不是“movb”(如果GNU语法允许这样做)。