单片机汇编请教
在RAM中21H起始的位置中存放一组长度为20H的数据,编写三个子程序,分别实现以下功能:
1)、找出数据‘00H’的个数,存放在41H中;
2)、找出20H个数据的最大值,存放在42H中;
3)、查找是否有‘A’,并把首个出现该数据的位置存放在43H中。
ORG 0000H
MOV R0,#21H ; 第一个数的地址放R0
MOV 41H,#00H ;存放00H个数
MOV 42H, 21H ; 最大值放42H
MOV 43H, #00H ;存放第一次出现A的地址
MAIN: LCALL Search0
Search0: MOV A,@R0
JZ Is00 ;A为0转移
LCALL SearchA
Search123: LCALL SearchMax
CJNE R0,#41H,MAIN
SJMP $
Is00: INC 41H
; RET ;为什么返回上一句而不是下一句?
SearchA: CJNE @R0,#0AH,Search123
MOV 43H,R0
RET
SearchMax: MOV A,42H ;取当前数
INC R0 ;取下一个数
SUBB A, @R0 ; 当前数减去下一个数
JC IsMax ;进位为1转移
RET
IsMax: MOV 42H, @R0
RET
END
单步调试时,前面循环几次是正确的,但是到后面的话,RAM中的数据自己就都变了。。。会发现先变为17再变为0E...
[解决办法]
会不会是预留的地址不够了,覆盖到了存数据的区域,所以才改变的啊
[解决办法]
看看是不是堆栈没有设置好,因为若是51汇编,栈顶的位置一般是30H,这样你操作的地方就碰到了堆栈。
要不再换一段内存操作试试。
[解决办法]