assembly 如何将此代码从可被4整除的数字更改为可被3整除的数字?微处理器的汇编

wz1wpwve  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(119)

问题代码:

; 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整除。没有线索从哪里开始,并开始测试,因为我不知道一个完整的汇编很多。
如果你能帮助我理解正在发生的事情,任何帮助都是很好的。我确实想学习,但是我似乎找不到很多关于汇编的东西。
我试过自己测试东西,但我总是得到错误,不知道他们在哪里,也不知道如何修复他们。

91zkwejq

91zkwejq1#

该代码测试目标字节(由X寄存器引用)的低两位是否为零。这两位都为零意味着该数字可被4整除。当条件为真时,程序将控制权转移到标签yes-所有这些操作都在一条指令brclr中完成。
为了将可被4整除变为可被3整除,我们应该在一个以条件分支结束的序列中使用idiv,该条件分支与brclr具有相同的效果--即当相关条件成立时分支到标签yes,否则失败。

  • 首先,将要测试的数字放入D寄存器
  • 为此,您需要知道D寄存器是16位寄存器的别名,该16位寄存器由8位AB寄存器配对而成。 HCS12是高位字节序,A是高位字节序,而BD对的低位字节序(这种配对是架构固有的,您不必做任何其他事情来利用它)。
  • 由于您的数据是字节数据(不是16位数据),因此需要将其加载到B,并确保A清零(零),以便将别名寄存器D中的无符号字节数据从8位扩展到16位。
  • 此外,您还需要注意,要放入B的字节数据由X寄存器引用。
  • 因此,您将使用类似LDAB的指令(但您还需要确保A已清除,因此例如使用0加载它)。
  • 然后将常量3放入X寄存器。
  • 完成设置后,执行idiv,剩余部分将位于D
  • 做一个类似于被4整除的分支,但首先测试D = 0,在这种情况下,分支到标签yes
  • 这将需要2指令序列,其中第一指令将D与设置标志的0进行比较,并且如果比较结果为零,则第二指令分支到标记yes,例如使用BEQ(并且如果比较失败,则它将失败,就像brclr福尔斯时一样。

存在一些寄存器冲突:为了使用idiv,您需要直接使用X寄存器,但是代码已经将X用于其他用途。建议在加载X之前使用3将X压入堆栈,然后将其弹出,以便您可以保持其余代码不变。看起来A也是如此,它保存该算法中的计数,但也需要重新调整用途以使用idiv。您的说明提供了一些您可以选择遵循的替代建议(而不是推送和弹出)。

相关问题