我的系统配置是英特尔®酷睿™2双核CPU E7500 @ 2.93GHz×2以及32位操作系统。我试图运行以下代码。我用了
nasm -f elf64 hello.asm
ld -o hello hello.o
它给我一个错误
ld:i386:输入文件“hello1.o”的x86-64架构与i386输出不兼容
有什么办法可以在32位机器上运行64位代码吗?我真的需要解决方案。
代码:
section .text
global _start
_start:
mov rax,01
mov rdi,01
mov rsi,msg1
mov rdx,len1
syscall
mov rax,660
xor rdx,rdx
syscall
section .data
msg1 db "hello world",0xa
len1 equ $-msg1
答案 0 :(得分:-1)
如果您愿意,可以将代码转换为32位代码(对代码示例很简单):
section .text
global _start
_start:
mov eax,01
mov edi,01
mov esi,msg1
mov edx,len1
int 0x80
mov eax,660
xor edx,edx
int 0x80
section .data
msg1 db "hello world",0xa
len1 equ $-msg1
然后使用以下命令:
nasm -f elf hello.asm
ld -m elf_i386 -s -o hello hello.o
我测试过以确保没有错误,我将系统调用更改为int 0x80。不幸的是,我从未听说过660系统调用。上面的代码不打印' hello world'但它也没有错误(它组装)。
打印字符串linux系统调用是4(在eax中),edx中的长度,ecx中的消息指针,以及stdout是1(ebx)。在系统调用之前,正确退出是eax中的1。
http://asm.sourceforge.net/intro/hello.html在一个地方有一个很好的例子。