问题代码:
; Copy all the values which are divisible by four to a starting address $1600.
; The indivisible by four is pushed onto the stack, and use the effective address
; to pull them out after finishing the loop. The starting address is $1650.
; Array pointer starts from the beginning, and using DBNE to decrement the loop
N equ 12
org $1600
fill 0,128 ; each row in the memory displays 16 bytes
cnt rmb 1 ; indivisible counter
org $1ff0
fill 0,16
org $2000 ; start RAM address
lds #$2000 ; initialize the stack pointer
ldy #$1600 ; load the starting address for divisible by 4
ldx #array ; load the starting address of array to Reg. X
ldaa #N ; use B as the loop counter, B = N
clr cnt ; clear cnt counter
loop brclr 0,x,$03,yes ; if bits 1 & 0 are 0s, then branch to yes
ldab 1,x+
inc cnt ; increment cnt counter for indivisible
pshb ; push onto the stack for the indivisible
bra chkend
yes movb 1,x+,1,y+ ; copy the divisible by 4 value to a new location
chkend dbne a,loop ; decrement B by 1, if B NE 0, branch to loop
; use the effective address to load/pull the elements from the stack
ldy #$1650
ldx #$1fff ; first available address for the stack
ldaa cnt
loop2 movb 1,x-,1,y+ ; stack is first in last out
dbne a,loop2
swi
array db 3,4,9,12,19,20,24,31,48,53,64,72
end
我正在学习微处理器,我的教授给了我们这个代码来修改,但我不确定如何修改。这是我们第一次用汇编语言“编程”。
他还来帮我们这个忙:
EEEN 3449
Lab 4c:
• idiv => Accumulator D / Register X, the remainder refreshes to D
• Register X has the constant 3.
• Register Y is utilized as the array pointer.
• Although there is nothing stored in Accumulator A, A:B => D
• You can use Accumulator B as the loop counter, and store the
starting address for divisible by 3.
• In the beginning of the loop, you have to store loop counter value in
another temporary address, like $15FE.
• clr A, and ldab 0,y will generate [D] = [0 : 1st array element]
• Carry out the idiv and compare Accumulator D with 0.
• If Accumulator D is non-zero, push the accumulator B onto the stack.
• If Accumulator D is zero, reload the updated address for divisible by 3.
• After sorting out the array element where to store them, reload the
loop counter from $15FE, and increment the array pointer.
• Then use dbne b,loop to execute the next iteration.
由于不知道汇编,我不知道如何使用它来正确地更改代码。
显示的代码是拉的数字是可被4整除,并把他们放在内存中的$1600,我想。我需要改变这个代码,使它拉的数字是可被3整除。没有线索从哪里开始,并开始测试,因为我不知道一个完整的汇编很多。
如果你能帮助我理解正在发生的事情,任何帮助都是很好的。我确实想学习,但是我似乎找不到很多关于汇编的东西。
我试过自己测试东西,但我总是得到错误,不知道他们在哪里,也不知道如何修复他们。
1条答案
按热度按时间91zkwejq1#
该代码测试目标字节(由
X
寄存器引用)的低两位是否为零。这两位都为零意味着该数字可被4整除。当条件为真时,程序将控制权转移到标签yes
-所有这些操作都在一条指令brclr
中完成。为了将可被4整除变为可被3整除,我们应该在一个以条件分支结束的序列中使用
idiv
,该条件分支与brclr
具有相同的效果--即当相关条件成立时分支到标签yes
,否则失败。D
寄存器D
寄存器是16位寄存器的别名,该16位寄存器由8位A
和B
寄存器配对而成。 HCS12是高位字节序,A
是高位字节序,而B
是D
对的低位字节序(这种配对是架构固有的,您不必做任何其他事情来利用它)。B
,并确保A
清零(零),以便将别名寄存器D
中的无符号字节数据从8位扩展到16位。B
的字节数据由X
寄存器引用。LDAB
的指令(但您还需要确保A
已清除,因此例如使用0加载它)。X
寄存器。idiv
,剩余部分将位于D
中yes
。D
与设置标志的0进行比较,并且如果比较结果为零,则第二指令分支到标记yes
,例如使用BEQ
(并且如果比较失败,则它将失败,就像brclr
福尔斯时一样。存在一些寄存器冲突:为了使用
idiv
,您需要直接使用X
寄存器,但是代码已经将X
用于其他用途。建议在加载X
之前使用3将X
压入堆栈,然后将其弹出,以便您可以保持其余代码不变。看起来A
也是如此,它保存该算法中的计数,但也需要重新调整用途以使用idiv
。您的说明提供了一些您可以选择遵循的替代建议(而不是推送和弹出)。