2017-03-22 252 views
1

我是MIPS中的新成員,我試圖判斷字符串中的每個字符是否都是alpha。我用ASCII代碼來幫助我判斷它,而我發現沒有代表larger than含義的指令。所以我嘗試從我所知道的指令中實施一個not操作。這裏是我的代碼的一部分:如何在MIPS中實現NOT操作?

isAlpha: 
    sltiu $t0, $s2, 123 
    sltiu $t1, $s2, 97 
    nor $t1, $t1, $t1 
    and $t0, $t0, $t1 

    sltiu $t2, $s2, 107 
    sltiu $t3, $s2, 81 
    nor $t3, $t3, $t3 
    and $t2, $t2, $t3 

    or $t0, $t0, $t2 

    bne $t0, $zero, countAlpha 
    jr $ra 

但是,我無法得到我想要的結果。我設置一個斷點,發現我的not操作似乎有一些問題: After judge

在我的例外,$ T1應該是1和$ T2應爲0,而實際情況並非如此。

我的代碼在哪裏錯了?有什麼方法可以在MIPS中實現not操作?或者是否有更好的方法在MIPS中實現larger than的含義?提前致謝。

回答

5

你有沒有操作位置:

nor $t1, $t1, $t1 

通常你可以只需鍵入not記憶和您的彙編器將其解釋爲pseudo instruction

我想你想的異或運算來告訴你如果你的輸入只是小於123和小於97之一。

類似這樣的事情(完全未經測試)

isAlpha: 
    sltiu $t0, $s2, 123 
    sltiu $t1, $s2, 97 
    xor $t0, $t0, $t1 

    sltiu $t2, $s2, 107 
    sltiu $t3, $s2, 81 
    xor $t2, $t2, $t3 

    or $t0, $t0, $t2 

    bne $t0, $zero, countAlpha 
    jr $ra 
+0

我創造了這個答案的邏輯與,但在發佈前,我找到了你的。因爲我認爲你已經足夠了,所以我幾乎不會發布我的[有一個額外的'和'指令],並且支持你的。然後,我意識到我擔心的邊緣情況是真實的。但是,無論如何,+1。看到我的答案是什麼/爲什麼 –

+1

@Craig Estey您在回答「兩個零的xor是1」中說你確定嗎? – sfi

+1

我想我當時睡眠不足:-) –

1

您可以通過顛倒參數slt*得到gt效果:

sltu $v0,$t0,$t1    # v0 = $t0 < $t1 (what you have) 
    sltu $v0,$t1,$t0    # v0 = $t0 > $t1 (what you want) 

注意gele是有點棘手。考慮各種分支僞操作,如:blt, bge, bgt, bge [它們生成slt*,然後是beqbne]。他們通常更容易處理。

xor可以做按位否定。 not僞操作將生成nor

下面是一些你想要的代碼。請注意,它與sfi發佈的代碼類似,但在範圍檢查期間有一個額外的[並且必要的] and以防止誤報。

例如,而不and,爲a-z範圍檢查將高於z(例如0x7B又名{)上的任何報告真。這是因爲這兩個slt說明會產生0但是,兩個零的xor爲1。因此,xor結果必須對高範圍值slt結果

# isAlpha -- decide if char is alpha 
# 
# RETURNS: 
# v0 -- 1=is alpha 
# s6 -- count of alpha chars 
# 
# arguments: 
# s2 -- character to test 
# 
# registers: 
# t0 -- holds lt 'a/A'? value 
# t1 -- holds lt 'a/A' + 1? value 
# t2 -- bool for within 'a-z' 
# t3 -- bool for within 'A-Z' 
isAlpha: 
    # within a-z range 
    sltiu $t0,$s2,0x61   # lt 'a'? (i.e. not a-z) 
    sltiu $t1,$s2,0x7B   # lt 'z' + 1? (i.e. le 'z') 
    xor  $t2,$t0,$t1    # want one but not both 
    and  $t2,$t2,$t1    # want only lt 'z' + 1 

    # within A-Z range 
    sltiu $t0,$s2,0x41   # lt 'A'? (i.e. not A-Z) 
    sltiu $t1,$s2,0x5C   # lt 'Z' + 1? (i.e. le 'Z') 
    xor  $t3,$t0,$t1    # want one but not both 
    and  $t3,$t3,$t1    # want only lt 'Z' + 1 

    or  $v0,$t2,$t3    # decide if alpha 
    add  $s6,$s6,$v0    # increment alpha count 
    jr  $ra