MARIE 嚴重依賴資料中的(全域)指標:它唯一的間接功能是通過 AddI、JumpI、LoadI 和 StoreI 來推遲記憶體位置。
例如,常見的順序是LoadI pointer取消參考,然后Load pointer; Add One; Store pointer推進指標以供下次使用。
但是它沒有直接機制來初始化指標變數以通過匯編程式標簽參考記憶體位置。因此,許多人要么組裝兩次,第一次計算某些資料的十六進制地址(然后調整源代碼),要么將資料放在靠近開頭(易于預先計算其地址的位置)并在以下位置跳轉資料開始。
有沒有辦法使用標簽初始化指標?例如,我希望將帶有標簽的資料位置pointer初始化為保存/參考以下地址array:
pointer, DEC array
/ ...
array, DEC 1000
DEC 1001
DEC 1002
但是,這是 MARIE 程式集中的語法錯誤。
可以這樣做:初始化資料字以參考標簽嗎?
僅供參考,我使用https://marie.js.org/進行模擬。
uj5u.com熱心網友回復:
可以這樣做:初始化資料字以參考標簽嗎?
是的,這是可以做到的。
雖然 DEC 和 HEX 通常用于宣告全域/初始化資料,但它們不接受標簽作為引數,分別只接受十進制和十六進制常量。
但是:MARIE指令和資料都是16位寬,而地址空間只有12位寬。指令格式是 4 位操作碼后跟 12 位地址(這些地址是絕對地址,而不是相對于 pc 的地址)。因此,我們可以使用操作碼為 0 的指令 JnS 來形成一個資料值,該值是一個指向標簽的指標。
pointer, JnS array / this is intended as data, not code
/ despite the use of an instruction opcode
/ ...
array, DEC 1000
DEC 1001
DEC 1002
(MAR暫存器只有12位,所以當一個地址從16位MBR移到12位MAR時,高4位被丟棄。因此,我們可以使用任何操作碼來參考標簽,但是使用值為 0 的操作碼可能是最好的選擇,因為這樣,在 16 位中,指標與在 12 位中具有相同的值。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/374963.html
上一篇:如何在裝配中找到負值的總和?
