Имея это в nasm:
section .data
cod: db '0123456789ABCDEF'
section .text
global _start
_start:
nop
mov rax, 0x1122334455667788
mov rdi, 1
mov rdx, 1
mov rcx, 64
.loop:
push rax
sub rcx, 4
sar rax, cl
and rax, 0xf
lea rsi, [cod + rax]
mov rax, 1
push rcx
syscall
pop rcx
pop rax
test rcx, rcx
jnz .loop
mov rax, 60
xor rdi, rdi
syscall
В in gdb: disas _start.loop
дает: Attempt to extract a component of a value that is not a structure.
Как я могу отменить l oop в gdb?
PS: Я также хотел бы знать, что подразумевается в gdb как структура. Я полагаю, это не имеет ничего общего с c
структурами, а скорее с функциональными фреймами? Таким образом, GDB может видеть, где функция запускается и как? Так что в моем случае это al oop, а не функция, поэтому он не имеет никаких кадров. Это означает ошибку?
РЕДАКТИРОВАТЬ: я попытался войти в GDB:
(gdb) break *_start+1
Breakpoint 1, 0x0000000000401001 in _start ()
(gdb) n
Single stepping until exit from function _start,
which has no line number information.
И затем выведите 1122334455667788[Inferior 1 (process 6257) exited normally]
НО, я не видел ни одного инструкция от <_start.loop>
l oop, это просто выход из _start. Я не знаю, происходит ли это из-за директивы .loop
nasm или у нее нет «поведения структуры», но как я могу увидеть кусок кода .loop
в gdb перед выходом из _start
?