易码技术论坛

 找回密码
 加入易码
搜索
查看: 286838|回复: 13

[分享]6502除法程序

[复制链接]
发表于 2005-1-19 20:51:00 | 显示全部楼层
我现在对文曲星中的那些系统调用不太感兴趣,能用纯汇编实现的就尽可能用纯汇编实现,还可以学些算法~
发表于 2005-1-23 16:34:00 | 显示全部楼层
这个的算法是怎么样的啊?用减的?
 楼主| 发表于 2005-1-23 16:43:00 | 显示全部楼层
以下是引用混乱羽翼在2005-1-23 16:34:54的发言:
这个的算法是怎么样的啊?用减的?

想一想,我们小学学除法除式时是怎样的道理,这里就是~
发表于 2005-1-23 16:45:00 | 显示全部楼层
哦~小学时~差不多就是减的嘛~这样的话我就清楚了~我一直都是用减的写除法的~可是有人说用位移法~这个是怎么滴?
 楼主| 发表于 2005-1-23 16:51:00 | 显示全部楼层
这个,你大概错解我的意思了~
我们用除式算除法是从高位除起吧,但这里是用2进制算,所以只有1,0两种结果,就是除得来就得1,否则0;
而且我们是顺次把除数往右移,但程序中我们不好移动除数就把被除数顺次往左移了。
好好想一下,有一定难度,想清楚就会决定很简单了^_^
发表于 2005-1-23 16:56:00 | 显示全部楼层
我想我大概知道了~呵呵~
发表于 2005-1-23 17:00:00 | 显示全部楼层
本来我除法都是用减的~呵呵~现在算是知道了~等下去试试写写看~
 楼主| 发表于 2005-1-23 17:00:00 | 显示全部楼层
Good!
如果你马上能写了16位与8位的除法就说明你已经掌握了~
其实很多算法并不复杂,只是往往不会想到。
象除法程序,大部分人肯定先想到的是用累次减去法,但那种效率就低很多了~
发表于 2005-1-23 17:07:00 | 显示全部楼层
嗯~既然如此~顺便问一下乘法
是不是左移在加上加法啊?我一直是这么做的~比如×9   3次左移再加一次?
 楼主| 发表于 2005-1-23 17:15:00 | 显示全部楼层
乘法程序就类似乘式运算了:

                  lda #xx

                 sta $80

                  lda #yy

                  sta $81

                  lda #$00

                  sta $82

                  sta $83

                  ldx #$08

                  loop:asl $82

                          rol $83

                         asl $80

                         bcc label

                         lda $81

                         clc

                         adc $82

                        sta $82

                         lda #$00

                        adc $83

                        sta $83

           label :    dex

                        bne loop

                        rts

[此贴子已经被作者于2005-1-23 17:18:09编辑过]

发表于 2005-1-23 17:25:00 | 显示全部楼层
……稍微解释下~
 楼主| 发表于 2005-1-23 17:33:00 | 显示全部楼层
我就写个等式吧:对于二进制数A=a1a2a3a4a5a56a7a8,A*B=a1*B*2^7+a2*B*s2^6+....+a8*B*2^0
程序就是从左往右加的,注意a1...a8都非0即1。其实还是小学时的乘法式,只不过顺序倒了下
发表于 2005-1-23 17:53:00 | 显示全部楼层
哦哦~谢谢啦~
 楼主| 发表于 2005-1-17 15:15:45 | 显示全部楼层 |阅读模式
说明:程序摘自http://www.6502.org/source/integers/ummodfix/ummodfix.htm

程序实现一个32位的被除数除以一个16位除数

To start, the 32-bit dividend is in N+2 (byte 2), N+3 (byte 1, or hi byte), N+4 (byte 4, or lo byte), & N+5 (byte 3).


The 16-bit divisor is in N+0 and N+1 (lo byte first, as is usual for the 6502). "N" is the beginning address of a small scratchpad area of RAM.


At the end, the 16-bit quotient is in N+4 & N+5, and 16-bit remainder is in N+2 & N+3 both with low byte first, as usual for 6502, like the divisor shown above. In other words, the remainder and quotient end up in the same memory bytes that originally held the dividend.

;×××××××××××××××××××××××××××××××××××

Division:
          SEC
          LDA N+2
          SBC N
          LDA N+3
          SBC N+1
          BCS Overflow
          LDX #$11
loop:     

          ROL N+4
          ROL N+5
          DEX
          BEQ end
          ROL N+2
          ROL N+3
          LDA #$00
          STA carry
          ROL carry
          SEC
          LDA N+2
          SBC N
          STA N+6
          LDA N+3
          SBC N+1
          TAY
          LDA carry
          SBC #$00
          BCC loop
          LDA N+6
          STA N+2
          STY N+3
          BCS loop
Overflow:

          LDA #$ff
          STA N+2
          STA N+3
          STA N+4
          STA N+5
end:     

          RTS






[此贴子已经被作者于2005-1-17 15:22:37编辑过]

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-20 05:32 , Processed in 0.010701 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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