gpt4 book ai didi

assembly - 提供一个使用 Rust 的内联汇编查询 Intel CPU 能力的例子

转载 作者:行者123 更新时间:2023-11-29 07:46:43 27 4
gpt4 key购买 nike

我正在尝试在 Rust 中使用内联汇编。我包含的代码应该查询 Intel CPU 功能,现在我只想在系统调用后获取 ebx 寄存器状态。

使用每晚构建的 Rust 编译器(需要使用 asm! 宏)编译代码。当我运行该程序时,我得到了 ebx 寄存器的随机值和一个段错误。我很确定我的 asm! 宏语法是错误的,但此功能的文档非常薄弱。有人对我可以改进的地方有任何指示吗?

#![feature(asm)]
fn main() {
let result: u32;
unsafe {
asm!("mov eax, 07H;
mov ecx, 0;
cpuid;"
: "={ebx}"(result)
:
: "eax, ebx, ecx, edx"
: "intel"
)
}
println!("ebx from cpuid is {}", result);
}

最佳答案

你可以只复制my old implementation of cpuid如果你觉得迫切需要忽略我的以下建议:

fn cpuid(code: RequestType) -> (u32, u32, u32, u32) {
let res1;
let res2;
let res3;
let res4;

unsafe {
asm!("cpuid"
: // output operands
"={eax}"(res1),
"={ebx}"(res2),
"={ecx}"(res3),
"={edx}"(res4)
: // input operands
"{eax}"(code as u32),
"{ecx}"(0 as u32)
: // clobbers
: // options
);
}

(res1, res2, res3, res4)
}

没有必要将任何东西标记为已破坏,因为所有受影响的寄存器都被标记为输出。还提供了所有输入值。


也就是说,不要编写此代码

  1. 已经写好了。多次:

  2. 编写内联汇编需要夜间编译器并且可能永远不会稳定下来。它实际上仅对极端小众案例有用,例如引导操作系统或嵌入式系统、转储所有寄存器的状态,以及内在函数未涵盖的其他非常低级的细节(还?) .

关于assembly - 提供一个使用 Rust 的内联汇编查询 Intel CPU 能力的例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51851508/

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