如何使用1种寻址模式通过装载加载两个存储值?

时间:2017-11-09 17:32:30

标签: assembly 6502

我想添加两个存储的值x和y,但我只想使用1种寻址模式 以下是示例:

compdef

3 个答案:

答案 0 :(得分:4)

6502上的添加仅在累加器中完成。

  • 在累加器中加载第一个数字
  • 将第二个数字添加到累加器
  • 将累加器存储在内存中

Z = X + Y

lda x
add y
sta z  ;Leaves x and y unchanged

X = X + Y

lda x
add y
sta x

X = Y + X

您的程序所产生的结果与我的第二个代码段相同。你添加的顺序并不重要(对于减法来说并不重要!)请注意,使用x加载累加器是没用的,只能在y之后直接重新加载它!

lda x   ;This is useless
lda y
add x
sta x

作为others have commented,6502指令集中没有add指令,也没有sub指令。但是我愿意给你怀疑的好处,因为定义一些宏是完全可以的,以避免每次你开始新的时候写clcsec加法或减法。

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

其中xy例如可以是绝对地址。

但是意识到的进位标志!如果您无法知道进位状态,则首先需要clc清除进位)指令。如果知道将设置进位,并且y是立即值,则只需添加一个。如果你不能这样做,你也需要clc

一般情况下,总是尽量避免使用clc(这需要一个字节和一些周期,这对于这样一个有限的芯片确实很重要),但有时你需要它。 / p>

可以避免clcdouble 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

需要的代码的实际示例 clclong 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