簡體   English   中英

如何進行 BSR SUBR,並定義代碼的 SUBR 部分?

[英]How do I do the BSR SUBR, and define the SUBR part of the code?

問題

該程序應該執行以下操作:

  1. 將存儲在地址 label DATA 的前 6 個數據項($1 到 $6)相加。
  2. 將前 6 個數據項的總和存儲到地址 label SUM1。
  3. 將存儲在地址 label SUM1 的和乘以 8,並將結果存儲在地址 label MUL8 中。 (循環然后添加)
  4. 將存儲在地址 label DATA 的最后 6 個數據項($7 到 $C)相加。
  5. 將最后 6 個數據項的總和存儲到地址 label SUM2。
  6. 將存儲在地址 label SUM2 中的和除以 4,並將結果存儲在地址 label DIV4 中。

如何執行BSR SUBR並定義代碼的SUBR部分?

如果不查閱程序員參考手冊,您將無法解決此任務
對於已經執行“分支到子程序”( BSR ) 的BSR SUBR指令,真的沒有什么可做的了。 定義SUBR部分只是寫下指令,這些指令將執行任務描述中概述的六個步驟,然后執行“從子程序返回”( RTS )。

為了讓您順利上路,這里是第 1 步的詳細說明

  1. 將存儲在地址 label DATA 的前 6 個數據項($1 到 $6)相加。

為了從數組中求和6個字節,我們可以將第一個字節加載到數據寄存器中,然后從循環中添加接下來的5個字節。

循環之前,我們:

  • 使用DATA label 的地址加載一個地址寄存器,如 A1。 movea.l #DATA, a1指令執行此操作。
  • 加載循環計數為 5 的數據寄存器(如 D1)。 moveq.l #5, d1指令執行此操作。 要加載 [-128,+127] 范圍內的小數字,總是更喜歡moveq而不是move ,因為它既更快又編碼更小。
  • 使用數組中的第一個字節加載另一個數據寄存器,如 D0。 move.b (a1)+, d0指令就是這樣做的。 因為該指令使用后遞增尋址方式,並且由於 size 屬性是byte ,所以 A1 地址寄存器中保存的地址會自動遞增 1。這樣我們就可以單步執行數組。

循環中,我們:

  • 將下一個字節添加到選定的 D0 數據寄存器。 add.b (a1)+, d0指令就是這樣做的。
  • 減少我們在 D1 數據寄存器中的循環計數。 subq.l #1, d1指令執行此操作。 要減去 [1,8] 范圍內的小數,總是更喜歡subq而不是sub / subi ,因為它具有更小的編碼並且比subi快得多。
  • 僅當循環計數器的減量未產生 0 時才分支回到循環的頂部。 bne.s loop1指令執行此操作。
    movea.l #DATA, a1
    moveq.l #5, d1
    move.b  (a1)+, d0
loop1:
    add.b   (a1)+, d0
    subq.l  #1, d1
    bne.s   loop1

我將進行下一步,因為它相當微不足道

  1. 將前 6 個數據項的總和存儲到地址 label SUM1。

步驟 1 將和留在 D0 數據寄存器中。 只需將其移至SUM1變量,但請務必根據SUM1變量的定義方式使用正確的大小標記,即.b

move.b   d0, SUM1

祝你順利完成第 3 步到第 6 步...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM