gpt4 book ai didi

assembly - 如何在6502汇编中将16位数字除以2?

转载 作者:行者123 更新时间:2023-12-02 21:37:42 25 4
gpt4 key购买 nike

我想将 16 位数字除以二。我的问题解决方案如下

    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。

如果数字有符号,则需要存储符号位并确保新数字的符号位相同。这就是您引用的代码的前两个命令的作用。请注意,这是有效的,因为该号码存储在 two's complement 中。 .

关于assembly - 如何在6502汇编中将16位数字除以2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27382365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com