需要帮助向后搜索内存位置(汇编语言)
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 进行计数。
问题:编写一个汇编语言程序,使用 向后搜索内存的循环 位置 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 进行计数。