错误:“push”的指令后缀无效

时间:2014-02-10 13:55:59

标签: assembly x86-64

我正在尝试通过assmbly中的堆栈研究将参数传递给函数。我正在使用Fedora 20,64位系统。

当我尝试以下代码时,

pushl%ebp

popl%ebp

我收到错误,  错误:“push”

的指令后缀无效

我将如何克服这个错误!

我编译了,  as -ggstabs -o Function_Stack.o Function_Stack.c

1 个答案:

答案 0 :(得分:22)

您得到的错误来自一个非常简单的事实:32位模式下的push指令接受16位和32位立即作为参数。但是,64位模式中使用的push指令仅接受16位和64位立即数。由于您正在将代码编译为64位,因此汇编程序会抛出错误,因为它无法对此类指令进行编码。另外,请记住,通过在l指令中添加push后缀来强制自行强制操作数大小。我在这里写的所有内容与pop完全相同,只是它接受寄存器/内存,而不是immediates。

但是,您还需要时要记住32位和64位Linux系统之间的ABI差异。除其他外,ABI指定如何将参数传递给函数,以及如何从用户模式应用程序调用内核。您的代码清楚地编写为32位模式,看看它如何使用堆栈传递参数和(非常)过时的int $0x80方式调用系统调用。要了解64位ABI,请参阅this document

或者,您可以选择在64位系统上编译32位代码。如果在64位系统上安装了必要的32位运行时库,则此类可执行文件将起作用。大多数发行版允许您以不同的方式执行此操作。您的编译器as具有用于发出32位代码的--32开关。

相关问题