我正在使用ubuntu 64位并尝试在NASM上运行.asm文件。但是当我尝试运行下面的代码时它会返回这个错误。什么即时试图做的是从源 $ nasm -f elf hello.asm
编译(或组装)目标文件生成可执行文件,然后通过调用连接尝试在Ubuntu上的NASM上运行.asm文件时出错
$ ld -s -o hello hello.o
这创造hello.o
从对象文件生成可执行文件本身的文件后,将最终构建hello可执行文件。
我下面这个教程http://www.faqs.org/docs/Linux-HOWTO/Assembly-HOWTO.html
错误:输入文件`hello.o”
i386架构与i386的不兼容:X86-64输出
代码:
section .data ;section declaration
msg db "Hello, world!",0xa ;our dear string
len equ $ - msg ;length of our dear string
section .text ;section declaration
;we must export the entry point to the ELF linker or
global _start ;loader. They conventionally recognize _start as their
;entry point. Use ld -e foo to override the default.
_start:
;write our string to stdout
mov edx,len ;third argument: message length
mov ecx,msg ;second argument: pointer to message to write
mov ebx,1 ;first argument: file handle (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
;and exit
mov ebx,0 ;first syscall argument: exit code
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
@psyhclo:这是否对你的工作? – 2010-11-23 03:37:17
这不是真正的方法,因为OP写入的程序集也必须被修改(例如,在系统之前需要清除`%rax`,`%rbx`等的高32位呼叫)。 – caf 2010-11-23 07:16:44
是的@caf,你可能是对的。我自己,我更喜欢改变代码的方法,因为我运行64位,但我可以看到创建一个32位可执行文件将在某些情况下更可取。您的答案可能提供了尽可能少的努力来获取工作,所以这可能是一个教程的最佳途径。所以+1。 – paxdiablo 2010-11-23 07:44:42