如题:
利用系统功能调用从键盘输入,转换后在屏幕上显示,具体要求如下:
(1) 如果输入的是字母(A~Z,区分大小写)或数字(0~9),则将其转换成对应的英文单词后在屏幕上显示,对应关系见下表
(2) 若输入的不是字母或数字,则在屏幕上输出字符“*”,
(3) 每输入一个字符,即时转换并在屏幕上显示,
(4) 支持反复输入,直到按“?”键结束程序。
A | Alpha | N | November | 1 | First | a | alpha | n | november |
B | Bravo | O | Oscar | 2 | Second | b | bravo | o | oscar |
C | China | P | Paper | 3 | Third | c | china | p | paper |
D | Delta | Q | Quebec | 4 | Fourth | d | delta | q | quebec |
E | Echo | R | Research | 5 | Fifth | e | echo | r | research |
F | Foxtrot | S | Sierra | 6 | Sixth | f | foxtrot | s | sierra |
G | Golf | T | Tango | 7 | Seventh | g | golf | t | tango |
H | Hotel | U | Uniform | 8 | Eighth | h | hotel | u | uniform |
I | India | V | Victor | 9 | Ninth | i | india | v | victor |
J | Juliet | W | Whisky | 0 | zero | j | juliet | w | whisky |
K | Kilo | X | X-ray | k | kilo | x | x-ray | ||
L | Lima | Y | Yankee | l | lima | y | yankee | ||
M | Mary | Z | Zulu | m | mary | z | zulu |
解题思路:
1、输出位移量需要加上输入内容和空格和换行,所以这里是输出单词长度+3;
2、需要使用到的指令:
slt rd,rs,rt # 有符号的比较,if(rs<rt) rd=1 else rd=0
sgt rd,rs,rt # 有符号的比较,if(rs>rt) rd=1 else rd=0
sub rd,rs,rt # 有符号相减,rd=rs-rt
add rd,rs,rt # 与, rd=rs&rt
# 分支指令
beq rs,rt,imm # 相等则分支
bne rs,rt,imm # 不相等分支
beq reg1,reg2,L1
# if (value in reg1) == (value in reg2) goto L1
源码如下:
.data
ca_char: .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"
cc_offset: .word # offset = char_lenth
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
lo_char: .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"
lc_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
number: .asciiz
" zero\n", " First\n", " Second\n", " Third\n", " Fourth\n",
" Fifth\n", " Sixth\n", " Seventh\n"," Eighth\n"," Ninth\n"
n_offset: .word
0,7,15,24,32,41,49,57,67,76
.text
.globl main
main: li $v0, 12 # read character
syscall
sub $t1, $v0, 63 # ascii 63 = '?'
beqz $t1, exit
sub $t1, $v0, 48 # '0'
slt $s0, $t1, $0 # if t1 < 0 then s0 = 1
bnez $s0, others
# is number?
sub $t2, $t1, 10 # number
slt $s1, $t2, $0 # if t2 < 0 then s1 = 1
bnez $s1, getnum
# is capital?
sub $t2, $v0, 91 # 90 = 'Z'
slt $s3, $t2, $0 # if v0 <= 'Z' then s3 = 1
sub $t3, $v0, 64
sgt $s4, $t3, $0 # if v0 >= 'A' then s4 = 1
and $s0, $s3, $s4 # if s3 == 1 && s4 == 1
bnez $s0, getca_char
# is lower case?
sub $t2, $v0, 123 # 122 = 'z'
slt $s3, $t2, $0 # if v0 <= 'z' then s3 = 1
sub $t3, $v0, 96
sgt $s4, $t3, $0 # if v0 >= 'a' then s4 = 1
and $s0, $s3, $s4
bnez $s0, getlo_char
j others
getnum: add $t2, $t2, 10
sll $t2, $t2, 2
la $s0, n_offset
add $s0, $s0, $t2
lw $s1, ($s0)
la $a0, number
add $a0, $a0, $s1
li $v0, 4
syscall
j main
# upper case char
getca_char: sub $t3, $t3, 1
sll $t3, $t3, 2
la $s0, cc_offset
add $s0, $s0, $t3
lw $s1, ($s0)
la $a0, ca_char
add $a0, $s1, $a0
li $v0, 4
syscall
j main
# lower case char
getlo_char: sub $t3, $t3, 1
sll $t3, $t3, 2
la $s0, lc_offset
add $s0, $s0, $t3
lw $s1, ($s0)
la $a0, lo_char
add $a0, $s1, $a0
li $v0, 4
syscall
j main
others: and $a0, $0, $0
add $a0, $a0, 42 # '*'
li $v0, 11 # print character
syscall
j main
exit: li $v0, 10 # exit
syscall