跳轉到內容

68000 彙編/定址模式

來自華夏公益教科書,開放的書籍,開放的世界

定址模式

[編輯 | 編輯原始碼]

n 是一個介於 0 到 7 之間的數字,表示要使用的哪個暫存器。

資料暫存器立即定址

[編輯 | 編輯原始碼]

彙編語法

  • Dn

直接操作資料暫存器的內容。例如

MOVE.L D1,D0

將 D1 的內容複製到 D0。執行指令時,兩個暫存器都將包含相同的資訊。在移動位元組或字時,暫存器的上半部分將保持不變。

              ;lets assume
              ;D0=FFFFFFFF D1=01234567
 MOVE.B D1,D0 ;copies a Byte from source
              ;D0=FFFFFF67 D1=01234567
....
              ;lets assume
              ;D0=FFFFFFFF D1=01234567
 MOVE.W D1,D0 ;copies a Word from source
              ;D0=FFFF4567 D1=01234567

地址暫存器立即定址

[編輯 | 編輯原始碼]

彙編語法

  • An

直接操作地址暫存器的內容。 例如

MOVE.L A1,D0

將整個 A1 複製到 D0。執行指令後,兩個暫存器都包含相同的資訊。在使用地址暫存器傳輸時,必須使用字或長字。當字傳輸到地址暫存器時,位 15(符號位)將被複制到整個上半字(位 16-31)。如果不是這樣,負數會變成正數。

              ;lets assume
              ;D0=FFFFFFFF A1=01234567
 MOVE.W A1,D0 ;copies a Word from source
              ;D0=FFFF4567 A1=01234567
....
              ;lets assume
              ;D0=01234567 A1=FFFFFFFF
 MOVE.W D0,A1 ;copies a Word from source
              ;D0=01234567 A1=00004567
              ; sign to A1, changed
....
              ;lets assume
              ;D0=0000FFFF A1=00000000
 MOVE.W D0,A1 ;copies a Word from source
              ;D0=0000FFFF A1=FFFFFFFF
              ; sign to A1, changed

間接定址

[編輯 | 編輯原始碼]

彙編語法

  • (An)

操作 An 指向的記憶體位置。例如

lea $1234,A1
move.w D0,(A1)

將 D0 的前 16 位移動到從 $1234 開始的字。另一個例子

MOVE.L (A0),D0

複製從 A0 中儲存的地址位置開始的長字(你說 A0 指向長字)。如果引用一個字或長字,地址暫存器中的地址必須是偶數。小心這一點!!!

                ;lets assume
                ;D0=FFFFFFFF A1=00001000
                ;mem.addr. $1000=01234567
 MOVE.L (A1),D0 ;copies Long word starting at memory address stored in A1, to D0
                ;D0=01234567 A1=00001000
                ;mem.addr. $1000=01234567

後遞增間接定址

[編輯 | 編輯原始碼]

彙編語法

  • (An)+

與間接定址相同,但在執行指令後,An 將增加操作的大小。唯一的例外是對 A7 的位元組操作 - 該暫存器必須指向偶數地址,因此它始終至少增加 2。例如

MOVE.L (A1)+,D0

將 A1 指向的長字複製到 D0,並將 A1 增加 4(因為是長字)。

                 ;lets assume
                 ;D0=FFFFFFFF A1=00001000
                 ;mem.addr. $1000=01234567
 MOVE.L (A1)+,D0 ;copies the Long word starting at address stored in A1, to D0
                 ;then increment A1 by 4
                 ;D0=01234567 A1=00001004
                 ;mem.addr. $1000=01234567

前遞減間接定址

[編輯 | 編輯原始碼]

彙編語法

  • -(An)

與間接定址相同,但在執行指令之前,An 將減少操作的大小。唯一的例外是對 A7 的位元組操作 - 該暫存器必須指向偶數地址,因此它始終至少減少 2。請注意,沒有後遞減或前遞增定址模式。例如

MOVE.L -(A0),D2

首先將 A0 減少 4(運算元的大小),然後將 A0 中儲存的地址開始的長字複製到 D2。

                 ;lets assume
                 ;D0=FFFFFFFF A1=000010A8
                 ;mem.addr. $10A4=01234567
 MOVE.L -(A1),D0 ;first decrements A1 by 4, A1=000010A4
                 ;then copies the Long word starting at address stored in A1, to D0
                 ;D0=01234567
                 ;mem.addr. $10A4=01234567

帶位移量間接定址

[編輯 | 編輯原始碼]

彙編語法

  • x(An)
  • (x)(An)
  • (x,An)

操作 x + An 指向的位置,其中 x 是一個 16 位立即值。所有列出的語法都是等效的,但一些彙編器不會接受所有語法。

帶索引間接定址

[編輯 | 編輯原始碼]

彙編語法

  • x(An,Dn.W)
  • x(An,Dn.W*scale)
  • x(An,Dn.L)
  • x(An,Dn.L*scale)
  • x(An,An.W)
  • x(An,An.W*scale)
  • x(An,An.L)
  • x(An,An.L*scale)
  • (x)(An,Dn.W)
  • (x)(An,Dn.W*scale)
  • (x)(An,Dn.L)
  • (x)(An,Dn.L*scale)
  • (x)(An,An.W)
  • (x)(An,An.W*scale)
  • (x)(An,An.L)
  • (x)(An,An.L*scale)
  • (x,An,Dn.W)
  • (x,An,Dn.W*scale)
  • (x,An,Dn.L)
  • (x,An,Dn.L*scale)
  • (x,An,An.W)
  • (x,An,An.W*scale)
  • (x,An,An.L)
  • (x,An,An.L*scale)

與上面相同,但另一個暫存器也將被新增。比例可以是 1、2、4 或 8。並非所有裝置都支援比例。並非所有彙編器都接受所有列出的語法。

絕對近定址

[編輯 | 編輯原始碼]

彙編語法

  • (xyz).W
  • xyz.W

操作由彙編器符號擴充套件的 xyz 等字母指向的位置。你可以用或不用括號寫這個,大多數彙編器都可以接受這兩種寫法。你選擇哪一種很大程度上是個人喜好,但大多數人發現 (xyz).W 更易讀。

絕對遠定址

[編輯 | 編輯原始碼]

彙編語法

  • (xyz).L
  • xyz.L

操作由彙編器符號擴充套件的 xyz 等字母指向的位置。一些指令只接受近或遠絕對地址中的一個,因此存在這種區別。與絕對近定址類似,你可以根據自己的意願包含括號。

程式計數器間接帶位移量

[編輯 | 編輯原始碼]

彙編語法

  • x(PC)
  • (x)(PC)
  • (x,PC)

操作 x + PC 的記憶體值,其中 x 是一個 16 位立即值。請注意,PC 是儲存 x 的擴充套件字的地址(緊接在指令字之後)。所有語法都是等效的,但一些彙編器不會接受所有語法。

程式計數器間接帶索引

[編輯 | 編輯原始碼]

彙編語法

  • x(PC,Dn.W)
  • x(PC,Dn.W*scale)
  • x(PC,Dn.L)
  • x(PC,Dn.L*scale)
  • x(PC,An.W)
  • x(PC,An.W*scale)
  • x(PC,An.L)
  • x(PC,An.L*scale)
  • (x)(PC,Dn.W)
  • (x)(PC,Dn.W*scale)
  • (x)(PC,Dn.L)
  • (x)(PC,Dn.L*scale)
  • (x)(PC,An.W)
  • (x)(PC,An.W*scale)
  • (x)(PC,An.L)
  • (x)(PC,An.L*scale)
  • (x,PC,Dn.W)
  • (x,PC,Dn.W*scale)
  • (x,PC,Dn.L)
  • (x,PC,Dn.L*scale)
  • (x,PC,An.W)
  • (x,PC,An.W*scale)
  • (x,PC,An.L)
  • (x,PC,An.L*scale)

類似於 PC 帶位移,但還會新增另一個暫存器。比例可以是 1、2、4 或 8。並非所有裝置都支援比例。某些彙編器不接受某些語法。

記憶體間接定址

[編輯 | 編輯原始碼]

彙編語法

  • ([bd,An],od)
  • ([bd,An],An.W*scale,od)
  • ([bd,An],An.L*scale,od)
  • ([bd,An],Dn.W*scale,od)
  • ([bd,An],Dn.L*scale,od)
  • ([bd,An,An.W*scale],od)
  • ([bd,An,An.L*scale],od)
  • ([bd,An,Dn.W*scale],od)
  • ([bd,An,Dn.L*scale],od)
  • ([bd,PC],od)
  • ([bd,PC],An.W*scale,od)
  • ([bd,PC],An.L*scale,od)
  • ([bd,PC],Dn.W*scale,od)
  • ([bd,PC],Dn.L*scale,od)
  • ([bd,PC,An.W*scale],od)
  • ([bd,PC,An.L*scale],od)
  • ([bd,PC,Dn.W*scale],od)
  • ([bd,PC,Dn.L*scale],od)

這些定址模式執行兩次記憶體訪問 - 首先讀取到地址表中,其次是實際讀取或寫入。並非所有裝置都支援。在記憶體間接預索引模式下,CPU 將首先讀取 bd+An+Rn*scale,然後新增 od,並將結果值用作最終讀取或寫入的地址。在記憶體間接後索引模式下,CPU 將首先讀取 bd+An,然後新增 Rn*scale+od,並將結果值用作最終讀取或寫入的地址。

立即定址

[編輯 | 編輯原始碼]

彙編語法

  • #xyz

對 xyz 進行操作。

狀態暫存器定址

[編輯 | 編輯原始碼]

彙編語法

  • SR
  • CCR

SR 是整個狀態暫存器,包括系統位元組。CCR 只是標誌位。除此之外,我不知道它如何工作。SR 僅在監控模式下可用。

唯一允許使用此定址模式的指令是:MOVE、ANDI(與立即)、EORI(異或立即)和 ORI(或立即),稱為:MOVE 到/從 CCR、MOVE 到/從 SR、ANDI 到 CCR、ORI 到 CCR、EORI 到 CCR、ANDI 到 SR、ORI 到 SR、EORI 到 SR。

           ;Example ORI to CCR
           ;lets assume CCR=$00
ORI #5,CCR ;sets both the carryflag (C) and the zeroflag (Z)
           ;CCR = $05 -> 00000101
           ;most assemblers recognize both SR and CCR
           ;so you don't have to specify the length of operand.
華夏公益教科書