我一直在學習一門名為nand2tetris的課程。在其中,我們建立了一個16位計算機,在每條指令中,第一位選擇地址模式或命令模式,也就是說,如果它是0,那么我們加載地址暫存器,如果它是1,我們執行一條指令。最后3位指定跳轉條件(基于ALU的輸出),像這樣:
假設我正在制作一臺8位計算機,而我只有1位來指定跳轉指令。如果它是0,就不要跳轉,如果它是1,那么如果ALU輸出為0就跳轉。我將如何進行其他的比較?我的猜測是在暫存器中存盤條件,即ALU在暫存器0中存盤 "大于"(如果為真則為1),在暫存器1中存盤 "大于或等于",在暫存器2中存盤 "小于",以此類推。當我想檢查不等式時,我在地址暫存器中加載數值,如果它是0就跳轉。
這種做法對嗎?與16位計算機中的單行跳轉規范相比,這是4行指令! 一定有一個簡單的更好的方法來指定。
uj5u.com熱心網友回復: 你在aaa中是否有任何自由的操作碼? 如果有,你可以添加一個 "is-greater-than-0 "和一個 "is-greater-than-or-equal-to-0 "操作碼。 這些將檢查,例如,D暫存器的值,并用布爾1或0替換它。
因此,你的比較序列是減去兩個專案,然后使用這些操作碼中的一個,你的條件跳轉到0。
你可以交換減法的運算元,以獲得其他關系(小于,小于0)。
你也可以從一個布爾運算中減去1來逆轉它(使真為0,使假為非0)。
另外,你可以移走除符號位以外的所有位,即邏輯右移15位將符號位移到低位--這將給你>=0的0和<0的1。 (算術右移15位將給>=0的0和< 0的-1。
正如@Peter所指出的,比較指令可以在沒有溢位風險的情況下進行操作。 MIPS提供了一個單一的比較,
標籤: 下一篇:在nasm中先乘后除
000--沒有跳轉。
000 - 不跳轉
001 - 如果大于0則跳轉
010--如果等于0則跳轉
011--如果大于或等于0則跳轉
100 - 如果小于0則跳轉
101 - 如果不等于0,則跳轉
110 - 小于或等于0時跳轉
111--跳轉
//大于或等于加載在地址暫存器中的值
//下面相當于ld 0x03
ld geq
// 設定D暫存器為geq中的值
mv D M
// "回圈 "行地址加載到地址暫存器中
ld loop
// 如果D為0,則轉到 "回圈",否則繼續。
D: jp
slt,代表設定小于。 MIPS還提供了條件真時的分支和條件假時的分支。 這與交換運算元的能力相結合,允許所有4個關系操作(<, <=, > , >=)。
