ARM64-GNU汇编程序:使用NOP填充到下一个标签

问题描述 投票:0回答:1

对不起,我不知道如何正确地表达这个问题。但是我将举一个小例子来尝试。我正在GAS中搜索指令,以将特定数量的填充指令(NOP)添加到下一个标签。以下示例摘录了AArch64体系结构的向量表。处理程序的每个条目应为32条指令(128字节)长。

我的目标:

_vec_tbl_cur_sp0:
_vec_tbl_cur_sp0_syn:
    mov x0, #0x0
    bl _vec_handler_syn
    eret
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
_vec_tbl_cur_sp0_irq:

[我在这里,要求GAS在ERET指令后向下一个标签_vec_tbl_cur_sp0_irq填充正确数量的NOP。

GAS中是否有指令或宏可以执行此操作?

arm64 gas
1个回答
0
投票

我已经找到了解决方案。必需的指令为。balgin

。balign [wl] abs-expr,abs-expr,abs-expr

将位置计数器(在当前小节中)填充到特定位置 存储边界。第一个表达式(必须是绝对的)是 对齐请求(以字节为单位)。例如`.balign 8'将 位置计数器,直到它是8的倍数。 已经是8的倍数,无需更改。

第二个表达式(也是绝对的)将填充值设置为 存储在填充字节中。它(和逗号)可以省略。如果它 如果省略,则填充字节通常为零。但是,在某些情况下 系统,如果该部分被标记为包含代码和填充 省略值,该空间填充有无操作指令。

第三个表达式也是绝对的,也是可选的。如果是 当前,它是应跳过的最大字节数 此对齐指令。如果需要对齐 跳过比指定的最大字节数更多的字节,则对齐方式为 根本没有做。您可以省略填充值(第二个参数) 完全通过在所需的对齐方式之后使用两个逗号即可;这个 如果您想用无操作填充对齐方式会很有用 适当的说明。

。balignw和.balignl指令是.balign的变体 指示。 .balignw指令将填充模式视为两个 字节字值。 .balignl指令将填充模式视为 四字节长字值。例如,.balignw 4,0x368d将与 4的倍数。如果跳过两个字节,则将它们填充为 值0x368d(字节的确切位置取决于 处理器的字节序)。如果跳过1或3个字节,则填充值 未定义。

[C0的引用]

以下内容除外:

GAS manual

反汇编的二进制文件:

_vec_tbl_s:
_vec_tbl_cur_sp0:
_vec_tbl_cur_sp0_syn:
    mov x0, #0x0
    bl _vec_handler_syn
    eret
.balign 128
_vec_tbl_cur_sp0_irq:
    mov x0, #0x0
    bl _vec_handler_irq
    eret
.balign 128
_vec_tbl_cur_sp0_fiq:
    mov x0, #0x0
    bl _vec_handler_fiq
    eret
.balign 128
_vec_tbl_cur_sp0_err:
    mov x0, #0x0
    bl _vec_handler_err
    eret
.balign 128

抱歉,问得太快了。

© www.soinside.com 2019 - 2024. All rights reserved.