簡體   English   中英

68K匯編,如何復制數據寄存器的前4位

[英]68K Assembly, how to copy the first 4 bits of a data register

假設任意數據寄存器包含值“ 000E0015”。 如何將前4位(000E)復制到另一個數據寄存器?

您需要提供更多信息才能獲得良好的答案。

首先,000E0015是32位值。 “前四個”位可能意味着最高有效位,即領先於此的0。 或者它可能意味着最低的4位,即5。或者您可能意味着鍵入的內容-000E-即前16位(每個四位組稱為“半字節”)。

其次,您想要的最終狀態是什么? 如果您在寄存器中以000E0015開頭,並且目標寄存器中有XXXXXXXX,您是否希望它為000EXXXX,並保留這些值? 您認為它是000E0000嗎? 還是您想要寄存器為0000000E之類的東西?

我將假設,除非您另外聲明,否則您希望第二個寄存器按照您的聲明獲得000E。 在這種情況下,假設您從d0開始並想轉到d1:

move.l  d1,d0
swap    d1   

這將首先將整個32位寄存器復制到d1,然后將交換字。 d1將包含0015000E。 如果要清除它們,則可以將d1與0000FFFF進行與。 如果希望它們包含以前做的任何事情,則可以先在中間寄存器中准備0000000E,然后通過與FFFF0000進行與運算來清除低位,然后使用OR-從中間寄存器中引入0000000E,但我不是非常確定您到底需要什么。

您想要的是最高有效字,而不是前4位,因此需要32位值中的最高有效16位。 有幾種方法可以做到這一點。 如果您只打算將該單詞作為一個單詞來處理,而忽略數據寄存器中的其他任何內容,則可以安全地使用swap。

move.l #$000E0015,d0   ; so this example makes sense :)
move.l d0,d1  ; Move the WHOLE value into your target register
swap d1   ; This will swap the upper and lower words of the register

在此之后,d1將包含#$ 0015000E,因此,如果僅以字尋址,則將純粹訪問數據寄存器的$ 000E部分。

move.w d1,$1234  ; Will store the value $000E at address $1234

現在,如果您打算使用其余的數據寄存器,或對此進行擴展到第一個字以外的操作,則需要確保高位字是清楚的。 您可以很容易地做到這一點,首先使用lsr.l而不是使用swap

move.l #$000E0015,d0   ; so this example makes sense :)
move.l d0,d1  ; Move the WHOLE value into your target register
moveq  #16,d2  ; Number of bits to move right by
lsr.l  d2,d1  ; Move Value in d1 right by number of bits specified in d2

您不能使用lsr.l#16,d1,因為lsX.l的立即數限制為8,但是您可以在另一個寄存器中最多指定32,然后以這種方式執行操作。

較干凈的(IMHO)方法(除非多次重復此操作)是在交換后使用AND清除寄存器。

move.l #$000E0015,d0 ; so this example makes sense :)
move.l d0,d1         ; Move the WHOLE value into your target register
swap   d1            ; This will swap the upper and lower words of the register
and.l  #$ffff,d1     ; Mask off just the data we want

這將從d1寄存器中刪除所有不適合邏輯掩碼的位。 IE位在d1和指定的模式($ ffff)中都設置為true

最后,我認為執行此任務的最有效,最簡潔的方法是使用clr和swap。

move.l #$000E0015,d0 ; so this example makes sense :)
move.l d0,d1         ; Move the WHOLE value into your target register
clr.w  d1            ; clear the lower word of the data register 1st
swap   d1            ; This will swap the upper and lower words of the register

希望這些對您有所幫助? :)

暫無
暫無

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

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