我正try 在Rust中使用内联程序集执行write系统调用.基本上,我正在try 复制this hello world example个.我试图将对字符串片的引用作为我的消息传递,但我收到了以下错误,这似乎与其本身相矛盾:

cannot use value of type `*const str` for inline assembly
only integers, floats, SIMD vectors, pointers and function pointers can be used as arguments for inline assembly

代码如下,但我的问题是:

  1. 还有比*const str更合适的指针吗?
  2. 我还处于使用汇编的早期阶段,还有其他我遗漏的明显问题吗?
use std::arch::asm;

fn main() {
    let msg = "Hello World!\n";
    let len = msg.len();
    unsafe {
        asm!(
            "mov X0,  #1",     // specify stdout
            "adr X1,  {msg}",  // point to message
            "mov X2,  {len}",  // specify message length
            "mov X16, #4",     // specify syscall number for 'write'
            "svc #0x80",       // syscall
            msg = in(reg) msg,
            len = in(reg) len,
       );
    }
}

它运行在MacOSv13.6上,运行在M1芯片(Armv8.5-a)上.

推荐答案

&strwide引用,*const strwide指针,和程序集要求的细指针之间有细微的区别.尽管错误消息可能会使对thin指针的要求更加明确.幸运的是,有一种方法可以将&str转换为适当的指针,毫不奇怪地称为as_ptr

use std::arch::asm;

fn main() {
    let msg_str = "Hello World!\n";
    let len = msg_str.len();
    let msg = msg_str.as_ptr();
    unsafe {
        asm!(
            "mov X0,  #1",     // specify stdout
            "adr X1,  {msg}",  // point to message
            "mov X2,  {len}",  // specify message length
            "mov X16, #4",     // specify syscall number for 'write'
            "svc #0x80",       // syscall
            msg = in(reg) msg,
            len = in(reg) len,
       );
    }
}

但我不能测试ARM组件,所以它仍然无法为我编译.

Rust相关问答推荐

即使参数和结果具有相同类型,fn的TypId也会不同

为什么是!为Rust中的RwLockReadGuard和RwLockWriteGuard实现的发送特征?

有没有办法模仿对象安全克隆?

MPSC频道在接收器处阻塞

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

如何高效地将 struct 向量中的字段收集到单独的数组中

在Rust中,Box:ed struct 与普通 struct 在删除顺序上有区别吗?

rust中的库插件管理器,现在是否可行?

Rust 中的静态引用

如何使用tracing-subscriberRust crate 构建多编写者、全局过滤订阅者

如何在 Rust 中打印 let-else 语句中的错误?

(let b = MyBox(5 as *const u8); &b; ) 和 (let b = &MyBox(5 as *const u8); ) 之间有什么区别

是否可以通过可变引用推进可变切片?

borrow 匹配手臂内部的可变

为什么 for_each 在释放模式(cargo run -r)下比 for 循环快得多?

切片不能被 `usize` 索引?

为什么会出现无法移出可变引用后面的 `self.x`错误?

判断 is_ok 后重用结果

传递 Option<&mut T> 时何时需要 mut

如何阅读 HttpRequest 主体