Coursera - 计算机组成 - W3 - MIPS汇编程序设计

第一题:用系统功能调用实现简单输入输出

利用系统功能调用从键盘输入,转换后在屏幕上显示,具体要求如下:
(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

# 用系统功能调用实现简单输入输出
# '0'=48 '9'=57 'A'=65 'Z'=90 'a'=97 'z'=122 '*'=42 '?'=63 '\n'=10

            .data

arrC:       .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"
indC:       .word 0, 6, 12, 18, 24, 29, 37, 42, 48, 54, 61, 66, 71, 76, 85, 91, 97, 104, 113, 120, 126, 134, 141, 148, 154, 161
arrN:       .asciiz "zero", "First", "Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh", "Eighth", "Ninth"
indN:       .word 0, 5, 11, 18, 24, 31, 37, 43, 51, 58

            # 输出换行
            .macro newline
            li $v0, 11
            li $a0, 10 # '\n'
            syscall
            .end_macro

            .text
            .globl main

main:
            # 输入一个字符
            li $v0, 12
            syscall
            move $t0, $v0
            newline
            # 问号表示结束
            li $t1, 63 # '?'
            beq $t0, $t1, exit

# 大写字母
uc:
            # 'A'-1 < $t0 < 'Z'+1
            li $t1, 64
            sltu $t2, $t1, $t0
            li $t1, 91
            sltu $t3, $t0, $t1
            and $t1, $t2, $t3
            beqz $t1, lc
            # 取出偏移量
            subu $t1, $t0, 65
            la $t2, indC
            addu $t2, $t2, $t1
            addu $t2, $t2, $t1
            addu $t2, $t2, $t1
            addu $t2, $t2, $t1
            lw $t2, ($t2)
            # 输出字符串
            li $v0, 4
            la $a0, arrC
            addu $a0, $a0, $t2
            syscall
            b loop

# 小写字母
lc:
            # 'a'-1 < $t0 < 'z'+1
            li $t1, 96
            sltu $t2, $t1, $t0
            li $t1, 123
            sltu $t3, $t0, $t1
            and $t1, $t2, $t3
            beqz $t1, num
            # 取出偏移量
            subu $t1, $t0, 97
            la $t2, indC
            addu $t2, $t2, $t1
            addu $t2, $t2, $t1
            addu $t2, $t2, $t1
            addu $t2, $t2, $t1
            lw $t2, ($t2)
            # 输出首字母
            li $v0, 11
            move $a0, $t0
            syscall
            # 输出其余字符串
            li $v0, 4
            la $a0, arrC
            addu $a0, $a0, $t2
            addiu $a0, $a0, 1
            syscall
            b loop

# 数字
num:
            # '0'-1 < 输入 < '9'+1
            li $t1, 47
            sltu $t2, $t1, $t0 
            li $t1, 58
            sltu $t3, $t0, $t1
            and $t1, $t2, $t3
            beqz $t1, unknown
            # 取出偏移量
            subu $t1, $t0, 48
            la $t2, indN
            addu $t2, $t2, $t1
            addu $t2, $t2, $t1
            addu $t2, $t2, $t1
            addu $t2, $t2, $t1
            lw $t2, ($t2)
            # 输出字符串
            li $v0, 4
            la $a0, arrN
            addu $a0, $a0, $t2
            syscall
            b loop

# 其它
unknown:
            # 输出星号
            li $v0, 11
            li $a0, 42 # '*'
            syscall

# 循环
loop:
            newline
            b main

exit:
            # 退出

# eof

第二题:字符串查找比较

利用系统功能调用从键盘输入一个字符串,然后输入单个字符,查找该字符串中是否有该字符(区分大小写)。具体要求如下:

(1) 如果找到,则在屏幕上显示:
Success! Location: X
其中,X为该字符在字符串中第一次出现的位置

(2) 如果没找到,则在屏幕上显示:
Fail!

(3) 输入一个字符串后,可以反复输入希望查询的字符,直到按“?”键结束程序

(4) 每个输入字符独占一行,输出查找结果独占一行,位置编码从1开始。

提示:为避免歧义,字符串内不包含”?”符号

格式示例如下:
abcdefgh
a
Success! Location: 1
x
Fail!

# 字符串查找比较
# '?'=63 '\n'=10

            .data

string:     .space 1024
successmsg: .asciiz "Success! Location: "
failmsg:    .asciiz "Fail!"

            # 输出换行
            .macro newline
            li $v0, 11
            li $a0, 10 # '\n'
            syscall
            .end_macro

            .text
            .globl main

main:
            # 输入字符串
            li $v0, 8
            la $a0, string
            li $a1, 1024
            syscall

            # 去除最后一个换行符
            li $t0, 10 # '\n'
            la $t1, string
search_0:
            lb $t2, ($t1)
            beqz $t2, string_end
            addiu $t1, $t1, 1
            b search_0
string_end:
            la $t2, string
            beq $t1, $t2, input
            addiu $t1, $t1, -1
            lb $t2, ($t1)
            bne $t2, $t0, input
            sb $0, ($t1)

# 输入字符
input:
            li $v0, 12
            syscall
            move $t0, $v0
            newline
            # 问号表示结束
            li $t1, 63 # '?'
            beq $t0, $t1, exit

# 查找字符
            la $t1, string
search:
            lb $t2, ($t1)
            beqz $t2, not_found
            beq $t0, $t2, found
            addiu $t1, $t1, 1
            b search

# 找到字符
found:
            li $v0, 4
            la $a0, successmsg
            syscall
            li $v0, 1
            la $t2, string
            subu $a0, $t1, $t2
            addiu $a0, $a0, 1
            syscall
            b loop

# 没找到
not_found:
            li $v0, 4
            la $a0, failmsg
            syscall

# 循环
loop:
            newline
            b input

exit:
            # 退出

# eof

-eof-

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值