Я использую команду
yasm -f elf64 -g dwarf2 example.asm
, чтобы собрать мой код, и
ld -g -o example example.o
, чтобы связать его. Затем я отлаживаю свой код с помощью отладчика ddd, который является лишь интерфейсом для gdb. То же самое происходит с использованием GDB.
Это код, который я написал
section .data
EXIT_SUCCESS equ 0
SYS_exit equ 60
section .text
global _start
_start:
mov rax, 0
for:
inc rax
cmp rax, 10
jne for
last:
mov rax, SYS_exit
mov rdi, EXIT_SUCCESS
syscall
Когда я использую ddd или GDB, установите точку останова непосредственно перед запуском программы и несколько раз используйте «шаг», зеленый стрелка (обозначающая следующую инструкцию) просто переходит назад и вперед между строкой
mov rax, 0
и строкой
inc rax
Это не то, что я ожидал, потому что в коде, где вернитесь к команде "mov rax, 0", так что я не вижу, как это может быть следующая инструкция после начала.
Как ни странно, если я добавлю одну полностью избыточную (я думаю) инструкцию "mov r8, 0" в начале, то код будет выглядеть так
section .data
EXIT_SUCCESS equ 0
SYS_exit equ 60
section .text
global _start
_start:
mov rax, 0
mov r8, 0
for:
inc rax
cmp rax, 10
jne for
last:
mov rax, SYS_exit
mov rdi, EXIT_SUCCESS
syscall
Код работает так же, как Я ожидаю, что зеленая стрелка движется внутри для l oop. Почему это происходит?