Assembly gdb以错误的顺序读取程序集x86指令

Assembly gdb以错误的顺序读取程序集x86指令,assembly,x86,gdb,Assembly,X86,Gdb,我在使用命令 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 cm

我在使用命令

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时,在程序开始之前设置断点并多次使用“步骤”a,绿色箭头(表示下一条指令)只是在行之间来回跳跃

mov rax, 0
和线

inc rax
这不是我所期望的,因为代码中没有返回到“mov-rax,0”命令的地方,所以我不知道它怎么可能是开始之后的下一条指令

奇怪的是,如果我在开头添加一条完全冗余(我认为)的指令“movr8,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
代码的工作原理与我预期的一样,绿色箭头在for循环中移动。
为什么会发生这种情况?

听起来YASM正在生成错误的调试信息,或者DDD有问题。你试过NASM吗?或者更重要的是,您是否尝试过反汇编模式?调试asm时,我从不使用源代码视图,只使用反汇编视图(
layout reg
,在终端窗口中的普通GDB中,虽然有点笨重,但已经足够好了,我没有费心寻找更好的GUI)。可能是一个错误造成的。@PeterCordes我试图用nasm组装,我认为它使用了不同的调试信息。当我在ddd或gdb中使用“step”时,用nasm组装并与ld链接的代码分三步完成,只需一步即可完成。我在gdb中键入layout reg,它返回“在抛出'gdb_exception_RETURN_MASK_ERROR'实例后终止调用”。使用
stepi
(缩写
si
)按指令分步执行,这样源代码行对分步不重要,仅适用于在源代码中显示当前位置的调试器。@Don'tDownVote我认为您无法修复此错误。正如Peter Cordes所说,很可能是错误地生成了调试信息。作为一个快速的创可贴,简单地记住实际执行的指令是调试器所说的指令。