assembly - 自修改代码看到 0xCC 字节,但调试器没有显示它?

标签 assembly gdb x86-64 breakpoints self-modifying

我正在尝试编写自修改asm代码。

在某些时候,我尝试以下操作:(NASM 编译器)

start_of_code:
; ... snip ...

cmp byte [rax], 0x66
jae above_label
  add byte[rax], 0x20
; ... snip ...

above_label:
inc rax
loop start_of_code

gdb 在开始时显示以下值 x/8xb $rax :

0x12 0x12 0x11 0x20 0x18 0xfe 0x83 0x9b

前两次迭代正常,0x12 按我的预期进行比较,并且没有发生跳转。但是,对于 0x11cmp 设置 OF 标志,而不是 CFjae已执行

目前我有两个猜测,要么 gdb 没有首先报告正确的内存位置,0x9b 实际上是正在比较的地址,要么是其他地方。这似乎不太可能,因为添加似乎按照我的预期工作。

或者这可能是对齐问题。在 cmp 之前添加 NOP 指令似乎确实会以某种方式影响结果。我真的不知道为什么

编辑: 当我尝试时

mov bl, byte [rax]

bl 获取 0xcc

这对我来说没有意义。 gdb 不会报告任何靠近 [rax]

0xcc

最佳答案

0xccint3 的机器码,它是软件断点中断。 gdb 将其放入代码的断点处,以便它重新获得控制权。它不能很好地处理自读代码。请改用 hbreak 命令来设置不需要修改代码的硬件断点。

关于assembly - 自修改代码看到 0xCC 字节,但调试器没有显示它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29042713/

相关文章:

linux - 访问位置独立代码中的 .data 部分

c - 如何将 C 中带有数组的 while 循环转换为 ARM

c++ - 访问旧的堆栈帧

python - 包含双数组的 GDB pretty-print 自定义类型

c - 为什么从我的 c 程序打印的变量值与 gdb 打印的变量值不同?

c - 评估 sizeof 导致性能改进 C

64 位架构中的汇编寄存器

assembly - 与汇编代码的 .L2 标签关联的代码是否在此段中按程序调用?

linux - 我如何开始学习 asm(gas)?

assembly - 在 ARM Cortex A8 上的汇编中对 NEON 向量/寄存器的所有元素/ channel (成对?)进行异或