Function 程序集:从%esp到%eax

Function 程序集:从%esp到%eax,function,assembly,cpu-registers,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

我正试图在汇编中编写一个参数数目未知的函数,有一次我想学习%esp以获取堆栈上某个偏移量处的字节。我正试图这样做:

movl        offset,%eax
leal        (%eax,%esp,1),%eax #
movb        %bl,(%eax)
其中offset是一个4字节。long将最近使用的参数的偏移量存储在%esp中。但是,在汇编这段代码时,我收到以下消息:

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

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


提前谢谢

实际上它是无效的,
esp
不能用作
索引
寄存器。不过解决方案很简单,因为它被允许作为
:只需交换操作数并使用
leal(%esp,%eax),%eax
。或者,
添加%esp,%eax

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


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

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

        movb    (%esp+offset), %bl
我不知道GNU语法,但是由于操作数bl是一个字节,您可以使用“mov”而不是“movb”(如果GNU语法允许的话)