嗨,我刚刚开始学习汇编,我一直在查看一些代码,我知道jmp函数是一个无条件跳转,但我不确定如何判断这个jmp跳转到哪里。
jmp *0x804a1a0(,%eax,4)
我知道“(,%eax,4)”部分表示存储在eax * 4中的值,并且它将涉及将其添加到其他内容以获取它将跳转到的位置的最终值,但我不知道如何处理* 0x804a1a0部分中的“*” 这是否意味着存储在内存地址“0x804a1a0”+ eax * 4中的值(并且十六进制中的值是我应跳到的点)?
答案 0 :(得分:1)
这只是AT& T组装中的符号问题。 见 - https://sourceware.org/binutils/docs/as/i386_002dVariations.html
AT& T绝对值(与PC相对)跳转/调用操作数以“*”为前缀;它们在英特尔语法中没有限制。
所以你的计算是正确的,跳转目标存储在[0x804a1a0 + eax * 4]中,这很可能是一个从0x804a1a0开始的跳转表,编译器使用eax作为索引。