[匠人手记] 【求助】3字节/1字节除法运算,调试出错

[复制链接]
 楼主| kooshare 发表于 2009-11-4 14:40 | 显示全部楼层 |阅读模式
那位大哥帮帮忙,在线等。。。。


;3字节/1字节 除法子程序
      LDA #3;030303/03
      STA BEICHUSHU2;被除数高位为03
      STA BEICHUSHU1;被除数中位为03
      STA        BEICHUSHU0;被除数低位为03
      STA        CHUSHU;除数为03

      LDA CHUSHU
      BEQ SEC_DO;除数为0,跳出错
      CLR SHANG2;商高位
      CLR SHANG1;商中位
      CLR SHANG0;商低位
      CLR YUSHU;余数位
   
      LDX #8;X寄存器,循环控制
DIV_3_1_LP:      
      LSL BEICHUSHU0;被除数左移
      ROL BEICHUSHU1;被除数带c左移
      ROL BEICHUSHU2
      ROL YUSHU;余数带c左移
      BCS DIV_3_1_LP1; c为1跳转
      LDA CHUSHU
      SUB YUSHU
      BCC DIV_3_1_LP2; c为0跳转
DIV_3_1_LP1:      
      LDA YUSHU
      SUB CHUSHU
      STA YUSHU
      SEC
DIV_3_1_LP2:
      ROL SHANG0;商带c左移
      ROL SHANG1
      ROL SHANG2
      
      DECX
      BNE DIV_3_1_LP;计数减一不为零,跳转      
      CLC;清c
L177:      
      JMP L177
SEC_DO:
      SEC;置c
      JMP SEC_DO
程序匠人 发表于 2009-11-4 14:56 | 显示全部楼层
错在哪里?
 楼主| kooshare 发表于 2009-11-4 14:58 | 显示全部楼层
结果不正确
 楼主| kooshare 发表于 2009-11-4 14:59 | 显示全部楼层
本帖最后由 kooshare 于 2009-11-4 15:03 编辑

2# 程序匠人
这里的计数器设置为24的时候
算出来的结果为 商00,ff,ff,余数06,
计数器设置为8的时候,算出来的结果为 ,商,00,00,00,余数03
程序匠人 发表于 2009-11-4 21:20 | 显示全部楼层
看样子你是照着《匠人手记》写的程序吧?

我不太熟悉你使用的这个asm,麻烦给下面几句翻译一下:

      LDA CHUSHU
      SUB YUSHU
      BCC DIV_3_1_LP2; c为0跳转
DIV_3_1_LP1:      
      LDA YUSHU
      SUB CHUSHU
      STA YUSHU

估计问题是出在这几句里面,针对里面的两次减法运算,你需要确认一下:
谁是减数?
谁是被减数?
结果放在哪里?
减法对C的影响如何?
 楼主| kooshare 发表于 2009-11-5 08:59 | 显示全部楼层
本帖最后由 kooshare 于 2009-11-5 09:00 编辑

非常感谢匠人的帮助,我是对着《匠人手记》写的程序。这个ASM是摩托罗拉HC05指令
#看样子你是照着《匠人手记》写的程序吧?

#我不太熟悉你使用的这个asm,麻烦给下面几句翻译一下:
翻译如下:
      LDA CHUSHU;除数放入A
      SUB YUSHU;A减余数,结果放入A,有借位则C=1,无借位C=0
      BCC DIV_3_1_LP2; c为0跳转
DIV_3_1_LP1:      
      LDA YUSHU;余数放入A
      SUB CHUSHU;A减除数,结果放入A
      STA YUSHU;将A中的值放入余数

#估计问题是出在这几句里面,针对里面的两次减法运算,你需要确认一下:
#谁是减数?
#谁是被减数?
#结果放在哪里?
#减法对C的影响如何?
程序匠人 发表于 2009-11-5 09:13 | 显示全部楼层
第一个问题:比较数据大小时,程序有误:
先分析你的程序 :
LDA CHUSHU;除数放入A
      SUB YUSHU;A减余数,结果放入A,有借位则C=1,无借位C=0 (即:除数-余数)
      BCC DIV_3_1_LP2; c为0跳转  (即:除数>=余数跳.)(很显然,这里错了,正确思路应该是:除数>余数跳)
DIV_3_1_LP1:      
      LDA YUSHU;余数放入A
      SUB CHUSHU;A减除数,结果放入A
      STA YUSHU;将A中的值放入余数

正确写法应该是:
LDA YUSHU;余数放入A
      SUB CHUSHU;A减除数,结果放入A,有借位则C=1,无借位C=0
      BCS DIV_3_1_LP2; c为1跳转(即:除数>余数跳)

DIV_3_1_LP1:      
      LDA YUSHU;余数放入A
      SUB CHUSHU;A减除数,结果放入A
      STA YUSHU;将A中的值放入余数

第2个问题:计数器应该设置为8
 楼主| kooshare 发表于 2009-11-5 09:24 | 显示全部楼层
匠人,您好,刚改了以后,结果为商,00,00,01,余数00,结果错误
后来我将计数器设置为24,则结果为商,01,01,01,余数00,结果正确
程序匠人 发表于 2009-11-5 09:33 | 显示全部楼层
哦,抱歉,我刚才搞错了,计数器应该设置为24(=被除数的位数)

关于这一条,书上也有误,当时勘误表里已经更新,我又给忘了。
 楼主| kooshare 发表于 2009-11-5 09:36 | 显示全部楼层
但是我看过勘误表,里面没有这个更新,呵呵,现在解决了,非常感谢匠人的帮忙!
程序匠人 发表于 2009-11-5 09:58 | 显示全部楼层
勘误表,请重新到这里下载更新: https://bbs.21ic.com/icview-119880-1-1.html  这个是刚才重新上传的。

另:结贴时,给出去的分数应该和你的悬赏分一致才行哦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

61

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部