assembly 在Rust内联汇编中使用字符串常量

rfbsl7qr  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(92)

我尝试在Rust中使用内联汇编执行write系统调用。基本上,我试图复制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更合适的指针吗?
1.我仍然处于使用汇编的早期阶段,还有其他我遗漏的突出问题吗?

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,
       );
    }
}

这是在MacOS v13.6上运行的,在M1芯片(Armv8.5-a)上。

9lowa7mx

9lowa7mx1#

好吧,&str是一个 wide 引用,*const str是一个 wide 指针,而瘦指针是程序集所要求的。尽管错误消息可以使对 * 瘦 * 指针的要求更清楚。幸运的是,有一种方法可以将&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,
       );
    }
}

没有得到进一步的,但我不能测试手臂大会,所以它仍然无法编译我。

相关问题