09-ARM体系结构及接口技术学习笔记(华清)

ARM指令

在这里插入图片描述

//c代码
if(a == 0) x = 0;
if(a > 0) x += 3;
//汇编代码
mov r0,#0
cmp r0,#0	;比较大小,当相等时CPSR的Z位会置1
moveq r1,#0	;如果相等,则执行mov r1,#0
addgt r1,r1,#3	;如果r0大于#0,则执行add  r1,r1,#3

c语言代码最终会被编译成二进制代码,存储在flash中,CPU控制器会向flash取址->译码,ALU执行

在这里插入图片描述

在这里插入图片描述
Rs:源操作数
Rd:目标操作数
cpucode:操作码,识别是哪个指令
cond:条件判断(1110:不启用)

ARM指令的合法性:
当源操作数太大时,如mov r0,#0x12345678是不合法的
此时,我们用伪指令替代:ldr r0,=0x12345678

用汇编实现C代码

//c code
int func3(int temp)
{
	return temp - 1;
}

int func2(int temp)
{
	return temp+3;
}

int func1(int temp)
{
	if(temp ==2){
		return func2(temp);
	}else{
		return func3(temp);
	}
}

int mian()
{
	int temp = 2;
	func1(2);
	while(1);
}

-------------------------------------
//asm code 
.text

main:
	mov r5,#0
	mov r2,#2
	bl func1
main_end:	
	b main_end

func1:
	mov r12,LR
	cmp r0,#2
	bleq func2
	blne func3
func1_end:
	mov pc,r12

func2:
	add r0,#3
	mov pc,lr
func3:
	sub r0,#1
	mov pc,lr

.end
//asm
@delay for 1s  for(int i=1000000;i>0;i--);
delay1s:
	ldr r5,=0x3fffffff
loop:
	cmp r5,#0
	beq delay1s_end
	sub r5,#1
	b loop
delay1s_end:
	mov pc,lr
//c实现求最大公约数
int GCD(int a,int b)
{
	while(1){
		if(a == b) break;
		if(a > b){
			a -= b;	
		}else{
			b -= a;
		}
	}
	return a;
}
//asm
.text 
main:
	mov r0,#9
	mov r1,#15
	bl gcd

main_end:

gcd:
loop:
	cmp r0,r1
	beq	gcd_end
	subgt r0,r0,r1
	sublt r1,r1,r0
	b loop
gcd_end:
	moveq pc,lr
.end 

Load/Store指令

注:load/store ,ARM架构规定,存储器间不能直接拷贝,必须通过寄存器中转

	.text 
main:
	mov r0,#9
	ldr r5,=buf
	ldr r6,=dest_buf  //ldr 是伪指令
	ldr r0,[r5]			//ldr 是ARM的load指令
	str r0,[r6]
main_end:
	b main_end	
	.data
@char buf[]={0x01,0x02,0x03,0x04}
buf:
	.byte 0x01,0x02,0x03,0x04
dest_buf:
	.space 8
	.end
//c code
int main()
{
	int i=0;
	const char buf[]={1,2,3};
	char destBuf[8];
	for(i=0;i<3;i++){
		destVBuf[i] = buf[i];
	}	
}
//asm
	.text
main:
	mov r5,#0	
	ldr r7,=buf
	ldr r8,=dest_buf
loop:
	cmp r5,#3
	beq main_end
	add r5,#1
	ldrb r0,[r7],#1
	strb r0,[r8],#1
	b loop
main_end:
	b main_end
	
buf:
	.byte 0x01,0x02,0x03	
	.data
	
dest_buf:
	.space 8
	.end

GUN汇编伪指令

在这里插入图片描述

批量操作指令

在这里插入图片描述

	.text 
	ldr r12,srcBuf
	ldr r13,destBuf
	ldmia r12!,{r0-r11}
	stmia r13!,{r0-r11}

	.data
srcBuf:
	.string "adhgkakjsfdasjfa;kdjaks;da;gk\0"
destBuf:
	.space 12*4
	.end

L9-D2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值