【发布时间】:2016-02-21 01:40:16
【问题描述】:
我正在尝试在 MIPS 中编写一个程序来确定字符串是否为回文。程序应忽略用户输入字符串中的所有标点符号和空格。对于我的程序,以下字符串将被视为回文。
- “1 2 321”
- “女士。我是亚当。”
- “去挂意大利腊肠:我是烤宽面条。 !!!”
我无法弄清楚为什么我的程序无法运行。我对 mips 很陌生,这可能是我忽略或完全错误的简单事情。这是我的代码:
.data
charCount: .byte 0
goAgain: .asciiz ""
userInput: .asciiz ""
.text
main:
la $a0, userInput
li $a1, 50
li $v0, 8
syscall
endofstr:
loop:
lb $t1, ($a0)
beqz $t1, next #branch if end of string
addi $a0, $a0, 1 #increment byte address
j loop
next:
subi $a0, $a0, 2 #line a0 on the last character of the user string
loopNext:
la $a2, userInput
lb $t2, ($a2)
lb $t3, ($a0)
jal testValues
testValues:
bgt $t2, 90, lt97
j skipa
lt97: blt $t2, 97, nextT2
skipa:
bgt $t2, 122, nextT2
bgt $t2, 57, lt65
j skipb
lt65: blt $t2, 65, nextT2
skipb:
blt $t2, 48, nextT2
#make t2 uppercase
blt $t2, 97, skip_nextT2
subi $t2, $t2, 32
j skip_nextT2
nextT2:
addi $a2, $a2, 1
lb $t2, ($a2)
j testValues
skip_nextT2:
bgt $t3, 90, lt97b
lt97b: blt $t3, 97, nextT3
bgt $t3, 122, nextT3
bgt $t3, 57, nextT3
blt $t3, 48, nextT3
blt $t3, 97, eval
subi $t3, $t3, 32
j eval
nextT3:
subi $a0, $a0, 1
lb $t3, ($a0)
j skip_nextT2
eval:
beq $a0, $a2, isPali
beq $t2, $t3, equal
j notPali
equal:
subi $a0, $a0, 1
addi $a2, $a2, 1
lb $t2, ($a2)
lb $t3, ($a0)
j testValues
#set T2 to be capital for easier work path.
isPali:
li $s7, 1
j exit
notPali:
li $s7, -1
j exit
exit:
【问题讨论】:
-
Assembly 使用通用寄存器名称而不是变量名称,因此 cmets 和有意义的标签对于使代码可读性至关重要。
-
为什么在下一个减2:?不应该是 1 来备份 z 字节吗?
-
At eval: beq $t2,$t3,equal 如果字符串是偶数个字符,则永远不会为真。它应该测试是否 t2>=t3。
-
在nextT2:你需要测试a2>=a0是否为字符串结尾。在 nextT3:你需要测试是否 a0
-
更正:忽略关于 beq $t2,$t3 的评论。我的意思是:在 eval: beq $a0,$a2,isPali 应该测试 a2>=a0。
标签: assembly mips palindrome