Rust内联汇编
Rust的内联汇编基础语法如下(需要启用#!(feature(asm))
)
asm!(
assembly template
: 输出操作数
: 输入操作数
: Clobber
: 选项
);
assembly template
assembly template是唯一需要的参数并且必须是原始字符串例如asm!("nop")
,该指令不需要任何参数,因此省略了
因为Rust内联汇编还处于Unstable,因此我们需要使用#![feature(asm)]
放在lib.rs文件对开头部分如下
system/src/lib.rs
#![no_std]
#![feature(asm)]
pub mod bits;
pub mod mutex;
pub mod ia_32e;
#[cfg(test)]
mod tests;
使用时需要添加unsafe块或函数需要添加unsafe关键字,例如
pub unsafe fn nop(){
asm!(
"xor %eax, %eax"
:
:
: "{eax}"
:
);
}
或者
pub fn nop(){
unsafe{
asm!(
"xor %eax, %eax"
:
:
: "{eax}"
:
);
}
}
在调用unsafe函数时需要使用unsafe块
fn main(){
unsafe{
nop();
}
}
如果一个函数只有一个内联汇编操作的话,建议将该函数声明为unsafe的,为了提高执行效率可以在函数上添加#[inline]
宏(与C语言的#inline
宏类似),这在编译时起到了优化的效果
#[inline]
pub unsafe fn xor(){
// 有空格也没关系
asm!("xor %eax, %eax" ::: "{eax}");
}
在调用该函数时我们可以添加#[cfg(target_arch = "x86_64")]
来指定要编译的目标系统的架构,
模板字符串支持使用$后跟一个数字的参数替换例如$0
,以指示由约束字符串指定的给定寄存器/内存位置的替换。${NUM:MODIFIER}也可以使用,其中MODIFIER是如何打印操作数的特定于目标的注释
字符$可以在模板中使用$$
。要在输出中包含其他特殊字符,可以使用通常的“\XX”转义符,就像在其他字符串中一样。
约束
约束列表是逗号分隔的字符串,每个元素包含一个或多个约束代码,例如:“约束1”(表达式1),“约束2”(表达式2)...
,
对于约束列表中的每个元素,将选择一个适当的寄存器或内存操作数,并且将对$0列表中的