我正在使用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