Ошибка при попытке запустить файл .asm на NASM в Ubuntu - PullRequest
24 голосов
/ 23 ноября 2010

Я использую 64-битную версию Ubuntu и пытаюсь запустить файл .asm на NASM.Но он возвращает эту ошибку, когда я пытаюсь запустить следующий код.Я пытаюсь создать исполняемый файл, скомпилировав (или собрав) объектный файл из источника $ nasm -f elf hello.asm, а затем после создания файл hello.o сам создает исполняемый файл из объектного файла, вызывая компоновщик

* 1004.*

Это, наконец, создаст привет исполняемый файл.

Я следую этому уроку http://www.faqs.org/docs/Linux-HOWTO/Assembly-HOWTO.html

Ошибка:

i386 архитектура вводаФайл `hello.o 'несовместим с 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

Ответы [ 3 ]

37 голосов
/ 23 ноября 2010

Похоже, это может быть простое несоответствие между тем, что производит nasm, и тем, что ld пытается сделать:

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

Другими словами, nasm произвел 32-битовый объектный файл hello.o и ld хотят взять его и создать 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 перестает жаловаться на входной файл.

12 голосов
/ 23 ноября 2010

Вы должны указать компоновщику создать выходной файл i386, так как вы пишете сборку i386:

ld -m elf_i386 -s -o hello hello.o
4 голосов
/ 06 ноября 2015

Как скомпилировать, связать и запустить приложение nasm в 64-битной Ubuntu.

Установить нос:

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

Запустите его

el@apollo:~$ ./hello
Hello world!

Работает! Что теперь? Запросите, чтобы ваш любимый компилятор генерировал код сборки, который он обычно передавал для преобразования в машинный код. Поиск в Google: "преобразовать программу php / java / python / c ++ в сборку"

Перспектива: Сегодня, когда все люди пытаются разрушить и избавиться от вычислений общего назначения для широкой публики, крайне важно, чтобы мы обучали новых студентов концепциям построения общего назначения. машина от основных принципов, вплоть до чистого металла, затем, наконец, ассемблеры и языки программирования.

Как обучение ассемблеру помогает в программировании? 99% компьютерных программ работают в 10–100 раз медленнее, чем они могли бы быть оптимизированы, потому что программисты не знают, какие задержки им навязывают их любимый компилятор или интерпретатор высокого уровня.

Глубокое понимание полного стека здесь означает, что вы можете заставить свои программы обладать этим желанным свойством, состоящим только в наносекундах, чтобы выполнять работу под рукой. Время == деньги. Таким образом, это знание того, как избегать всего, что занимает больше, чем несколько наносекунд, экономит время и, следовательно, деньги.

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

...