Ошибка при попытке запустить файл .asm в NASM на Ubuntu
Я использую 64-разрядный ubuntu и пытаюсь запустить файл .asm на NASM. Но он возвращает эту ошибку, когда я пытаюсь запустить следующий код. То, что я пытаюсь сделать, - это создать исполняемый файл путем компиляции (или сборки) объектного файла из источника
$ nasm -f elf hello.asm
, а затем после создания файла hello.o
создает сам исполняемый файл из файла объекта, вызывая компоновщик
$ ld -s -o hello hello.o
Это, наконец, создаст приветственный исполняемый файл.
Я следую этому руководству 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
Ответы
Ответ 1
Похоже, что это может быть простое несоответствие между тем, что создается 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
перестает жаловаться на входной файл.
Ответ 2
Вам нужно сообщить компоновщику, чтобы создать выходной файл i386, поскольку вы пишете сборку i386:
ld -m elf_i386 -s -o hello hello.o
Ответ 3
Как скомпилировать, связать и запустить приложение nasm на 64-битной версии Ubuntu.
Установить 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 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/С++ в сборку"
Перспектива:. Сегодня, когда все люди пытаются срывать и избавляться от общедоступных вычислений для широкой общественности, необходимо, чтобы мы обучали новых учеников концепциям построения общей цели с помощью основных принципов, вверх по голым металлам, а затем, наконец, ассемблеров и языков программирования.
Как помогает обучение в программировании?
99% компьютерных программ там в 10-100 раз медленнее, чем они могли бы оптимизировать только потому, что программисты не знают, какие задержки навязываются им своим любимым компилятором или интерпретатором высокого уровня.
Полное понимание полного стека здесь означает, что вы можете принуждать свои программы к тому же желаемому имуществу, только принимая наносекунды, чтобы выполнить эту работу. Время == деньги. Таким образом, это знание о том, как избежать всего, что занимает больше нескольких наносекунд, чтобы сэкономить время и, следовательно, деньги.
https://softwareengineering.stackexchange.com/info/156722/how-does-learning-assembly-aid-in-programming