版权声明:作者:巴伐利亚酒仙 https://blog.csdn.net/weixin_39062811/article/details/88925892
Cousera MIPS 汇编程序设计
第一题:用系统功能调用实现简单输入输出
利用系统功能调用从键盘输入,转换后在屏幕上显示,具体要求如下:
(1) 如果输入的是字母(AZ,区分大小写)或数字(09),则将其转换成对应的英文单词后在屏幕上显示,对应关系见下表
(2) 若输入的不是字母或数字,则在屏幕上输出字符“*”,
(3) 每输入一个字符,即时转换并在屏幕上显示,
(4) 支持反复输入,直到按“?”键结束程序。
.data
Upperalphabet:
.asciiz " Alpha\n"," Bravo\n"," China\n"," Delta\n"," Echo\n"," Foxtrot\n"," Golf\n"," Hotel\n",
" India\n"," Juliet\n"," Kilo\n"," Lima\n"," Mary\n"," November\n"," Oscar\n"," Paper\n"," Quebec\n",
" Research\n"," Sierra\n"," Tango\n"," Uniform\n"," Victor\n"," Whisky\n"," X-ray\n"," Yankee\n"," Zulu\n"
Loweralphabet:
.asciiz " alpha\n"," bravo\n"," china\n"," delta\n"," echo\n"," foxtrot\n"," golf\n"," hotel\n"," india\n",
" juliet\n"," kilo\n"," lima\n"," mary\n"," november\n"," oscar\n"," paper\n"," quebec\n"," research\n",
" sierra\n"," tango\n"," uniform\n"," victor\n"," whisky\n"," x-ray\n"," yankee\n"," zulu\n"
Number: .asciiz "zero ", "one ", "two ", "three ", "four ", "five ", "six ", "seven ","eight ","nine "
alphabet_offset: .word 0,8,16,24,32,39,49,56,64,72,81,88,95,102,113,121,129,138,149,158,166,176,185,194,202,211
stop: .ascii "Stop"
number_offset: .word 0,6,11,16,23,29,35,40,47,54
.text
main:
li $v0, 12
syscall
sub $t0, $v0, 63 # is ?
beqz $t0, exit
sub $t0, $v0, 48 # is less than 0?
slt $s0, $t0, $0 #if t0<0 then s0 = 1
bnez $s0, none
# is number?
sub $t1, $t0, 10
slt $s1, $t1, $0
bnez $s1, getnum
# is capital?
sub $t1, $v0, 91
slt $s3, $t1, $0 # if v0 <= 'Z' then s3 = 1
sub $t2, $v0, 64
sgt $s4, $t2, $0 # if v0 >='A' then s4 = 1
and $s0, $s3, $s4 # if s3 == 1 && s4 == 1
bnez $s0, getupword
# is lower case?
sub $t1, $v0, 123
slt $s3, $t1, $0 # if v0 <= 'z' then s3 = 1
sub $t2, $v0, 96
sgt $s4, $t2, $0 # if v0 >= 'a' then s4 = 1
and $s0, $s3, $s4
bnez $s0, getlwword
j none
getnum:
add $t1, $t1, 10
sll $t1, $t1, 2
la $s0, number_offset
add $s0, $s0, $t1
lw $s1, ($s0)
la $a0, Number
add $a0, $a0, $s1
li $v0, 4
syscall
j main
getupword:
sub $t2, $t2, 1
sll $t2, $t2, 2
la $s0, alphabet_offset
add $s0, $s0, $t2
lw $s1, ($s0)
la $a0, Upperalphabet
add $a0, $s1, $a0
li $v0, 4
syscall
j main
getlwword:
sub $t2, $t2, 1
sll $t2, $t2, 2
la $s0, alphabet_offset
add $s0, $s0, $t2
lw $s1, ($s0)
la $a0, Loweralphabet
add $a0, $s1, $a0
li $v0, 4
syscall
j main
none:
and $a0, $0, $0
add $a0, $a0, 42 # print *
li $v0, 11
syscall
j main
exit:
add $a0, $0, '\n'
li $v0, 11
syscall
la $a0, stop
li $v0, 4
syscall
输出结果
1one 2two 3three 4four
*s sierra
f foxtrot
g golf
B Bravo
K Kilo
O Oscar
?
Stop