2010-11-23 76 views
21

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

回答

29

這看起來可能是一個簡單的mism什麼是由nasm產生什麼ld正在努力使之間ATCH:

i386 architecture of input file 'hello.o' is incompatible with i386:x86-64 output 

換句話說,nasm已經產生了32位的目標文件hello.old要採取,使64位可執行文件。

nasm -hf命令應該給你可用的輸出格式:

valid output formats for -f are (`*' denotes default): 
    * bin  flat-form binary files (e.g. DOS .COM, .SYS) 
    ith  Intel hex 
    srec  Motorola S-records 
    aout  Linux a.out object files 
    aoutb  NetBSD/FreeBSD a.out object files 
    coff  COFF (i386) object files (e.g. DJGPP for DOS) 
    elf32  ELF32 (i386) object files (e.g. Linux) 
    elf  ELF (short name for ELF32) 
    elf64  ELF64 (x86_64) object files (e.g. Linux) 
    as86  Linux as86 (bin86 version 0.3) object files 
    obj  MS-DOS 16-bit/32-bit OMF object files 
    win32  Microsoft Win32 (i386) object files 
    win64  Microsoft Win64 (x86-64) object files 
    rdf  Relocatable Dynamic Object File Format v2.0 
    ieee  IEEE-695 (LADsoft variant) object file format 
    macho32 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files 
    macho  MACHO (short name for MACHO32) 
    macho64 NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files 
    dbg  Trace of all info passed to output stage 

我看到你的鏈接教程要求你運行:

nasm -f elf hello.asm 

嘗試使用:

nasm -f elf64 hello.asm 

相反,你可能會發現ld停止抱怨輸入文件。

+0

@psyhclo:這是否對你的工作? – 2010-11-23 03:37:17

+0

這不是真正的方法,因爲OP寫入的程序集也必須被修改(例如,在系統之前需要清除`%rax`,`%rbx`等的高32位呼叫)。 – caf 2010-11-23 07:16:44

+0

是的@caf,你可能是對的。我自己,我更喜歡改變代碼的方法,因爲我運行64位,但我可以看到創建一個32位可執行文件將在某些情況下更可取。您的答案可能提供了儘可能少的努力來獲取工作,所以這可能是一個教程的最佳途徑。所以+1。 – paxdiablo 2010-11-23 07:44:42

9

你需要告訴鏈接器產生I386的輸出文件,因爲你寫的i386裝配:

ld -m elf_i386 -s -o hello hello.o 
3

如何編譯,鏈接,並運行在Ubuntu 64位A NASM應用。

安裝NASM:

sudo apt-get install nasm 

保存文件名爲hello.asm文件:

section .data 
    hello:  db 'Hello world!',10 ; 'Hello world!' plus a linefeed character 
    helloLen: equ $-hello    ; Length of the 'Hello world!' string 
            ; (I'll explain soon) 

section .text 
    global _start 

_start: 
    mov eax,4   ; The system call for write (sys_write) 
    mov ebx,1   ; File descriptor 1 - standard output 
    mov ecx,hello  ; Put the offset of hello in ecx 
    mov edx,helloLen  ; helloLen is a constant, so we don't need to say 
         ; mov edx,[helloLen] to get it's actual value 
    int 80h    ; Call the kernel 

    mov eax,1   ; The system call for exit (sys_exit) 
    mov ebx,0   ; Exit with return code of 0 (no error) 
    int 80h 

編譯:

nasm -f elf64 hello.asm 

鏈接它:

ld -s -o hello hello.o 

運行它

[email protected]:~$ ./hello 
Hello world! 

它的工作原理!現在怎麼辦?請求您最喜愛的編譯器生成彙編代碼,該彙編代碼通常會被轉換爲機器代碼。 Google搜索:「將php/java/python/C++程序轉換爲程序集」

Perspective:今天所有的人都在試圖拆卸並擺脫普通公衆的通用計算,所以我們必須教新的學生將從如何從核心原理,到裸機,然後是最終的彙編程序和編程語言,來構建通用圖靈機的概念。

學習裝配如何幫助編程? 99%的計算機程序比他們可以優化的慢10到100倍,只是因爲程序員不知道他們最喜歡的高級編譯器或解釋器強加給他們什麼延遲。

對這裏的完整堆棧的透徹理解意味着您可以強制您的程序擁有令人垂涎的財產,只需花費納秒就能完成手頭的工作。時間==錢。因此,如何避免花費超過幾納秒的時間來完成任何事情的知識可以節省時間,從而節省資金。

https://softwareengineering.stackexchange.com/questions/156722/how-does-learning-assembly-aid-in-programming

相關問題