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

179
Views
¿Cómo solucionar falla de segmentación de ciertas instrucciones de código ensamblador?

Escribí un código de ensamblaje simple como el siguiente:

 .global _start .text _start: call _sum subq $0x8, %rsp popq %rax ret _sum: ret

Para obtener el valor de %rax después de la instrucción 'popq',

Ensamblé ese código usando el comando 'as' y 'ld'. y comencé el depurador de gdb poniendo un punto de interrupción en '_start'

y el resultado viene como a continuación:

 B+> │0x400078 <_start> callq 0x400083 <_sum> │ │0x40007d <_start+5> sub $0x8,%rsp │ │0x400081 <_start+9> pop %rax │ │0x400082 <_start+10> retq │ │0x400083 <_sum> retq

Sin embargo, antes de pasar a la instrucción emergente, aparece un mensaje de error que dice que

Programa recibido señal SIGSEGV, Fallo de segmentación. No se puede acceder a la memoria en la dirección 0x1

(cuando cambié $0x8 a $0x0~$0x7, todo funcionó).

Parece que en la primera etapa, la función de suma podría ser el problema. porque literalmente no hace más que regresar.

Entonces, ¿cómo puedo modificar este código para obtener el valor de %rax después de la instrucción popq?

Gracias.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Creo que probablemente esta pregunta sea un duplicado, pero de todos modos, hay un problema en su código.

 .global _start .text _start: call _sum subq $0x8, %rsp popq %rax ret # <-- return to where? _sum: ret

Un main en C tiene que volver porque _start eventualmente llama a main , pero aquí, estás escribiendo _start directamente. No vuelve a ninguna parte si pones un ret .

En lugar de ret , pon esto en su lugar.

 movl $60, %eax # syscall number for sys_exit movl $0, %edi # or whatever value you want your process # to return with from 0 to 255; # xor %edi, %edi is usually better if you want 0 syscall

Deja un comentario si todavía falla.


Por cierto, asumí que su plataforma es Linux (debido a la sintaxis de AT&T...). Las llamadas al sistema pueden ser diferentes para una plataforma diferente.

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!