ARM汇编程序和指令学习

mvo指令的详解

在这里插入图片描述
立即数被编码到机器的低12位,如果立即数小于256,则编码到低8位,否则,如果能通过循环左移偶数位变成小于256的数,那么编码时,小于256的数在机器码的低八位,移动的位数除以2编码到低12的高四位

移位指令操作

LSL 对通用寄存器中的内容进行逻辑左移操作

LSR 对通用寄存器中的内容进行逻辑右移操作

ASR 对通用寄存器中的内容进行算数右移操作,左端是正数的话用0补齐,如果是负数的话用1补齐

ROR 对通用寄存器进行循环右移操作,左端的数用右边移出的位来补充

nt main ()
{
	int a, b, c,d;
	__asm__ __volatile__(
			
			"nop\n"
			"mov r0,#0x78\n" //将0x78放到寄存器r0中
			"lsl %[a],r0,#0x4\n" //将寄存器r0通过左移四位的操作
			"lsr %[b],r0,#0x4\n"//将寄存器r0通过右移四位的操作
			"asr %[c],r0,#0x8\n"  //将寄存器r0通过算数左移移四位的操作
			"ror %[d],r0,#0x4\n" 将寄存器r0通过循环右移四位的操作
			"nop\n"
			:[a]"=&r"(a),输出的变量
			[b]"=r&"(b),
			[c]"=&r"(c),
			[d]"=&r"(d)
			: //输入的变量
			:"r0"//被更改的资源列表
			);
}
算数运算逻辑指令

AND 将两个数进行逻辑与运算,常用于频闭操作数1的某些位

ORR 将两个操作数进行逻辑或运算,常用于设置操作数1的某些位

EOR 将两个操作数进行异或操作,用于反转操作数1的某些位

ADD 将两个数进行算数相加

ADC 与ADD的区别是除了两个操作数相加,还包括CPSR中的C的标志位

SUB 将两个数进行相减操作

int a, b, c,d;
__asm__ __volatile__(
		
		"nop\n"
		"mov r0,#0x78\n" //将0x78放到寄存器r0中
		"and %[a],r0,#0x78\n"
		"orr %[b],r0,#0x4\n"
		"add %[c],r0,#0x22\n"
		""
		"nop\n"
		:[a]"=&r"(a),
		[b]"=r&"(b),
		[c]"=&r"(c),
		[d]"=&r"(d)
		:
		:"r0"
		);

}

加载/存储指令

LDR 从储存器中将一个32位的字数据传到目标寄存器中

STR 将源寄存器32位数据传到储存器中

LDR 的伪指令用法

ldr r0 ,=lable//取标号处的地址送入r0
ldr r0 ,lable//取标号处的地址储存的四字节真值
ldr r0 ,=imedi //将任意一个常量立即数,放入r0,无论是否合法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值