MIPS:用系統功能呼叫實現簡單輸入輸出
阿新 • • 發佈:2019-01-28
實驗目的:熟悉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 |
.data alphabet: .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,184 number: .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[] = 4 main: li $v0, 12 syscall sub $t1, $v0, 63 # is '?" ? beqz $t1, exit sub $t1, $v0, 48 # 0 ascii slt $s0, $t1, $0 # if t1 < 0 then s0 = 1 bnez $s0, others sub $t2, $t1, 10 slt $s1, $t2, $0 bnez $s1, getnum # is capital? sub $t2, $v0, 91 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, getword # is lower case? sub $t2, $v0, 123 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, getword j others getnum: add $t2, $t2, 10 sll $t2, $t2, 2 la $s0, n_offset add $s0, $s0, $t2 lw $s1, ($s0) #sll $s1, $s1, 1 la $a0, number add $a0, $a0, $s1 li $v0, 4 syscall j main getword:sub $t3, $t3, 1 sll $t3, $t3,2 la $s0, al_offset add $s0, $s0, $t3 lw $s1, ($s0) #sll $s1, $s1, 1 la $a0, alphabet add $a0, $s1, $a0 li $v0, 4 syscall j main others: and $a0, $0, $0 add $a0, $a0, 42 li $v0, 11 syscall j main exit: la $a0, myname li $v0, 4 syscall la $a0, myid li $v0, 4 syscall li $v0, 1 syscall ##problem of offset
1、跟x86這題類似採用了二次定址的思想(偏移量是寫程式碼跑出來的=v=, 機器可以做的事情還是懶得數了)
2、夾逼確定數字以及大小寫
3、注意.word偏移量*4(這裡‘,’不會影響),而.ascii偏移量*1(尤其坑的是‘,’也算一位,調了很久才發現)