我试图通过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位,因此汇编程序会抛出错误,因为它无法对此类指令进行编码.另外,请记住,您可以通过l在push指令中添加后缀来自行强制操作数大小.我在这里写的所有内容都是完全相同的pop,除了它接受寄存器/内存,而不是immediates.
但是,您还需要记住32位和64位Linux系统之间的ABI差异.除其他外,ABI指定如何将参数传递给函数,以及如何从用户模式应用程序调用内核.您的代码清楚地编写为32位模式,看看它如何使用堆栈传递参数和(非常)过时int $0x80的调用系统调用方式.要了解64位ABI,请参阅此文档.
或者,您可以选择在64位系统上编译32位代码.如果在64位系统上安装了必要的32位运行时库,则此类可执行文件将起作用.大多数发行版允许您以不同的方式执行此操作.您的编译器as具有--32用于发出32位代码的开关.
| 归档时间: |
|
| 查看次数: |
18267 次 |
| 最近记录: |