如何在稳定的 Rust 中为 `"={ecx}"(features) 编写内联汇编?

How do I write inline assembly for `"={ecx}"(features)` in stable Rust?

我有以下内联程序集,它曾经在 Rust 中工作,但似乎对语法进行了一些更改,它在 "={ecx}(features) 处抛出错误并显示消息 expected type。我如何用新的汇编语法重写它?

use std::arch::asm;

let features: u32;
unsafe {
    asm!("mov eax, 1
          cpuid"
         : "={ecx}"(features)
         :
         : "eax"
         : "intel"
    );
}

let support: u32 = (features >> 25) & 1;

试试这个:

use std::arch::asm;

fn main() {
    let features: u32;
    unsafe {
        asm!("mov eax, 1",
             "push rbx",
             "cpuid",
             "pop rbx",
             out("ecx") features,
             out("eax") _,
             out("edx") _,
        );
    }
    println!("features: {:x}", features);
}

Playground

请注意,您不能破坏 ebx,因为它由 LLVM 内部使用,因此您需要保存和恢复它。