ASM中的内存位置寻址

时间:2015-03-13 22:00:48

标签: assembly gdb x86-64 breakpoints

我试图编写自修改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按照我的预期进行比较,没有发生跳转。但是,0x11 cmp设置了OF标志,而不是CF并执行了jae

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

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

编辑: 当我尝试

mov bl, byte [rax]

bl获取0xcc

这对我没有意义。 gdb不会在0xcc

附近的任何地方报告[rax]的任何值

1 个答案:

答案 0 :(得分:4)

0xccint3的机器代码,它是软件断点中断。 gdb将它放在断点处的代码中,以便控制回来。对于自己阅读的代码,它并不能很好地发挥作用。请改用hbreak命令来设置不需要修改代码的硬件断点。

相关问题