我正在尝试在汇编中编写一个具有未知数量参数的函数,并且我希望在某一点上利用%esp来获取堆栈上某个偏移量的字节。我试着这样做:
movl offset,%eax
leal (%eax,%esp,1),%eax #
movb %bl,(%eax)
其中offset是4字节.long存储最近使用的参数在%esp中的偏移量。但是,在汇编这段代码时,我收到了这条消息:
错误:`(%eax,%esp,1)'不是有效的基础/索引表达式
我正在使用GCC4.8在kubuntu中为IA32组装。 Gnu语法,请:)
提前致谢!
答案 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语法允许这样做)。