我想添加两个存储的值x和y,但我只想使用1种寻址模式 以下是示例:
compdef
答案 0 :(得分:4)
6502上的添加仅在累加器中完成。
lda x
add y
sta z ;Leaves x and y unchanged
lda x
add y
sta x
您的程序所产生的结果与我的第二个代码段相同。你添加的顺序并不重要(对于减法来说并不重要!)请注意,使用x加载累加器是没用的,只能在y之后直接重新加载它!
lda x ;This is useless
lda y
add x
sta x
作为others have commented,6502指令集中没有add
指令,也没有sub
指令。但是我愿意给你怀疑的好处,因为定义一些宏是完全可以的,以避免每次你开始新的时候写clc
和sec
加法或减法。
add
使用现代FASM语法的示例:
macro add op
{
clc
adc op
}
sub
使用非常旧的METACOMCO语法的示例:
sub MACRO
sec
sbc \1
ENDM
答案 1 :(得分:4)
如果这应该是6502代码,则添加的操作码为adc
,这意味着" 添加进位"。没有进位的没有添加操作。
lda
使用值加载累加器,因此直接序列中的两个lda
完全没用。只需使用一个lda
后跟一个adc
(它会将您向地址添加的任何内容添加到并添加进位标记)。
总而言之,序列看起来就像:
lda x
adc y
sta x
其中x
和y
例如可以是绝对地址。
但是是意识到的进位标志!如果您无法知道进位状态,则首先需要clc
(清除进位)指令。如果知道将设置进位,并且y
是立即值,则只需添加一个。如果你不能这样做,你也需要clc
。
一般情况下,总是尽量避免使用clc
(这需要一个字节和一些周期,这对于这样一个有限的芯片确实很重要),但有时你将需要它。 / p>
可以避免clc
(double dabble实现的一部分)的代码的真实示例:
nts_addloop: lda nc_string,x
cmp #$5 ; value >= 5 ?
bcc nts_noadd ; after not branching here, we know C=1
adc #$2 ; then add 3 (2 + carry)
sta nc_string,x
nts_noadd: dex
需要的代码的实际示例 clc
(long multiplication实现的一部分):
mul_rorloop: ror mpm_arg1,x
dex
bpl mul_rorloop
bcc mul_noadd ; we know carry is set when not branching
ldx #($80-NUMSIZE)
clc ; clear it because we have to add a variable value
mul_addloop: lda mpm_arg2+NUMSIZE-$80,x
adc mpm_res+NUMSIZE-$80,x
sta mpm_res+NUMSIZE-$80,x
inx
bpl mul_addloop
mul_noadd: ldx #($81-NUMSIZE)
答案 2 :(得分:4)
以下模式是否正确?怎么了?
没有。
ADD
指令ADC
添加随身携带如果你有两个内存位置x和y并且你想将结果存储在x中,那么执行此操作的一种方法是:
; x = x + y
LDA x ; Load one operand into the accumulator.
CLC ; Clear the carry flag so it does not get added into the result
ADC y ; Add the other operand
STA x ; Store the operand back to x
您可以使用y的任何地址模式和x的任何地址模式,除了立即。
如果x和y是16位值的地址,则16位加法将如下所示:
LDA x ; Load one operand into the accumulator.
CLC ; Clear the carry flag so it does not get added into the result
ADC y ; Add the other operand
STA x ; Store the operand back to x
LDA x+1 ; Now do the high byte
ADC y+1 ; Note we do not clear the carry this time.
STA x+1