尝试学习NASM大会。我有一台64位机器,带有Ubuntu。最近我决定测试push
和pop
说明。我这样做:
nasm -felf64 Test.asm
显然,在64位模式下不支持它们。好吧,没问题,我就这样做了32:
nasm -felf Test.asm
现在,一如既往,
gcc Test.o
但它现在告诉我
i386 architecture of input file 'Test.o' is incompatible with i386:x86-64 output
我不太清楚这里的错误。如果显然我无法编译32位程序,如何在64位机器上测试push
和pop
?
答案 0 :(得分:3)
“-m32”怎么样? 我认为您需要关心依赖库(例如libc),请参阅:Use 32bit shared library from 64bit application?
答案 1 :(得分:2)
首先,您可以在64位代码中使用push
和pop
,而不是使用32位寄存器。如果您push
和pop
64位寄存器,它将正常工作。在大多数情况下,您可以在64位代码中使用32位寄存器,而不是push
和pop
。可能还有其他例外,但我不知道'em。
64位代码使用不同的系统调用号,将参数放在不同的寄存器中,并使用syscall
代替int 0x80
。但是,旧的int 0x80
接口与旧系统中的旧系统调用号和参数仍然有效。这给你一些“混合”代码,可能不是一个好主意,但它的工作原理。任何人都猜测它将在未来的内核中继续工作多久。你可能最好学习“正确的”64位代码。
但是(还有!)还有更多的32位示例。你可以告诉Nasm -f elf32
(只是-f elf
是别名,但为了清楚起见我会使用“全名”)。如果您正在使用gcc,请告诉它-m32
。如果您直接使用ld,请告诉-m elf_i386
。你有选择,但他们必须相互兼容。
答案 2 :(得分:0)
“-march = i386”怎么样?看到: http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html