2401_84308473 2024-06-10 21:39 采纳率: 57.1%
浏览 4
已结题

我的调试好像有点问题,谁能帮我看看我的程序啊?

我在30H的地址里输入12 11 09 FF用Keil5调试出来的结果是图片的那样
在30H的地址后面总会出现03 06 01的数字
还有就是,按照我的程序我的40H应该是统计30H中正输的个数,41H统计的是0的个数,42H统计的是负输的个数,可是按照调试的显示,好像结果不太对,我真的要哭死了
是我程序有问题,还是说调试有要注意的地方被我遗漏了?

    ORG 0000H
    LJMP MAIN
    ORG 0080H
MAIN:MOV R0,#30H
     MOV 40H,#0
     MOV 41H,#0
     MOV 42H,#0
     MOV R2,#10
LOOP:MOV A,@R0
     JNZ NEXT1
     INC  41H
     SJMP DONE
NEXT1:JB  ACC.7,NEXT2
      INC  40H
      SJMP DONE
NEXT2:INC 42H
DONE: INC R0
      DJNZ R2,LOOP
      SJMP $
      END

img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-10 21:39
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的程序和描述来看,你的目标是在30H到3FH这段内存中统计正数、零和负数的数量,并将结果分别存入40H、41H和42H单元。但是,你遇到了一些问题,即在30H后的数据中出现了额外的03 06 01序列,而且统计结果似乎不正确。

    首先,让我们检查一下你的程序逻辑是否存在问题。你的程序代码如下:

    ORG 0000H
    LJMP MAIN
    ORG 0080H
    MAIN:MOV R0,#30H
         MOV 40H,#0
         MOV 41H,#0
         MOV 42H,#0
         MOV R2,#10
    LOOP:MOV A,@R0
         JNZ NEXT1
         INC  41H
         SJMP DONE
    NEXT1:JB  ACC.7,NEXT2
          INC  40H
          SJMP DONE
    NEXT2:INC 42H
    DONE: INC R0
          DJNZ R2,LOOP
          SJMP $
          END
    

    这个程序的主要逻辑在于使用R0作为指针遍历从30H开始的内存区域,同时使用R2寄存器控制循环次数为10次。对于每个遍历到的字节,程序会判断其是否为零(JNZ NEXT1),如果是,则增加零的计数(INC 41H)。如果不是零,程序进一步检查该字节的最高位(即符号位)是否为1(JB ACC.7,NEXT2),如果为1,则增加负数的计数(INC 42H),否则增加正数的计数(INC 40H)。

    问题分析:

    1. 循环次数:你使用R2寄存器设置了循环10次,这可能与你期望遍历的数据长度不符。如果你的数据区域是从30H到3FH,那么你应该遍历16个字节,而不是10个字节。

    2. 数据溢出:你的程序没有考虑到数据溢出的情况。例如,当计数器达到最大值后再次递增可能会导致错误的结果。

    3. 额外数据:你提到在30H之后的数据中出现了03 06 01这样的序列,这可能是因为这些地址中本来就有数据,或者你的程序在其他地方修改了它们。

    解决方案:

    1. 调整循环次数:确保你的循环次数与实际需要遍历的字节数相匹配。在这个例子中,你应该将R2设置为16(MOV R2,#16),以便遍历整个30H到3FH的区域。

    2. 检查数据初始化:确认在程序开始执行前,30H到3FH的内存区域已经被正确初始化,或者之前没有任何程序修改过这些地址中的数据。

    3. 代码完整性:确认你的程序没有其他部分无意中修改了40H、41H和42H单元的值。

    修正后的代码如下:

    ORG 0000H
    LJMP MAIN
    ORG 0080H
    MAIN:MOV R0,#30H
         MOV 40H,#0
         MOV 41H,#0
         MOV 42H,#0
         MOV R2,#16 ; 修改循环次数为16
    LOOP:MOV A,@R0
         JNZ NEXT1
         INC  41H
         SJMP DONE
    NEXT1:JB  ACC.7,NEXT2
          INC  40H
          SJMP DONE
    NEXT2:INC 42H
    DONE: INC R0
          DJNZ R2,LOOP
          SJMP $
          END
    

    此外,建议你在编程时加入适当的注释,以便于理解和维护代码。同时,在编写代码前,清晰地规划程序的流程和数据结构也是非常重要的。希望这些建议能帮助你解决遇到的问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月20日
  • 创建了问题 6月10日