我想練習在 MIPS 中使用 switch/cases 和 JumpTables。目前,我可以通過堆疊幾個 BEQ 命令來實作類似的邏輯。我更愿意將其切換為使用帶有案例的單個 switch 陳述句。不幸的是,這些案例不是按順序排列的。有一個用戶選單,他們可以在其中輸入一個字符(ascii 值),然后根據該字符執行操作。例如,他們可以選擇“A”、“D”、“N”、“X”。顯然,這不按順序...我正在考慮存盤一個帶有選項的陣列并將其視為一個 ENUM(據我所知,它在 MIPS 中不存在),這將解決非順序問題并且可以更輕松地將大小寫轉換為正確的字符。
到目前為止,這是我的一些代碼,以幫助解決問題:請注意,問題出在開關/跳轉上,而不是在案例中執行的實際邏輯/動作
C 示例:
//switch case sample based on char
char ch;
cout << "Enter a character: ";
cin >> ch;
switch (ch)
{
case 'N':
//action to perform
cout << "N: " << endl;
break;
case 'A':
//action
cout << "A: " << endl;
break;
default:
cout << "You entered an invalid character" << endl;
break;
}
和我目前的 mips 解決方案:
.data
.asciiz
enterMenu: "Enter a menu option (N,A,M,D,X):\n"
.word
JT: N,A,M,D,X #all the possible cases we want to deal with
.text
la $a0, enterMenu #load meu prompt
li $v0, 4 #print prompt
syscall
li $v0, 12 #read char from user
syscall
add $t0, $v0, $0 #move the character to a temporary register (holds switch value)
#switch (k) k = $s5
slti $t3, $t0, 65 # Test if k < 65 (A's ascii value)
bne $t3, $zero, Exit # if k < A, go to Exit
slti $t3, $t0, 90 #Test if k > 90 (Z's ascii value)
beq $t3, $zero, Exit # if k > Z, go to Exit
beq $t0, 65, A # if k = A, go to A
beq $t0, 68 , D # if k = D, go to D
beq $t0, 77, M # if k = M, go to M
beq $t0, 78, N # if k = N, go to n
beq $t0, 88, X # if k = X, go to X
編輯:選單可能存盤如下:
.byte
Cases: 'N','A','M','D','X' #added this in after
然后問題將變成如何讓它們(從用戶輸入)對應于 JumpTable 偏移量,然后對應于挑選案例。
uj5u.com熱心網友回復:
beq對于少數相當分散的案例(例如A- X) , s系列與您將獲得的一樣好。
指向代碼的指標資料表必須有 24 個條目,其中許多是默認(不匹配)情況。
使用該表的代碼序列將:
- 規范化輸入(例如減去'A'),1條指令(
addiu) - 檢查是否大于表大小,還有 2 條指令(
sltiu/bnez用于無符號比較) - 陣列索引(移位、加載地址、加法) MARS 上的 4 條指令(3 條帶有帶有
%hi(table)/的匯編器,%lo(table)讓您將部分表地址留給lw立即數), - 加載資料指標,1條指令
- 跳轉到暫存器中的資料指標,1條指令
對于總共 9 條指令(或 8 條)和可能的資料快取未命中,盡管亂序機器將能夠并行執行 2 條范圍檢查指令。(或者如果您適當地安排它們,則為有序超標量。)
您的集合的 's 系列beq是 10 條指令(beq常量是偽指令,擴展為首先加載立即數,然后比較 & 分支),但并非所有指令都將始終執行,并且可以根據性能對其進行排序。(最常見的第一個。)
因此,如果有超過 20 個左右的案例,我可能會切換到表格版本,因為在 20 個案例中,平均會執行 10 條指令(假設分布相等,如果您可以訂購已知分布,則更好。)
如果“默認”情況最常見,則范圍檢查和/或位圖檢查0x12345 & (1<<c)可以快速排除特殊情況之一,而無需全部檢查。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/472511.html
上一篇:為什么x86沒有實作直接的核心到核心訊息程式集/cpu指令?
下一篇:比較相同字母的大小寫版本
