Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

288
Views
Seg fallo... en hola mundo

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

Solución

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
over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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).

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!