3

尝试学习 NASM 组装。我有一台带有 Ubuntu 的 64 位机器。最近我决定测试pushpop指令。我这样做:

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 位程序,我该如何测试push和在我的 64 位机器上?pop

4

3 回答 3

3

“-m32”怎么样?而且我认为您需要关心依赖库(例如 libc),请参阅:Use 32bit shared library from 64bit application?

于 2013-09-13T04:50:15.580 回答
2

首先,您可以在 64 位代码中使用push和,但不能使用 32 位寄存器。pop如果你pushpop64 位寄存器,它会工作正常。在大多数情况下,您可以在 64 位代码中使用 32 位寄存器,但不能push使用pop. 可能还有其他例外,但我不知道他们。

64 位代码使用不同的系统调用号,将参数放在不同的寄存器中,syscall使用int 0x80. 但是,旧的int 0x80接口与旧的系统调用号和旧寄存器中的参数仍然有效。这为您提供了一种“混合”代码,可能不是一个好主意,但它确实有效。任何人都在猜测它将在未来的内核中继续工作多长时间。学习“正确”的 64 位代码可能会更好。

但是(仍然!)还有更多的 32 位示例。您可以告诉 Nasm -f elf32(只是-f elf一个别名,但为了清楚起见,我会使用“全名”)。如果您使用 gcc,请告诉它-m32。如果您直接使用 ld,请告诉它-m elf_i386。您确实有选择,但它们必须相互兼容。

于 2013-09-13T10:58:51.150 回答
0

“-march=i386”怎么样?见: http: //gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html

于 2013-09-13T04:08:08.073 回答