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}
}