gpt4 book ai didi

assembly - gcc 内联汇编中的 ljmp 语法

转载 作者:行者123 更新时间:2023-12-02 21:54:10 24 4
gpt4 key购买 nike

我正在考虑使用远跳转来设置代码段(CS)寄存器。了解我为什么要这样做以及为什么我要处理分割需要一段时间,所以请耐心等待,并将其视为一项学术练习。我似乎无法正确理解语法。

错误:后缀或操作数对于“ljmp”无效

我知道将 cs 放入另一个寄存器是愚蠢的,但我想我应该尝试一下,因为使用 %0 不起作用(ax 注册也不起作用)。

我正在查看一些编译良好的代码,这让我发疯,因为我认为 ljmp 会是相同的:__asm volatile ("lcall $0x8, $far_call");

我当然欢迎其他影响 CS 寄存器的黑客方式。

void set_cs(u16 cs) {
__asm__ volatile (
"mov %0, %%ax \n\t"
"ljmp %%ax, $fake_label \n\t"
"fake_label: \n\t"
:
: "r" (cs)
: "ax"
);
}

最佳答案

看起来 ljmp 需要常量才能工作,虽然这会生成更多代码并且显然不是特别安全,但这似乎是有效的,因为当我输入不是当前 cs 值的值时,应用程序崩溃。它使用立即值来代替:

#define set_cs( cs ) asm volatile ( "ljmp %0, $fake_label\n\t fake_label:\n\t"::"i"(cs) )

它并不像我想象的那样优雅,并且完全取决于您想要做什么。如果您将其编译为在 linux/windows 下运行,我无法想象它会有用,甚至无法工作。

关于assembly - gcc 内联汇编中的 ljmp 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1685654/

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