为什么在执行mov eax,0FFFFFFFFh后,寄存器eax在调试器中显示为0xccffffff?

5

我的初学者书籍 "Assembly Language Step-by-Step" 上的指令是 mov eax,0FFFFFFFFh。在将程序新加载到调试器 'Insight' 中后,eax 的值开始为 0x0,但在执行 mov eax, 0FFFFFFFFh 指令后 ,'Insight' 窗口中的寄存器显示 eax 变成了 0xccffffff。

我进行了一个测试,指令是 mov eax,02Dh ,结果变成了 0xcc00002d。

我查阅了关于0xcc的信息,并发现了关于INT3的内容:https://en.wikipedia.org/wiki/INT_(x86_instruction)#INT3,但我的理解已经到达了极限。我只知道INT3的操作码是0xcc,并且与调试有关。我正在进行调试,但是这样处理0xFFFFFFFF的前两个字节0xFFH可能会导致问题,我希望NASM不会允许这样的情况发生。

我不确定是因为我正在运行x86-64还是与我的处理器有关。我的操作系统是Linux。

sandbox.asm

section .data
section .text

  global _start

_start:
    nop

    mov eax,0FFFFFFFFh
    mov ebx,02Dh
    ; !Reader - Important!
    ; !Examining values from this point! 

    ; Not reading values past this point
    dec ebx
    inc eax

    nop

section .bss

makefile

sandbox: sandbox.o
    ld -o sandbox sandbox.o -melf_i386

sandbox.o: sandbox.asm
    nasm -f elf -g -F stabs sandbox.asm

期望结果

按照本书的指示,执行该代码后,eax和ebx的显示应为:

eax     0xffffffff
ebx     0x2d

实际结果

eax     0xccffffff
ebx     0x2d
1个回答

5
您的调试器已损坏,或者可能是NASM创建的调试信息出现了问题。 (也许尝试省略NASM中的-g -F stabs。您可以使用反汇编视图来调试asm,而不是源代码行。)
调试器通过将指令的第一个字节重写为0xcc字节(int3指令)来设置断点。但显然这正在发生在mov r32,imm32中“mov”指令的最后一个字节上(little-endian立即数的高字节)。
(单步执行使用与断点不同的机制;在Linux下,调试器使用的ptrace系统调用具有特殊的支持,可以单步执行而无需在每个指令上创建和移除断点。)
显然自2009年以来没有更新过,因此不可能修复。不要使用损坏的工具。但标签弹出窗口显示它只是一个GDB前端,所以我不知道它如何引入这样的低级错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接