首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

单片机汇编请问

2013-09-05 
单片机汇编请教在RAM中21H起始的位置中存放一组长度为20H的数据,编写三个子程序,分别实现以下功能:1)、找出

单片机汇编请教
在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,这样你操作的地方就碰到了堆栈。
要不再换一段内存操作试试。
[解决办法]

引用:
引用:会不会是预留的地址不够了,覆盖到了存数据的区域,所以才改变的啊我也不知道为什么,神奇的问题


把地址换换看试试,或者误操作了一些寄存器,使之改变了吧,没遇到过这种问题!

热点排行