Μετ*_*ετα 5 x86 assembly gdb insight
我的初学者书籍“汇编语言一步一步”中的说明有一行:mov eax,0FFFFFFFFh。在将程序重新加载到调试器“Insight”中后,eax的值从0x0开始,但在行之后mov eax, 0FFFFFFFFh eax变为 0xccffffff,如 Insight 中的寄存器窗口所述。
作为测试,我尝试过mov eax,02Dh,它变成了 0xcc00002d。
我研究了 0xcc 并找到了有关 INT3 的信息:https ://en.wikipedia.org/wiki/INT_(x86_instruction)#INT3 ,其中达到了我的理解极限。我所了解的是 INT3 的操作码是 0xCC,它与调试有关。我正在调试,但这对 0xFFFFFFFF 的前两个 0xFFH 是不礼貌的,因此我肯定希望 NASM 不会允许这样。
不确定是不是因为我正在运行 x86-64 或特定于我的处理器的东西。我的操作系统是 Linux。
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
Run Code Online (Sandbox Code Playgroud)
sandbox: sandbox.o
ld -o sandbox sandbox.o -melf_i386
sandbox.o: sandbox.asm
nasm -f elf -g -F stabs sandbox.asm
Run Code Online (Sandbox Code Playgroud)
按照这本书,在执行上述代码后,本书对 eax 和 ebx 的显示有这些:
eax 0xffffffff
ebx 0x2d
Run Code Online (Sandbox Code Playgroud)
eax 0xccffffff
ebx 0x2d
Run Code Online (Sandbox Code Playgroud)
您的调试器已损坏,或者 NASM 创建的调试信息可能已损坏。(也许可以尝试-g -F stabs从 NASM 中省略。无论如何您都可以使用反汇编视图来调试 asm,而不是源代码行。)
调试器通过用一个0xcc字节(和 int3 指令)重写指令的第一个字节来设置断点。但显然这发生在mov指令的最后一个字节(小端立即数 in 的高字节mov r32, imm32)。
(单步使用与断点不同的机制;在 Linux 下ptrace,调试器使用的系统调用特别支持单步,无需在每条指令上创建和删除断点。)
显然,洞察力自 2009 年以来一直没有更新,因此不太可能得到修复。不要使用损坏的工具。但是标签弹出窗口说它只是一个 GDB 前端,所以 IDK 如何引入这样的低级错误。
| 归档时间: |
|
| 查看次数: |
366 次 |
| 最近记录: |