找回密码
 立即注册
查看: 252|回复: 32

双字节除法运算汇编程序请高手指导

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-28 05:43:12
已绑定手机

3

主题

28

回帖

93

积分

注册会员

积分
93
发表于 2025-8-25 14:55:53 | 显示全部楼层 |阅读模式
80C51单片机双字节汇编程序:总数12345。先把个位存入10H。十位除10,商存入11H。百位除100,商存入12H。千位除1000,商存入13H。万位除10000,商存入14H。
这里的12345是,0至12345之间的任意变化数(比如是AD读取的量值,在此时Bit位里的2进制数,0和1是随时变化,根本找不到逻辑。)



程序送人单片机就显示90000

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-28 05:43:12
已绑定手机

3

主题

28

回帖

93

积分

注册会员

积分
93
发表于 2025-8-25 14:56:57 | 显示全部楼层
ORG     0000H
        LJMP    MAIN

        ORG     0030H
MAIN:   MOV     DPTR, #12345   ; 加载双字节数12345
        MOV     R0, #10H       ; 设置存储起始地址

        ; 提取个位(12345 MOD 10)
        MOV     A, DPL
        MOV     B, #10
        DIV     AB
        MOV     @R0, B         ; 个位存入10H
        INC     R0

        ; 提取十位(12345/10 MOD 10)
        MOV     A, DPL
        MOV     B, #10
        DIV     AB
        MOV     A, B
        MOV     B, #10
        DIV     AB
        MOV     @R0, B         ; 十位存入11H
        INC     R0

        ; 提取百位(12345/100 MOD 10)
        MOV     A, DPH
        MOV     B, #100
        DIV     AB
        MOV     @R0, A         ; 百位存入12H
        INC     R0

        ; 提取千位(12345/1000 MOD 10)
        MOV     A, DPH
        MOV     B, #10
        DIV     AB
        MOV     @R0, A         ; 千位存入13H
        INC     R0

        ; 提取万位(12345/10000)
        MOV     A, DPH
        MOV     B, #1
        DIV     AB
        MOV     @R0, A         ; 万位存入14H

        SJMP    $              ; 程序结束
        END
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-28 05:43:12
已绑定手机

3

主题

28

回帖

93

积分

注册会员

积分
93
发表于 2025-8-25 15:03:42 | 显示全部楼层
上面的程序是人工智能帮我写的,我送人单片机后就显示90000,按理应该显示12345,因为我总数是12345发布做除法运算
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:67
  • 最近打卡:2025-08-25 17:30:03
已绑定手机

22

主题

490

回帖

2431

积分

版主

积分
2431
QQ
发表于 2025-8-25 17:30:03 | 显示全部楼层
请将完整单片机型号,原理图,程序啥的能放的,都贴一下哈,不然工程师无法帮您判断
www.STCAI.com
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:286
  • 最近打卡:2025-09-02 08:51:54
已绑定手机

80

主题

3032

回帖

6441

积分

荣誉版主

无情的代码机器

积分
6441
发表于 2025-8-25 19:35:27 | 显示全部楼层


12345 十六进制 0x3039
0x39 / 10 == 57 / 10 == 5余7,怎么能用B得到5呢

给一个Ai写的参考:
  1. ; 仅使用DIV AB指令拆分12345为单个数字
  2. ; 存储地址: 0x14~0x10分别存放0x01~0x05
  3.         ORG     0000H
  4.         LJMP    MAIN
  5.         ORG     0030H
  6. MAIN:   ; 12345拆分为123和45两个8位数处理
  7.         MOV     R0, #123       ; 高两位(123)
  8.         MOV     R1, #45        ; 低两位(45)
  9.         
  10. ; 提取万位1: 123 ÷ 100 = 1...23
  11.         MOV     A, R0
  12.         MOV     B, #100
  13.         DIV     AB             ; A=1, B=23
  14.         MOV     0x14, A        ; 万位1存入0x14
  15.         
  16. ; 提取千位2: 23 ÷ 10 = 2...3
  17.         MOV     A, B           ; A=23
  18.         MOV     B, #10
  19.         DIV     AB             ; A=2, B=3
  20.         MOV     0x13, A        ; 千位2存入0x13
  21.         
  22. ; 提取百位3: 3 (来自上一步余数)
  23.         MOV     0x12, B        ; 百位3存入0x12
  24.         
  25. ; 提取十位4: 45 ÷ 10 = 4...5
  26.         MOV     A, R1          ; A=45
  27.         MOV     B, #10
  28.         DIV     AB             ; A=4, B=5
  29.         MOV     0x11, A        ; 十位4存入0x11
  30.         
  31. ; 提取个位5: 5 (来自上一步余数)
  32.         MOV     0x10, B        ; 个位5存入0x10
  33. HERE:   SJMP    HERE           ; 程序暂停
  34.         END
复制代码


三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-28 05:43:12
已绑定手机

3

主题

28

回帖

93

积分

注册会员

积分
93
发表于 2025-8-25 20:12:57 | 显示全部楼层
erci*** 发表于 2025-8-25 19:35
12345 十六进制 0x3039
0x39 / 10 == 57 / 10 == 5余7,怎么能用B得到5呢

非常感谢您的帮助,从程序逻辑上我有启发,如果12345这个数是事先就是知道的,123和45分开存放是这个程序走的通,
问题是如果这个12345是0至12345之间的任意变化数(比如是AD读取的量值,在此时Bit位里的2进制数,0和1是随时变化,根本找不到逻辑。)。那这个程序应该还是有问题。

请帮忙指导,感谢您
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-28 05:43:12
已绑定手机

3

主题

28

回帖

93

积分

注册会员

积分
93
发表于 2025-8-25 20:30:39 | 显示全部楼层
8H8K*** 发表于 2025-8-25 17:30
请将完整单片机型号,原理图,程序啥的能放的,都贴一下哈,不然工程师无法帮您判断  ...

这个单片机上面我写了,是8051.
这个只是个用来计算的子程序,和原理图是没有关系的

感谢您的帮助
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-28 05:43:12
已绑定手机

3

主题

28

回帖

93

积分

注册会员

积分
93
发表于 2025-8-25 20:43:06 | 显示全部楼层
非常感谢您的帮助,从程序逻辑上我有启发,如果12345这个数是事先就是知道的,123和45分开存放是这个程序走的通,
问题是如果这个12345是0至12345之间的任意变化数(比如是AD读取的量值,在此时Bit位里的2进制数,0和1是随时变化,根本找不到逻辑。)。那这个程序应该还是有问题。

请帮忙指导,感谢您

点评

没想到什么好思路诶,给个笨办法参考:  详情 回复 发表于 2025-8-25 23:05
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:286
  • 最近打卡:2025-09-02 08:51:54
已绑定手机

80

主题

3032

回帖

6441

积分

荣誉版主

无情的代码机器

积分
6441
发表于 2025-8-25 23:05:53 | 显示全部楼层
道*** 发表于 2025-8-25 20:43
非常感谢您的帮助,从程序逻辑上我有启发,如果12345这个数是事先就是知道的,123和45分开存放是这个程序走 ...

没想到什么好思路诶,给个笨办法参考:

  1. ; 功能:将16位十六进制数转换为十进制,结果存于5字节缓冲区
  2. ; 入口:待转换数存于R6(高8位)和R7(低8位)
  3. ; 出口:转换结果存于30H-34H(30H为最高位,34H为最低位)
  4.         ORG     0000H
  5.         LJMP    MAIN
  6.         ORG     1000H
  7. MAIN:   MOV     R6, #030H    ; 高8位示例值
  8.         MOV     R7, #39H    ; 低8位示例值
  9.         LCALL   HEX2DEC      ; 调用转换子程序
  10. STOP:   SJMP    STOP         ; 程序暂停
  11. ; 转换子程序:R6R7 -> 30H-34H
  12. HEX2DEC:
  13.         MOV     30H, #0      ; 初始化5字节缓冲区(万位)
  14.         MOV     31H, #0      ; 千位
  15.         MOV     32H, #0      ; 百位
  16.         MOV     33H, #0      ; 十位
  17.         MOV     34H, #0      ; 个位
  18.         LCALL PROCESS_HIGH
  19.         
  20.         RET                  ; 转换完成返回
  21. ; 十进位处理子程序
  22. HANDLE_CARRY:
  23.         ; 处理个位进位到十位
  24.         MOV     A, 34H
  25.         MOV     B, #10
  26.         DIV     AB           ; A=商(进位), B=余数(个位)
  27.         MOV     34H, B       ; 保存个位
  28.         MOV     R0, A        ; 暂存进位值
  29.         
  30.         ; 处理十位进位到百位 - 累加进位
  31.         MOV     A, 33H
  32.         ADD     A, R0        ; 原有十位值 + 进位
  33.         MOV     B, #10
  34.         DIV     AB           ; A=商(进位), B=余数(十位)
  35.         MOV     33H, B       ; 保存十位
  36.         MOV     R0, A        ; 更新进位值
  37.         
  38.         ; 处理百位进位到千位 - 累加进位
  39.         MOV     A, 32H
  40.         ADD     A, R0        ; 原有百位值 + 进位
  41.         MOV     B, #10
  42.         DIV     AB           ; A=商(进位), B=余数(百位)
  43.         MOV     32H, B       ; 保存百位
  44.         MOV     R0, A        ; 更新进位值
  45.         
  46.         ; 处理千位进位到万位 - 累加进位
  47.         MOV     A, 31H
  48.         ADD     A, R0        ; 原有千位值 + 进位
  49.         MOV     B, #10
  50.         DIV     AB           ; A=商(进位), B=余数(千位)
  51.         MOV     31H, B       ; 保存千位
  52.         MOV     R0, A        ; 更新进位值
  53.         
  54.         ; 处理万位进位
  55.         MOV     A, 30H
  56.         ADD     A, R0        ; 原有万位值 + 进位
  57.         MOV     30H, A       ; 保存万位(最多为65535,不会超过10)
  58.         
  59.         RET
  60. PROCESS_HIGH:
  61.                 MOV     A, R6
  62.         JZ      PROCESS_LOW  ; 高8位为0且低8位<10,处理最后一位
  63.                 ; 高8位减1,补充十位25和个位6
  64.         DEC     R6
  65.         
  66.                 MOV         A, #6
  67.                 ADD     A, 34H
  68.         MOV     34H, A
  69.                
  70.                 MOV         A, #25
  71.                 ADD     A, 33H
  72.         MOV     33H, A
  73.                
  74.                 ; 处理各数位进位
  75.         LCALL   HANDLE_CARRY
  76.         SJMP    PROCESS_HIGH    ; 再次检查高8位
  77. PROCESS_LOW:
  78.         ; 低8位处理
  79.         MOV     A, R7
  80.         MOV     B, #10
  81.         DIV     AB           ; 仅对低8位使用DIV
  82.         MOV     R7, A        ; 保存商到低8位
  83.         MOV     A, B         ; 余数作为当前十进制位
  84.         
  85.         ; 将余数累加到结果缓冲区的个位
  86.         ADD     A, 34H
  87.         MOV     34H, A
  88.         
  89.                 ; 将商累加到结果缓冲区的十位
  90.                 MOV     A,R7
  91.                 ADD     A, 33H
  92.         MOV     33H, A
  93.                 MOV     R7,#0
  94.                
  95.         ; 处理各数位进位
  96.         LCALL   HANDLE_CARRY
  97.                
  98.                
  99.                 RET
  100.                
  101.         END
复制代码

三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-08-28 05:43:12
已绑定手机

3

主题

28

回帖

93

积分

注册会员

积分
93
发表于 2025-8-26 05:26:12 | 显示全部楼层
erci*** 发表于 2025-8-25 23:05
没想到什么好思路诶,给个笨办法参考:

感谢您,1.其中有暂停程序应该作废吧,要不然就卡这里了。2.SJMP    PROCESS_HIGH    ; 再次检查高8位。这条好像也应该删除是不是。

我送入单片机测试了,显示了还是不对。可能是我自己弄错,我先分析分析其中程序逻辑。

不过其中这两段程序我多想不通第1个:PROCESS_HIGH:
第2个:PROCESS_LOW:

让我先思考思考,感谢您
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-9-3 05:23 , Processed in 0.137605 second(s), 105 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表