错误:"push"的指令后缀无效

Mel*_*vin 15 assembly x86-64

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

当我尝试以下代码时,

pushl%ebp

popl%ebp

我得到错误,错误:"推"的无效指令后缀

我将如何克服这个错误!

我编译它,如-ggstabs -o Function_Stack.o Function_Stack.c

Dan*_*zar 24

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

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

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

  • 我用--32开关,它成功创建了obj.现在它抛出了ld prog.0 -o prog的错误,输入文件`prog.o'的ld:i386架构与i386:x86-64输出不兼容.ld应该是什么标志? (5认同)
  • (仅供参考)尝试使用"-melf_i386"-flag作为ld. (3认同)

归档时间:

查看次数:

18267 次

最近记录:

11 年,11 月 前