需要帮助向后搜索内存位置(汇编语言)

Need help searching memory locations backwards (Assembly Language)

问题:编写一个汇编语言程序,使用 向后搜索内存的循环 位置 E001h - E0FFh 包含的位置 零并将总数放入位置 0500h。 让程序从内存中的 0200h 开始。 Assemble程序,载入模拟器, 运行 它,并验证它是否正常工作。


    org 0200h

    ldx #0d
    stx 0500h
Loop:
    lda 0e001h,x

    cmp #0d
    bne NoZ

    inc 0500h

NoZ:
    dex

    bne Loop

    brk 

    end

我不太熟悉低级编程,所以我(相信)我设法做到了这一点,但我正在努力向后搜索内存位置。

即兴尝试,感觉可能有更快的方法...

    ldy #[=10=]     ; set .Y = 0 (count of zeros)
    ldx #[=10=]     ; set .X = 0 (address offset)
loop:
    dex          ; X = X - 1 (so $FF on first iteration)
    beq done     ; quit when .X hits 0
    lda $E000,x  ; get byte at $E000 + .X
    bne loop     ; go around if not 0
    iny          ; .Y = .Y + 1
    bne loop     ; go around (.Y can't be zero)
done:
    sty 00    ; store count in .Y at 00
    brk          ; GTFO

编辑:有 :)

    ldy #[=11=]     ; set .Y = 0   (count of zeros)
    ldx #$FF     ; set .X = 255 (address offset)
loop:
    lda $E000,x  ; get byte at $E000 + .X
    bne sub1     ; skip counter increment if not zero
    iny          ; .Y = .Y + 1
sub1:
    dex          ; .X = .X - 1
    bne loop     ; quit when .X hits zero
    sty 00    ; store count in .Y at 00
    brk          ; GTFO

您的原始代码还不错,但是有一个错误。 X 回绕到 FF 所以你检查 E100.

    org 0200h
    ldx #0d      ;I'm assuming this is 0 in an unusual decimal notation
    stx 0500h
Loop:
    lda 0e001h,x ;x is 0,FF,FE...1. So E001,E100(bug),E0FF...E002
    cmp #0d
    bne NoZ
    inc 0500h
NoZ:
    dex          ;x will wrap from 0 to FF
    bne Loop     ;x goes down to 1 (x=0 will break the loop)
    brk 
    end

如果这是家庭作业,那么您的讲师实际上会帮助您取得成功。反向计数时,汇编中的循环通常更自然、更小、更快。

    org 0200h
    ldx #0d
    stx 0500h    ;Initialize 0500 to 0
    dex          ;x starts at FF
Loop:
    lda 0e000h,x ;Base address E000 and x is FF,FE...1. So E0FF,E0FE...E001
    cmp #0d
    bne NoZ
    inc 0500h
NoZ:
    dex
    bne Loop     ;x goes down to 1 (x=0 will break the loop)
    brk 
    end

下一个优化是根据八位大师的回答使用 y 进行计数。