我正在查看x86 asm,我想尝试阅读它并识别我的cpp代码和OPTIMIZE中的错误。但是asm在地址计算指令中有很多开销。我似乎无法找到一种方法来识别那些正在执行其他任务的人正在计算地址的方法。例如,add可用于计算稍后insn中使用的mem地址或执行我的代码中可用的常规添加操作。
有没有办法轻松完成,就像他们使用固定寄存器进行地址计算一样?或者我是否必须从头到尾追踪代码?
编辑:似乎没有明确的方法来识别它们。但假设只有mov,add,sub和lea是地址计算指令,这是公平的吗?或者x86有什么更复杂的东西吗?
感谢
答案 0 :(得分:3)
不,不是真的。大多数寄存器都是通用的,用于各种计算。有些编译器甚至足够聪明,可以使用LEA等地址计算指令来计算其他内容。
您可能必须找到将变量加载到寄存器的位置,然后从那里开始。
答案 1 :(得分:2)
您可以从头到尾跟踪代码。例如,存在将寄存器读取或写入存储器的指令(例如,使用Microsoft语法的mov eax, [ebx]
)。当您看到这样的指令时,您可以确定哪个寄存器用作地址(在我的示例中为ebx
),然后返回代码并查看寄存器的计算方式。
谨防&#34;跳跃&#34;说明 - 如果你的代码有很多条件执行,可能很难再回到代码中,并且可能更容易从头到尾跟踪代码&#34;。< / p>