ARM实现除法运算。以及Branch to unaligned destination, expect destination to be <max> byte aligned解决办法

在贴吧看到一道题目:

刚学ARM7汇编不久,所以就来练练手。解答如下:

 PRESERVE8
 AREA CLAC, CODE, READONLY
 EXPORT main
 IMPORT _printf

BUF DCD -1, 3, 24, 94, 62, 72, 55, 0, -48, 99
BUF_SIZE EQU 10
PIRNT_BUF DCB "max=%d,ave=%d",0,0,0 ;后面追加几个,0 是为了对齐!不然会报错expect destination to be 4 byte aligned


asm_divide ;ARMV7 没有除法指令,自己实现
 MOV R2, #0
asm_div_loop
 CMP R0, R1 ;判断是否除尽
 MOVLT R0, R2 ;当R0 <R1(被除数大于除数,则保存累加值)
 BXLT LR      ;当R0 <R1 跳出循环返回
 SUBS R0, R0, R1 ; R0=R0-R1
 ADD R2, R2, #1  ; 减去一次,加上1,说明能除以R2次
 B asm_div_loop ;继续循环


main PROC

 LDR R1, =BUF
 MOV R2, #BUF_SIZE
 MOV R3, #0
 MOV R4, #0

LOOP
 LDR R0, [R1], #4
 ADD R3, R3, R0  ;计算总和
 CMP R4, R0 ;计算最大值
 MOVLE R4, R0

 SUBS R2, R2, #1 ;循环计数递减
 BNE LOOP

 STMFD SP!, {R0-R6, LR}
 MOV R0, R3
 MOV R1, #BUF_SIZE

 BL asm_divide
 MOV R7, R0 ;保存返回值
 LDMFD SP!, {R0-R6, LR} ;从堆栈里还原R0-R6、LR

 LDR R0, =PIRNT_BUF
 MOV R1, R4 ;最大值
 MOV R2, R7 ;平均数

 STMFD SP!, {LR}
 BL _printf ;打印结果
 LDMFD SP!, {PC}
 ENDP

 END

期间编译一直遇到 Branch to unaligned destination, expect destination to be <max> byte aligned 的错误,在程序里加了N个NOP指令去填充还是不行,网上搜了搜也没解决。最后发现 问题可能出在

PIRNT_BUF DCB "max=%d,ave=%d"

于是在后面追加了,一个、两个、三个 0 反复编译测试,发现3个0的时候就正常了,数了数 PIRNT_BUF 的字数,是13个!不是4字节对齐!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江西省遂川县常驻深圳大使

喜欢本文,打赏下作者吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值