Este código es realmente simple y tengo una falla de segmentación en mi sistema Linux x86_64. Me está molestando mucho. Recién estoy comenzando con asm, ¡así que tenga paciencia!
Ensamblado con NASM nasm -f elf64 test.asm
vinculado con ld -o test test.o
SECTION .text GLOBAL _start _start: ; print name mov eax,4 ; sys_write mov ebx,1 ; stdout mov ecx,name ; start address of name mov edx,1 ; length int 80H ; syscall ; exit program mov eax,1 ; sys_exit mov ebx,0 ; success int 80H ; sys_call SECTION .data name DB 'R'
Mi máquina: Gentoo x86_64 nomultilib! Compilé mi propio kernel sin emulación IA32. Debería haber dicho que mi sistema es un sistema de 64 bits únicamente. ¿Esto se atribuiría a los errores que estoy recibiendo?
$ uname -a Linux rcepeda 4.4.1-2-ARCH #1 SMP PREEMPT Wed Feb 3 13:12:33 UTC 2016 x86_64 GNU/Linux
use registros de 64 bits y despachador de linux de 64 bits
use syscall (no int 80H).
Gracias Nate y Michael
TABLA SYSCALL de Linux de 32 bits
TABLA SYSCALL de Linux de 64 bits
SECTION .text GLOBAL _start _start: ; print name mov rax,1 ; sys_write mov rdi,1 ; stdout mov rsi,name ; start address of name mov rdx,7 ; length syscall ; exit program mov rax,60 ; sys_exit mov rdi,0 ; success syscall SECTION .data name DB "Rafael",10
.
rafael@rcepeda ~/asm $ ./a.out Rafael
Está ejecutando en modo de 64 bits, pero este es un código de 32 bits. Si desea un código de 64 bits, tendrá que volver a escribirlo.
Debería usar los registros de 64 bits rax, rbx
, etc. Y en Linux de 64 bits, las llamadas al sistema ya no se realizan con int 80h
sino con la nueva instrucción syscall
. Consulte http://cs.lmu.edu/~ray/notes/linuxsyscalls/ para ver un ejemplo (tenga en cuenta que esto usa la sintaxis del ensamblador de AT&T en lugar de Intel).
Alternativamente, puede mantener el mismo código y ensamblarlo y vincularlo en modo de 32 bits, usando nasm -f elf32
y ld -m elf_i386
. Pero luego estás aprendiendo tecnología (relativamente) obsoleta. (Editar: en realidad, parece que la compatibilidad de 32 bits no está habilitada en su sistema en particular, por lo que esto no funcionará para usted).