MIPS:用系统功能调用实现简单输入输出

来源:互联网 发布:mac保存书签 编辑:程序博客网 时间:2024/06/05 08:59

实验目的:熟悉MIPS的指令掌握简单的汇编程序结构

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

(1) 如果输入的是字母(A~Z,不区分大小写)或数字(0~9),则将其转换成对应的英文单词后在屏幕上显示,对应关系见下表

(2) 若输入的不是字母或数字,则在屏幕上输出字符“*

(3) 每输入一个字符,即时转换并在屏幕上显示,需考虑显示结果的清晰美观

(4) 支持反复输入,直到按?键结束程序

(5) 程序结束时,屏幕上显示本人的姓名全拼和学号

例:在键盘上输入“PKU2011/”,对应输出内容为“Papa Kilo Uniform two zero one one *

A

Alpha

N

November

1

one

B

Bravo

O

Oscar

2

two

C

Charlie

P

Papa

3

three

D

Delta

Q

Quebec

4

four

E

Echo

R

Romeo

5

five

F

Foxtrot

S

Sierra

6

six

G

Golf

T

Tango

7

seven

H

Hotel

U

Uniform

8

eight

I

India

V

Victor

9

nine

J

Juliet

W

Whisky

0

zero

K

Kilo

X

X-ray

  

L

Lima

Y

Yankee

  

M

Mike

Z

Zulu

 
      .dataalphabet: .asciiz "Alpha ","Bravo ","Charlie ","Delta ","Echo ","Foxtrot ","Golf ","Hotel ","India ","Juliet ","Kilo ","Lima ","Mike ","November ","Oscar ","Papa ","Quebec ","Romeo ","Sierra ","Tango ","Uniform ","Victor ","Whisky ","X-ray ","Yankee ","Zulu "al_offset: .word 0,7,14,23,30,36,45,51,58,65,73,79,85,91,101,108,114,122,129,137,144,153,161,169,176,184number: .asciiz "zero ", "one ", "two ", "three ", "four ", "five ", "six ", "seven ","eight ","nine "n_offset: .word 0,6,11,16,23,29,35,40,47,54 myname:.asciiz "\r\nNAME: Wu Yiting\r\n"myid:.asciiz "ID: 1200012875\r\n"      .text      .globl main      #? word length[] = 4main:li $v0, 12syscallsub $t1, $v0, 63# is '?" ?beqz $t1, exitsub $t1, $v0, 48 # 0 asciislt $s0, $t1, $0# if t1 < 0 then s0 = 1bnez $s0, otherssub $t2, $t1, 10slt $s1, $t2, $0bnez $s1, getnum# is capital?sub $t2, $v0, 91slt $s3, $t2, $0# if v0 <= 'Z' then s3 = 1sub $t3, $v0, 64sgt $s4, $t3, $0# if v0 >='A' then s4 = 1and $s0, $s3, $s4# if s3 == 1 && s4 == 1 bnez $s0, getword# is lower case?sub $t2, $v0, 123slt $s3, $t2, $0# if v0 <= 'z' then s3 = 1sub $t3,$v0, 96sgt $s4, $t3, $0# if v0 >= 'a' then s4 = 1and $s0, $s3, $s4bnez $s0, getwordj othersgetnum: add $t2, $t2, 10sll $t2, $t2, 2la $s0, n_offsetadd $s0, $s0, $t2lw $s1, ($s0)#sll $s1, $s1, 1la $a0, numberadd $a0, $a0, $s1li $v0, 4syscallj maingetword:sub $t3, $t3, 1sll $t3, $t3,2la $s0, al_offsetadd $s0, $s0, $t3lw $s1, ($s0)#sll $s1, $s1, 1la $a0, alphabetadd $a0, $s1, $a0li $v0, 4syscallj mainothers:and $a0, $0, $0add $a0, $a0, 42li $v0, 11syscallj mainexit:la $a0, mynameli $v0, 4syscallla $a0, myidli $v0, 4syscallli $v0, 1syscall##problem of offset

 1、跟x86这题类似采用了二次寻址的思想(偏移量是写代码跑出来的=v=, 机器可以做的事情还是懒得数了)

 2、夹逼确定数字以及大小写

 3、注意.word偏移量*4(这里‘,’不会影响),而.ascii偏移量*1(尤其坑的是‘,’也算一位,调了很久才发现)

0 0
原创粉丝点击