为什么当直接从println调用而不是存储在临时变量中时,内联程序集的syscall会执行两次?

我具有以下功能,该功能会触发操作系统中的系统调用以在屏幕上打印字符串:

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中经历过两次副作用。有谁知道是什么导致这种奇怪的行为?

wg85840223 回答:为什么当直接从println调用而不是存储在临时变量中时,内联程序集的syscall会执行两次?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3099971.html

大家都在问