ARM实现除法运算。以及Branch to unaligned destination, expect destination to be 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字节对齐!

发布了106 篇原创文章 · 获赞 204 · 访问量 128万+

猜你喜欢

转载自blog.csdn.net/ab6326795/article/details/90521212