使用Rust开发操作系统(Rust内联汇编)

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列表中的

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值