assembly 强制JMP rel32

dced5bon  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(168)

如果我做类似这样的事情(虚拟示例):

jmp 1f
1: ret

在愚者/CLANG上,它产生短的相对跳跃,因为标签在附近。
我很好奇,有没有可能不管标签的距离而强制JMP rel32

lsmepo6l

lsmepo6l1#

根据GAS manual、第9.16.8节“跳转指令总是被优化为使用最小可能的位移”。这似乎暗示没有手动的方法来覆盖它。在9.16.6中有一个addr 32指令前缀,但它只在.code16中被允许。我似乎找不到一个选项来控制任何jmp中偏移量的大小“官方”来源。
然而,根据this source,将跳转到的标签标记为全局标签将使jmp指令使用rel32偏移量。我只设法使用clang重现了这种行为,愚者似乎不起作用。此外,我似乎找不到任何更可信的来源为这个行为比提到的15岁存档邮件列表回复,所以我不会确切地称之为“我想它可能会随着clang/llvm-as的一些未来更新而消失。
例如,以下文件test_asm.s

.global main
main:
jmp lab
.global lab
lab: ret

在我的机器上用clang test_asm.s编译会产生:

000000000000111c <main>:
    111c:   e9 00 00 00 00          jmp    1121 <lab>

0000000000001121 <lab>:
    1121:   c3                      ret

同时,在移除.global lab行之后,结果为:

000000000000111c <main>:
    111c:   eb 00                   jmp    111e <lab>

000000000000111e <lab>:
    111e:   c3                      ret

对于一个可靠的(尽管是一个繁琐的)解决方案,您可以始终手动将jmp指令编码为字节,然后使用.byte指令代替jmp <operand>助记符输入它们,如注解中所指出的。

相关问题