尝试在Ubuntu上运行NASM上的.asm文件时出错(64位代码到32位机器和32位操作系统上)

时间:2016-04-11 19:50:48

标签: assembly

我的系统配置是英特尔®酷睿™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

1 个答案:

答案 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在一个地方有一个很好的例子。