您的位置:首页 > 理论基础

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

2016-12-29 17:55 363 查看

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

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

(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-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: