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