gpt4 book ai didi

assembly - 为什么我在 AT&T 汇编中尝试使用 `*...(%rip)` 进行 RIP 相关直接跳转时会得到一个奇怪的长操作码?

转载 作者:行者123 更新时间:2023-12-02 15:43:55 28 4
gpt4 key购买 nike

问题是我不能强制 gnu asjmp 解释为 shortnear,它不断解释它作为 far

例如,下面的代码会导致segfault:

int main() {
asm volatile (
// ".intel_syntax noprefix\n\t"
// "jmp lbl%=\n\t"
// "lbl%=:\n\t"
"jmp *lbl%=(%%rip)\n\t"
"lbl%=:\n\t"
// ".att_syntax\n\t"
: : : );
return 0;
}

切换到注释的 .intel_syntax 变体,它运行得非常好。

唯一不同的是

jmp lbl%=intel 中变为 eb 00

同时

jmp *lbl%=(%%rip)att 变成 ff 25 00 00 00 00

如何在 .att_syntax 的情况下强制将其解释为 short jump

最佳答案

jmp *lbl 执行间接 跳转 -- 从内存中加载地址 lbl: 并跳转到该地址。在这种情况下,它采用此(函数结尾)后面的 8 个(代码)字节并将其视为要跳转到的地址,从而导致段错误。

对于简单的 PC 相对跳转,您只需要 jmp lbl -- att 语法与此处的 intel 语法相同。不需要 %rip 任何东西,因为所有直接跳转都是与 PC 相关的。

关于assembly - 为什么我在 AT&T 汇编中尝试使用 `*...(%rip)` 进行 RIP 相关直接跳转时会得到一个奇怪的长操作码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75023520/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com