在Google Native Client的论文中,作者将a定义nacljmp为以下两条指令:
and $0xffffffe0, %eax # Clears the 5 least significant bits in %eax.
jmp *%eax
Run Code Online (Sandbox Code Playgroud)
首先,我可以看到它们清除了5个最不明显的位,使指令在跳转到之前进行32位对齐.但是,%eax之前的星号是什么意思?我已经搜索了许多关于x86程序集的教程而没有太多运气.
jmp *%eax是AT&T语法jmp eax,这是一种形式jmp r/m32.它将跳转到寄存器中包含的地址eax:
跳转到r/m32中给出的绝对间接地址.
相同类型的跳转指令的另一种形式与Intel语法jmp *(%eax)相对应jmp [eax].它将跳转到寄存器指向的32位存储单元中存储的地址eax.