[英]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.