如果我做类似这样的事情(虚拟示例):
jmp 1f 1: ret
在愚者/CLANG上,它产生短的相对跳跃,因为标签在附近。我很好奇,有没有可能不管标签的距离而强制JMP rel32?
JMP rel32
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:
.code16
jmp
rel32
test_asm.s
.global main main: jmp lab .global lab lab: ret
在我的机器上用clang test_asm.s编译会产生:
clang test_asm.s
000000000000111c <main>: 111c: e9 00 00 00 00 jmp 1121 <lab> 0000000000001121 <lab>: 1121: c3 ret
同时,在移除.global lab行之后,结果为:
.global lab
000000000000111c <main>: 111c: eb 00 jmp 111e <lab> 000000000000111e <lab>: 111e: c3 ret
对于一个可靠的(尽管是一个繁琐的)解决方案,您可以始终手动将jmp指令编码为字节,然后使用.byte指令代替jmp <operand>助记符输入它们,如注解中所指出的。
.byte
jmp <operand>
1条答案
按热度按时间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
:在我的机器上用
clang test_asm.s
编译会产生:同时,在移除
.global lab
行之后,结果为:对于一个可靠的(尽管是一个繁琐的)解决方案,您可以始终手动将
jmp
指令编码为字节,然后使用.byte
指令代替jmp <operand>
助记符输入它们,如注解中所指出的。