使用arm64,可以使用 adr 指令将附近地址的文字加载到寄存器中。根据《 ARM-V8体系结构参考手册》中的 adr 指令:
ADR <Xd>, <label> Address of label at a PC-relative offset
可以引用+/- 1MB以内的标签。有一个设置为31位的页面版本 adrp ,用于构造更大的偏移量。
我不明白的是为什么ARM64的gcc 8.2和clang 7.0都没有使用 adr 而不是使用 adrp 和 add 对以获取附近的变量。优化级别不会改变这一点。
int write(int fd, const void *buf, int count);
void xyz(void)
{
write(2, "abc", 4);
}
xyz(): // @xyz()
adrp x1, .L.str
add x1, x1, :lo12:.L.str
orr w0, wzr, #0x2
orr w2, wzr, #0x4
b write(int, void const*, int)
.L.str:
.asciz "abc"
他们是否可以不认为此字符串文字在+/- 1MB以内?有编译器属性/开关告诉他们这一点吗?
答案 0 :(得分:1)
GCC将使用-mcmodel=tiny
生成此类代码:
.global xyz
.type xyz, %function
xyz:
.LFB0:
.cfi_startproc
mov w2, 4
adr x1, .LC0
mov w0, 2
b write
.cfi_endproc
.LFE0:
.size xyz, .-xyz
.section .rodata.str1.8,"aMS",@progbits,1
.align 3
.LC0:
.string "abc"