ARM汇编练习(二)

ARM汇编练习(二)

软件平台:Keil5
设计C语言程序与汇编结合,下面变量uc8num数组相当函数出口参数,uc32num 相当于入口参数。

汇编程序里面,没有取余的这条指令。需要通过除法,乘法和减法来实现。
比如,
十进制:123取余25,
第一步、先通过除法 123 / 25 = r5
第二步、通过乘法 25 * r5 = r5
第三步、123 - r5 = r5,最后r5就是余数值。


涉及指令

功能指令
无符号除法SDIV
乘法MUL.W
减法SUB

Keil5下面是C语言程序下编写的汇编代码

uint32_t uc32num = 998;
uint8_t  uc8num[3];

//程序分析:将三位数uc32num变量值,分解出个位,十位,百位放到uc8num数组内。
__asm void text2(void)
{
	extern  uc32num;  //声明外部C语言函数地址
	extern  uc8num;
	
	PRESERVE8   //保证8个字节对齐
	
	push  {r0-r5,lr}
	
	ldr  r0,=uc32num
	ldr  r4,=uc8num
	
	ldr  		r1,[r0]     	//uc32num放入r1寄存器

	mov  		r2,#100			//r2 = 100
	sdiv 		r3,r1,r2 		//r3 = r1 / r2       r3寄存器得到百位
	strb 		r3,[r4],#1   	//放入uc8num[0]
	
	//取余100
	mov  		r2,#100			//r2 = 100
	mul.w  		r2,r3  			//r2 *=r3
	sub  		r5,r1,r2  		//r5寄存器得到余数
	
	mov			r2,#10			//r2 = 10			  	
	sdiv		r3,r5,r2  		//r3 = r5 / r2        r3寄存器得到十位
	strb 		r3,[r4],#1  	//放入uc8num[1]
	
	//取余10
	mov  		r2,#10			//r2 = 10
	mul.w		r2,r3			//r2 *=r3      		放大10倍
	sub			r3,r5,r2		//r3 = r5 - r2      r3寄存器得到个位
	strb 		r3,[r4]			//放入uc8num[2]
	
	pop		{r0-r5,pc}

}

检验:查看内存变量值

在这里插入图片描述
已经将uc32num值个百位、十位、个位分解到数组内,可以查看数组uc8num
在这里插入图片描述
效果不错…再接再厉!!
代码可以再精简一下

//程序分析:将三位数uc32num变量值,分解出个位,十位,百位放到uc8num数组内。
__asm void text3(void)
{
	extern  uc32num;  //声明外部C语言函数地址
	extern  uc8num;
	
	PRESERVE8   //保证8个字节对齐
	
	push  {r0-r5,lr}
	
	ldr  r0,=uc32num
	ldr  r4,=uc8num
	
	ldr  		r1,[r0]     	//uc32num放入r1寄存器

	mov  		r2,#100			//r2 = 100
	sdiv 		r3,r1,r2 		//r3 = r1 / r2       r3寄存器得到百位
	strb 		r3,[r4],#1   	//放入uc8num[0]					
	
	//取余100
	mov  		r2,#100			//r2 = 100
	mls 	 	r5,r2,r3,r1		//r5 = r1 - r2 * r3      r5寄存器得到余数
	
	mov			r2,#10			//r2 = 10			  	
	sdiv		r3,r5,r2  		//r3 = r5 / r2        r3寄存器得到十位   
	strb 		r3,[r4],#1  	//放入uc8num[1]
	
	//取余10
	mov  		r2,#10
	mls			r3,r2,r3,r5		//r3 = r5 - r2 * r3		r3寄存器得到个位  
	strb 		r3,[r4]			//放入uc8num[2]
	
	pop		{r0-r5,pc}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值