装配如何解释标签后带有寄存器的跳转

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 中的值,才能知道它所在的标签。如果rdx0,它将转到第一个标签,如果是5,它将转到第六个标签,依此类推。 @skob002 : 所有标签都有地址。

以上是关于装配如何解释标签后带有寄存器的跳转的主要内容,如果未能解决你的问题,请参考以下文章

arm汇编指令

MOVSX装配说明如何工作?

FreeRtos学习笔记(10)任务切换原理刨析

arm 中b 与bne的区别?

(转)UCOSII源代码剖析

a标签无onclick,href="Javascript:;"如何实现的跳转