我具有以下功能,该功能会触发操作系统中的系统调用以在屏幕上打印字符串:
pub fn print(ptr: *const u8,len: usize) -> u32 {
let r: u32;
unsafe {
asm!("int 0x80" : "={eax}"(r) : "{eax}"(1u32),"{esi}"(ptr as u32),"{ecx}"(len as u32) : : "intel");
}
r
}
但是,当我按如下所示执行它时:
const s: &'static str = "Hello,World!\n";
println!("{}",print(s.as_ptr(),s.len()));
我得到以下输出:
Hello,World!
Hello,World!
0
但是,当我写这篇文章时:
const s: &'static str = "Hello,World!\n";
let r = print(s.as_ptr(),s.len());
println!("{}",r);
它可以正确打印:
Hello,World!
0
在Godbolt中,我看到只有一条int
指令会触发系统调用,据我所知,print
函数是只打过一次。我以前从未在Rust中经历过两次副作用。有谁知道是什么导致这种奇怪的行为?