当前位置: 代码迷 >> 汇编语言 >> 单片机汇编请问
  详细解决方案

单片机汇编请问

热度:254   发布时间:2016-05-02 04:50:03.0
单片机汇编请教
在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,这样你操作的地方就碰到了堆栈。
要不再换一段内存操作试试。
------解决方案--------------------
  相关解决方案