es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comportamiento de assert.

Estoy tratando de entender cómo se comporta assert en caso de una afirmación falsa. Según la documentación, llama a _assertfail y llama a std::abort(). Entonces, quiero saber qué está sucediendo en el código ensamblador de _assertfail:

endbr64
pushq  %r13
movl   %edx, %r13d
movl   $0x5, %edx
pushq  %r12
movq   %rsi, %r12
leaq   0x18467e(%rip), %rsi
pushq  %rbp
movq   %rdi, %rbp
leaq   0x1804f0(%rip), %rdi       ; _libc_intl_domainname
pushq  %rbx
movq   %rcx, %rbx
subq   $0x8, %rsp
callq  0x37980                    ; __dcgettext
movq   %rbx, %r8
movl   %r13d, %ecx
movq   %r12, %rdx
movq   %rax, %rdi
movq   %rbp, %rsi
callq  0x36d70   

¿Qué representan %r13 y %r12 en este código? ¿Dónde está la llamada a std::abort() y qué está sucediendo antes y después de esta llamada?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    %r13 y %r12 son registros de propósito general en la arquitectura x86-64. La llamada de std::abort() se encuentra al final del fragmento de código y es precedida por una llamada a __dcgettext() y seguida por una llamada a __assert_fail(). La llamada a __dcgettext() se utiliza para obtener una versión localizada del mensaje de error y la llamada a __assert_fail() se utiliza para imprimir el mensaje de error y terminar el programa.

Comments are closed.