如何在c英特尔程序集的函数中创建私有标签?

时间:2019-02-11 18:56:24

标签: assembly x86 64-bit

如何在装配函数中创建私有标签,这些私有标签只能在定义函数中使用,而不能在其他函数中使用,例如跳目标?

在下面的示例中,我不希望.private_label可以到达_main。但是,使用clang -S -masm=intel example.s -o example编译就可以了。

我以前在NASM中看到过此功能,但是现在我决定切换到Clang。

奖金:我可以在哪里亲自查询这些信息?我已经进行了一些研究。

.intel_syntax noprefix
.globl _main

.text

_f:
push rbp 
mov rbp, rsp
.private_label:
mov rsp, rbp
pop rbp
ret

_main:
push rbp 
mov rbp, rsp
jmp .private_label
mov rax, 0x5
mov rsp, rbp
pop rbp
ret 

1 个答案:

答案 0 :(得分:3)

未标记为.global的标签无法从其他模块访问。以.L开头的标签也不会输入到符号表中。

无法通过同一模块使标签不可访问,但是使用带编号的标签可以获得类似的效果。 10个标签09只能通过语法0b来访问“上一个标签0”,而使用0f来访问“下一个标签{{ 1}}。”如果您用两个相同编号的标签包围标签,则无法从外部引用它。例如:

0

请注意,没有什么可以阻止其他人仅仅猜测标签的地址最终被分配并跳转到那里。我不确定您要实现什么。

有关更多文档,请参阅GNU汇编程序手册。 LLVM发行版随附的汇编程序支持此功能的一部分。请注意,如果您看上去像是在macOS上编程,则所使用的汇编程序可能是macOS汇编程序。有关此工具的详细信息,请参考手册页 as (1)。