簡體   English   中英

匯編代碼 MC68k。 不知何故,一個寄存器被填滿了一個數字,即使我不想

[英]Assembler code MC68k . somehow a register is getting filled with a number even though I dont want to

所以我需要用匯編代碼寫這個。 我應該在 D3,D4 中的 J 和 D5 中的 K。 運行代碼時,一切正常,但 D2 中填充了 D4 中的信息。 這是為什么?

    ORG    $0
    DC.L   $8000
    DC.L   START
    ORG    $1000
    
START:  
               
    MOVE.W I,D3
    MOVE.W J,D4
    CMP.W  D4,D3
    BLT  LT
    BRA  ELSE

LT:

    MOVE #1,D5
    BRA  end
    
ELSE:

    MOVE #0,D5

end:

   *nothing should happen here, just want program to stop

* these are my variables and constants
 
I   DC   2

J   DC   14

    SIMHALT
    END    START        ; last line of source

您遇到的問題是您將數據作為指令執行。

您有以下注釋:

*這里什么都不應該發生,只是想讓程序停止

表示您不希望執行繼續超過該點。 但是,處理器不會這樣做。 如評論中所述,您希望將SIMHALT放在代碼的末尾(在end標簽之后),在數據之前。 沒有這個,處理器(模擬器)將繼續增加程序計數器並嘗試將數據作為代碼執行。

線條

I   DC   2
J   DC   14

將字節00 02 00 0E (big-endian,顯示為十六進制)插入到程序中。 拆卸它會得到以下組件:

ORI.B   #14,D2

這在常數值 14 和 D2 的當前值之間執行逐位字節大小的 OR,並將該值存儲到 D2 中。 如果 D2 開始時的值為 0,這會將 14 加載到該寄存器中。 D2 的初始值也可以設置任何位1110 (顯示最低有效 4 位)。

並不是 D4 的值被加載到 D2,而是您用來加載 D4 的常量恰好最終成為ORI.B的立即值。

如果你的常數不同,你會得到不同的生成指令。 您可能跳到了其他地方,什么也沒做,或者只是因為執行了無效指令而出錯。 只要第一個字節保持為00 ,指令就始終是ORI 第二個字節確定大小和有效地址。 將該值更改為03將立即與 D3 寄存器進行或。 在字節大小的操作中,不使用第三個字節。 第四個字節是立即字節。

你有end: label 你需要“陷阱”CPU,否則它將繼續並作為指令執行你的數據。 CPU 無法區分。 這是最簡單的方法,但如果不重置,您將無法從中恢復:

end:
jmp end

暫無
暫無

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

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