装配如何解释标签后带有寄存器的跳转
Posted
技术标签:
【中文标题】装配如何解释标签后带有寄存器的跳转【英文标题】:Assembly how to interpret a jump with register after label 【发布时间】:2016-02-14 16:02:01 【问题描述】:jmp *.L4 (,%rdx,8)
我正在处理一项将其作为无条件跳转之一的作业。 我的问题是:
-
rdx * 8 如何影响跳转?
.L4 之前的 * 有什么区别?
【问题讨论】:
【参考方案1】:这只是通过表格的间接跳转。如您所愿,.L4(,%rdx,8)
是一个内存地址,其值为.L4 + rdx * 8
。在 64 位模式中,指针是 8 个字节,因此是比例因子。 rdx
只是表中条目的索引。
*
除了消除汇编器警告之外没有任何区别 :) 您应该使用*
进行间接跳转,但是当汇编器能够弄清楚时,它只会发出警告. (,%rdx,8)
表明这是一个间接跳转。如果您有jmp *.L4
,则需要*
将其与jmp .L4
区分开来。前者是通过.L4
处的指针间接跳转,后者只是直接跳转到.L4
。
【讨论】:
感谢您的回答。我现在的问题是如何计算 .L4 + rdx * 8?我很困惑,因为 .L4 是一个标签,添加标签如何工作?我还应该补充一点,.L4 包含的所有内容都是一些(.quad .L2)指令(L2-L7)。我怎么知道间接跳转到哪个标签? 正如我所说,rdx
是索引。只有知道rdx
中的值,才能知道它所在的标签。如果rdx
是0
,它将转到第一个标签,如果是5
,它将转到第六个标签,依此类推。
@skob002 : 所有标签都有地址。以上是关于装配如何解释标签后带有寄存器的跳转的主要内容,如果未能解决你的问题,请参考以下文章