GDB чтение сборки x86 инструкции в неправильном порядке - PullRequest
0 голосов
/ 17 марта 2020

Я использую команду

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. Почему это происходит?

...