Assembly 自修改代码看到一个0xCC字节,但调试器没有';你没有表现出来吗?

Assembly 自修改代码看到一个0xCC字节,但调试器没有';你没有表现出来吗?,assembly,gdb,x86-64,breakpoints,self-modifying,Assembly,Gdb,X86 64,Breakpoints,Self Modifying,我正在尝试编写自我修改的asm代码 在某个时候,我尝试以下方法:(NASM编译器) gdb在开始时显示以下值x/8xb$rax: 0x12 0x12 0x11 0x20 0x18 0xfe 0x83 0x9b 前两次迭代是正常的,0x12按照我的预期进行比较,没有发生跳转。但是,使用0x11时,cmp设置OF标志,而不是CF,并且执行jae 目前我有两种猜测,要么gdb没有首先报告正确的内存位置,要么0x9b实际上是正在比较的地址,要么是其他地方。这似乎不太可能,因为add似乎像我预期的那样工

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

在某个时候,我尝试以下方法:(NASM编译器)

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

0x12 0x12 0x11 0x20 0x18 0xfe 0x83 0x9b
前两次迭代是正常的,
0x12
按照我的预期进行比较,没有发生跳转。但是,使用
0x11
时,
cmp
设置
OF
标志,而不是
CF
,并且执行
jae

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

或者这可能是一个对齐问题。在cmp之前添加NOP指令似乎确实在某种程度上影响了结果。我真的不知道为什么

编辑: 当我尝试

mov bl, byte [rax]
bl
获取
0xcc


这对我来说毫无意义。gdb在
[rax]
0xcc
附近不报告任何
0xcc
值,0xcc是作为软件断点中断的
int3
的机器代码
gdb
在断点处将其放入代码中,这样它就可以重新获得控制权。它不能很好地处理读取自身的代码。改用
hbreak
命令设置一个不需要修改代码的硬件断点。

WOW。我要花很长时间才能弄明白。谢谢!
mov bl, byte [rax]