Coursera 学习记录:计算机组成上机作业(MIPS用系统功能调用实现简单输入输出)

版权声明:知识内容为原创思考,转载请注明:转自 https://blog.csdn.net/SmartLoveyu/article/details/86663891

如题:

利用系统功能调用从键盘输入,转换后在屏幕上显示,具体要求如下:

(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、输出位移量需要加上输入内容和空格,所以这里是输出单词长度+2;

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 ","Bravo ","China ","Delta ","Echo ","Foxtrot ",
            "Golf ","Hotel ","India ","Juliet ","Kilo ","Lima ",
            "Mary ","November ","Oscar ","Paper ","Quebec ","Research ",
            "Sierra ","Tango ","Uniform ","Victor ","Whisky ","X-ray ",
            "Yankee ","Zulu "
cc_offset:  .word # offset = char_lenth + 2
            0,7,14,21,28,34,43,49,56,63,71,
            77,83,89,99,106,113,121,131,
            139,146,155,163,171,178,186
lo_char:     .asciiz
            "alpha ","bravo ","china ","delta ","echo ","foxtrot ",
            "golf ","hotel ","india ","juliet ","kilo ","lima ",
            "mary ","november ","oscar ","paper ","quebec ","research ",
            "sierra ","tango ","uniform ","victor ","whisky ","x-ray ",
            "yankee ","zulu "
lc_offset:  .word
            0,7,14,21,28,34,43,49,56,63,71,
            77,83,89,99,106,113,121,131,
            139,146,155,163,171,178,186
number:     .asciiz
            "zero ", "First ", "Second ", "Third ", "Fourth ",
            "Fifth ", "Sixth ", "Seventh ","Eighth ","Ninth "
n_offset:   .word
            0,6,13,21,28,36,43,50,59,67

            .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

猜你喜欢

转载自blog.csdn.net/SmartLoveyu/article/details/86663891