因为作业里面有一个题,需要用汇编语言统计字符串中字符的个数,然而老师给的答案居然是错的。为什么呢,因为arm是字对齐的,答案居然每个字只比较一次就过去了,我去,每个字是有四个字节的,这能对吗,所以,我就自己做了一下,略微花了点时间,为了不忘记,所以记到博客上,以后回来看。
用汇编语言编写程序统计任意字符串包含的字符个数。(约定:字符串以 0 为结束标志)
对应的目标板是LPC2132;
关键就是把每个字内的四个字节,都要检查一遍。
1.专门用了一个寄存器r3,每次把当前字r1逻辑右移(LSR) r3*8个位,即
mov r5,r1,lsr r4;这一句。
2. DCD只能开辟字空间,可是要开辟的是字节啊,所以是用DCB,但是字符串还是字对齐的,所以只能每个字检查4次。
ENTRY
__main
;add the user code here.
start
ldr r0, =string
ldr r1, [r0]
mov r2, #0 ;字数
mov r3, #0 ;字节数
mov r4, #0
lpa ;字循环
ldr r1, [r0, r2, lsl #2]
b lpb
lpb ;字节循环
mov r4, r3, lsl #3
mov r5,r1,lsr r4
and r5, r5, #0xff ;r5存储取出的字符
cmp r5, #0 ;判断是否是结束字符0
beq end
add r3, #1
cmp r3, #4 ;判断当前字内的字节是否判断完毕
bne lpb
add r2, #1 ;移动到下一个字
mov r3, #0 ;字节的下标归0
beq lpa
end
add r3, r2,lsl #2
B .
string dcb "helloworld!",0
AREA data,CODE,READWRITE
END
在一次次编码的过程中发现数组下标从0开始,会非常的方便对于边界值的判断。有兴趣可以自己实际写写这个代码,就会发现看似很简单,实际还是有点要注意的东西的,比C语言麻烦一些。