在贴吧看到一道题目:
刚学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字节对齐!