林正做着一些功课,疑惑地问:这行代码:
ja 8048448 <switch_prob+0x28>
我明白了一切,除了部分...这是如何修改跳转到8048448?(我相信这是打破语句)如果需要更多代码,请告诉我。谢谢
z31licg01#
<switch_prob+0x28>只是反汇编器用来使地址8048448看起来更有意义的标签+偏移量。
<switch_prob+0x28>
8048448
6tqwzwtp2#
@echristopherson已经正确回答了您的问题:这里有到8048448的条件跳转(ja代表 jump if above)。正如他还提到的,<switch_prob+0x28>只是调试器或反汇编器生成的一个标签,用于引用8048448。这只是为了提高可读性,仅此而已。我在这里的贡献是解释这与标题中提到的跳转表(* IA 32跳转表 *)没有任何关系。使用跳转表,您可以在内存中存储目标地址,并根据所述跳转表执行间接跳转。例如,您可能有:
ja
mov eax,0 jump [jumptable+edx*4] jumptable: dd branch1 dd branch2 // ... branch1: lea edx,[somestring] mov ah,09h int 21h branch2: mov ax,4c00h int 21h
当然,对于这个例子来说,eax的初始值应该是动态的,这样才更有意义。
eax
2条答案
按热度按时间z31licg01#
<switch_prob+0x28>
只是反汇编器用来使地址8048448
看起来更有意义的标签+偏移量。6tqwzwtp2#
@echristopherson已经正确回答了您的问题:这里有到8048448的条件跳转(
ja
代表 jump if above)。正如他还提到的,<switch_prob+0x28>
只是调试器或反汇编器生成的一个标签,用于引用8048448。这只是为了提高可读性,仅此而已。我在这里的贡献是解释这与标题中提到的跳转表(* IA 32跳转表 *)没有任何关系。使用跳转表,您可以在内存中存储目标地址,并根据所述跳转表执行间接跳转。例如,您可能有:
当然,对于这个例子来说,
eax
的初始值应该是动态的,这样才更有意义。