gpt4 book ai didi

assembly - 如何调用远 (x86) 到给定的 32 位地址?

转载 作者:行者123 更新时间:2023-12-04 21:00:53 25 4
gpt4 key购买 nike

好的,我需要对 PCI BIOS 服务目录(32 位模式)执行 CALL FAR 以验证 PCI BIOS 是否存在。

注意:我正在为我们正在开发的一个简单操作系统开发一个简单的磁盘驱动程序。我知道这是非常具体的,但我将从内核代码中完成所有这些。

假设我已经找到了相关地址。对给定地址执行远调用的正确汇编语言是什么?有人可以发布一些对给定 32 位地址进行远调用的汇编代码吗?到目前为止,我看到的示例的语法令人困惑。

谢谢!

编辑:在我的特定情况下,我已经找到了 PCI BIOS 服务目录,它为我提供了物理地址(32 位)。鉴于这个 32 位地址,我需要什么类型的远程调用?例如,我在英特尔手册中读到远调用可以更改任务,而不能更改任务。我怎么知道我必须做什么才能调用这个 PCI BIOS 服务目录物理地址?

更新:

这是我发现的一些让我感到困惑的代码(内联):


asm("lcall (%%edi)"
: "=a" (return_code),
"=b" (address),
"=c" (length),
"=d" (entry)
: "0" (service),
"1" (0),
"D" (&bios32_indirect));




我在这个源文件中发现: http://www.pell.portland.or.us/~orc/Code/Archive/linux-1.2.13/arch/i386/kernel/bios32.c

我想我想做的就是在实际汇编中相当于上面的内联。

最佳答案

从手册:

to make a asm call use the below format

asm( command1 %0
command2
:output registers with there mapping to variable
:input registers with mapping.
);

example
asm ("movl %1, %%ebx;"
"movl %%ebx, %0;"
: "=r" ( val )
: "r" ( no )
: "%ebx" // clobbered register
);

here %1 is input variable %0 is output.

制作 lcall您需要段和实际的 32 位地址:
bios32_indirect.address = directoy_address;
uint32 kernelcodesegment = 0;
asm ("movl %%cs, %0;"
: "=r" (kernelcodesegment)
:);
bios32_indirect.segment = kernelcodesegment;

关于assembly - 如何调用远 (x86) 到给定的 32 位地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/809696/

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