我正在尝试通过assmbly中的堆栈研究将参数传递给函数。我正在使用Fedora 20,64位系统。
当我尝试以下代码时,
pushl%ebp
popl%ebp
我收到错误, 错误:“push”
的指令后缀无效我将如何克服这个错误!
我编译了, as -ggstabs -o Function_Stack.o Function_Stack.c
答案 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
开关。