繁体   English   中英

如何在6502 asm中将16位数除以2?

[英]How to divide 16bit number by 2 in 6502 asm?

我想将16位数除以2。 我对这个问题的解决方案如下

    lda $17 ;set high byte
    ldx $32    ;set low byte

divide:
    PHA         ;push A to stack        
    TXA         ;X > A  
    LSR         ;divide low byte by 2   
    TAX         ;A > X

    PLA         ;pull A from stack  
    LSR         ;divide high byte by 2
    BCC +       ;C=0, skip

    PHA         ;while C=1
    TXA         ;add $80 to the lsb
    ADC #$80
    TAX
    PLA 
+   
    +printDecimal $0400+120

所有PHA/PLA技巧都是因为我的printDecimal宏从A读取MSB而从X读取LSB。

当我在网上检查替代品时,我发现了4条指令替代我的简单划分程序。 但我不明白。

div2:
    LDA counter_hi       ;Load the MSB
    ASL                  ;Copy the sign bit into C
    ROR counter_hi       ;And back into the MSB
    ROR counter_lo       ;Rotate the LSB as normal

    LDA counter_hi
    LDX counter_lo      
    +printDecimal $0400+40    

这是怎么回事?

除以2(无符号数)除以将所有位向右移位一位。 例如,数字100以二进制表示:

01100100

将所有位置向右移动产生

00110010

这是50的二进制表示。

ROR命令将所有位置向右移动。 字节的新MSB将等于进位标志的旧值,而进位标志的新值将等于字节的旧LSB。

如果16位数字是无符号的,则将数字的高字节和低字节向右移动就足够了:

LSR counter_hi
ROR counter_lo

LSR和ROR都将它们的参数向右移动,但LSR使counter_hi的MSB为0并将counter_hi的LSB移入进位标志,而ROR使counter_lo的MSB等于counter_hi的(旧)LSB。

如果数字已签名,则需要存储符号位并确保新数字的符号位相同。 这就是你引用的代码的前两个命令。 请注意,这是有效的,因为数字存储在二进制补码中

它的作用就像代码中的注释所说的那样;)在6502中,遗憾的是没有算术右移,这会使符号位保持不变。 所以需要模仿。 为此,首先从高位字中提取符号位。 请注意,这是使用累加器完成的,因此原始值不会更改。 ROR用于高位字,它通过进位标志旋转扩展操作数所产生的9位值。 因此,当前在CF中的符号位将旋转到MSB中,其余位将向右移位,LSB将在CF中结束。 这完成了签署的部门。 低字上的第二个ROR只是将LSB从高字转换为低字的MSB,并将其余的位右移。

(显然你知道向右移动N位除以2 ^ N,同样左移位乘以2)

这个参考

ASL将hi字节counter_hi的最高有效位(MSB)放入进位寄存器(以便在我们移位时记住符号 - 除以正整数(2)不会改变我们16位数的原始符号) 。

ROR counter_hicounter_hi向右移1位。 重要的:

进位转移到第7位,原始位0转移到进位。

这有两个目的 - 保留原始符号,并且还将第二个RORcounter_hi的LSB转移

然后, ROR counter_lo对低字节执行相同操作。 counter_hi的LSB现在被移入counter_lo的MSB

如果我没记错的话,ROR和ROL会按照规定的方向移位位,最低有效位(对于ROR)和最高有效位(对于ROL)会移入进位标志。

自从我查看任何6502以来已经过了大约25年,但对我来说并不是很清楚,但这就是我认为它会立即完成的方式。

编辑:此外,在ROR和ROL中,进位标志的现有状态被传送到累加器的最低/最高有效位。

不记得指令的所有寻址模式,但也许这样就可以了:

LSR
PHA
TXA
ROR
TAX
PLA

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM