我尝试在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)上。
1条答案
按热度按时间9lowa7mx1#
好吧,
&str
是一个 wide 引用,*const str
是一个 wide 指针,而瘦指针是程序集所要求的。尽管错误消息可以使对 * 瘦 * 指针的要求更清楚。幸运的是,有一种方法可以将&str
转换为合适的指针,称为as_ptr
没有得到进一步的,但我不能测试手臂大会,所以它仍然无法编译我。