2401_84308473 2024-06-08 23:13 采纳率: 62.5%
浏览 2
已结题

问这个程序是否有误?为什么不能实现我要的功能

题目:从Black单元开始有一个无符号数据块,其长度10存于Len单元,求出数据块中最大的数,并存入Max单元。
程序:

ORG  0000H
      LEN   EQU  20H
      MAX   EQU  21H
      BLACK EQU  22H
START: CLR  A
       MOV  R2,LEN
       MOV  R1,#BLACK
LOOP:  CLR  C          
       SUBB A,@R1 
       JNC NEXT
       MOV  A,@R1
       SJMP NEXT1
NEXT:  ADD  A,@R1     
NEXT1: INC  R1
       DJNZ R2,LOOP
       MOV  MAX,A
       SJMP $
       END

调试结果:

img


(因为我的朋友告诉我,调试完就看memory窗口底下,D01开头的那几行会显示结果––但是我去看,我的结果只是把我的输入换了一行显示在D01的某一行里😭,所以是为什么呀?)

  • 写回答

1条回答 默认 最新

  • 阿里嘎多学长 2024-06-08 23:21
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据你提供的程序和问题描述,我们可以逐步分析程序的逻辑和调试结果,以找出可能的问题所在。

    程序分析

    1. 起始地址: ORG 0000H 是正确的,表示程序从地址 0 开始执行。

    2. 标签定义: LEN, MAX, BLACK 定义为内存地址,需要确保这些地址在单片机的内存中是有效的,并且没有被其他程序或数据占用。

    3. 循环逻辑:

      • CLR A 清除累加器 A,准备比较。
      • MOV R2,LEN 将数据块长度存储在 R2 中。
      • MOV R1,#BLACK 将数据块起始地址存储在 R1 中。
      • LOOP 循环开始,CLR C 清除进位标志。
      • SUBB A,@R1 将 R1 指向的数据与 A 相减,如果 A 较大,则会设置进位标志 C。
      • JNC NEXT 如果没有进位(即 A 大于数据块中的数),跳转到 NEXT
      • MOV A,@R1 将 R1 指向的数据移动到 A,更新当前最大值。
      • SJMP NEXT1 无条件跳转到 NEXT1
      • NEXT 这里应该是一个错误,正确的逻辑应该是 JNC NEXT1 而不是 ADD A,@R1,因为 ADD A,@R1 会导致 A 的值错误地增加。
      • NEXT1 递增 R1 指向下一个数据,DJNZ R2,LOOP 递减 R2 并跳回 LOOP 如果 R2 不为零。
    4. 更新最大值: 循环结束后,MOV MAX,A 将 A 中的最大值存储到 MAX 指定的内存地址。

    5. 程序结束: SJMP $ 导致程序进入死循环,END 正确地标记了程序的结束。

    调试结果分析

    根据你提供的调试结果截图,我们需要关注 D01 开头的行,这些行显示了程序执行后的内存状态。如果调试结果显示输入数据只是简单地移动到了 D01 的某行,这可能意味着:

    • 程序没有正确地更新最大值。
    • NEXT 标签下的逻辑错误,导致程序没有正确地比较和更新 A 的值。

    建议

    • 修正 NEXT 标签下的逻辑错误,将 ADD A,@R1 替换为 JNC NEXT1
    • 确保 LEN 的值正确反映了数据块的长度。
    • 检查 BLACK 标签指向的内存地址是否包含了正确的数据块。
    • 重新调试程序,观察 D01 开头的行是否正确地显示了更新后的最大值。

    参考资料

    请注意,上述链接仅为示例,实际可用的参考资料可能有所不同。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月18日
  • 已采纳回答 6月10日
  • 创建了问题 6月8日

悬赏问题

  • ¥15 微信小程序 用oss下载 aliyun-oss-sdk-6.18.0.min client报错
  • ¥15 ArcGIS批量裁剪
  • ¥15 labview程序设计
  • ¥15 为什么在配置Linux系统的时候执行脚本总是出现E: Failed to fetch http:L/cn.archive.ubuntu.com
  • ¥15 Cloudreve保存用户组存储空间大小时报错
  • ¥15 伪标签为什么不能作为弱监督语义分割的结果?
  • ¥15 编一个判断一个区间范围内的数字的个位数的立方和是否等于其本身的程序在输入第1组数据后卡住了(语言-c语言)
  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥15 抖音看过的视频,缓存在哪个文件