簡體   English   中英

易68k。 如何在循環中正確使用索引?

[英]Easy68k. How can i use the index correctly in a loop?

ORG $400400
COUNT   DC.B 4
NUM1    DC.B $4E,$57,$29,$5A,$3B  
NUM2    DC.B $31,$D4,$55,$E0,$9B


       ORG $400410
SUBRTN MOVE.B $400401,D0
   LEA $400405,A0
   LEA $400410,A1
LOOP
   ADDX -(A0),-(A1)
   DBRA D0,LOOP
      END $400410 

所以我有這個代碼,我想在我的 nums1 末尾使用一個索引(A0)(偏移 $400405),在我的 nums 2 末尾使用一個索引(A1)(偏移 $400410),我想創建一個添加索引 (ADDX -(A0),-(A1)) 並將添加結果按降序存儲到我的 nums2 末尾的循環 ($400405,$400404,$400403 等)

另外我認為我需要為我的 5 個循環使用 DBRA,但我有點卡住了,因為我缺乏在 68k 上編程的經驗

注意:運行此代碼會給我錯誤“地址錯誤:400422 處的指令訪問地址 400403”

我相信沒有限定符的ADDX正在做ADDX.L (或ADDX.W )。 嘗試改寫ADDX.B

匯編程序可能不接受ADDX.B ,因為各種在線文本似乎不同意 ADDX.B 是否存在。 (不過,機器代碼中似乎有它的編碼。)

地址 $400403 的出現是因為處理器將保存 $400405 的A0預遞減 2 個字節以訪問 16 位字(可能是 16 位總線上獲取長字所需的 2 個字訪問的一部分)。 在 MC68k 系列處理器(如果不是全部的話)中,奇數地址不能與 16 位數據或 32 位數據一起使用,因此例外。

來自http://www.tigernt.com/onlineDoc/68000.pdf

ADDX 指令用於鏈式算術以將字節串(字或長字)相加。 考慮添加兩個 128 位數字,每個數字都存儲為四個連續的長字。

 LEA Number1,A0 A0 points at first number LEA Number2,A1 A1 points at second number MOVEQ #3,D0 Four longwords to add MOVE #$00,CCR Clear X-bit and Z-bit of the CCR LOOP ADDX -(A0),-(A1) Add pair of numbers DBRA D0,LOOP Repeat until all added

讓我們做一些觀察:

  1. 未經修飾的ADDX用於執行 32 位算術。

  2. DBRA D0, LOOP遞減 16 位寄存器d0.w — 但您正在將一個字節加載到d0.b中,這意味着d0.w的高 8 位在技術上是未定義的(盡管模擬器可能已將所有寄存器啟動為最初為零) . 他們使用的moveq指令初始化了完整的 32 位寄存器d0.l

  3. 您正在將值 $4E 加載到d0.b (而不是 4)中,因為地址中有一個 off by 1 錯誤。

  4. 上面的示例使用move #$00, CCR在循環開始之前積極清除X位,該循環使用通過ADDX的擴展算術。

暫無
暫無

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

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