zoukankan      html  css  js  c++  java
  • MIPS程序设计实例

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

    题目要求

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

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

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

      3、每输入一个字符,即时转换并在屏幕上显示

      4、支持反复输入,直到按“?”键结束程序

    MIPS代码

      1 .data
      2    alphabetU: .asciiz " Alpha
    "," Bravo
    "," China
    "," Delta
    "," Echo
    "," Foxtrot
    "," Golf
    "," Hotel
    ",
      3         " India
    "," Juliet
    "," Kilo
    "," Lima
    "," Mary
    "," November
    "," Oscar
    "," Paper
    "," Quebec
    ",
      4         " Research
    "," Sierra
    "," Tango
    "," Uniform
    "," Victor
    "," Whisky
    "," X-ray
    "," Yankee
    "," Zulu
    "
      5    alphabetL: .asciiz  " alpha
    "," bravo
    "," china
    "," delta
    "," echo
    "," foxtrot
    "," golf
    "," hotel
    "," india
    ",
      6         " juliet
    "," kilo
    "," lima
    "," mary
    "," november
    "," oscar
    "," paper
    "," quebec
    "," research
    ",
      7         " sierra
    "," tango
    "," uniform
    "," victor
    "," whisky
    "," x-ray
    "," yankee
    "," zulu
    "
      8    al_offset: .word 0,8,16,24,32,39,49,56,64,72,81,88,95,102,113,121,129,138,149,158,166,176,185,194,202,211
      9    number:  .asciiz  " Zero
    "," First
    "," Second
    "," Third
    "," Fourth
    "," Fifth
    "," Sixth
    "," Seventh
    "," Eighth
    "," Ninth
    "
     10    n_offset:  .word    0,7,15,24,32,41,49,57,67,76
     11    exit_str: .asciiz "#Stop program#"
     12    
     13 .text
     14 .globl  main
     15 main:
     16     li $v0,12                #$v0 contian character read
     17     syscall
     18     beq $v0,'?',exit         #if(v0 == '?'),exit
     19 
     20     #is symble?
     21     sub $t1,$v0,'0'
     22     blt $t1,0,symble
     23     
     24     #is number?
     25     sub $t2,$t1,10           #$t2 = $t1 - 10
     26     blt $t2,0,getnum
     27     
     28     #is upper case?
     29     sub $t0,$v0,92
     30     slt $s2,$t0,$0      #if (v0 < 'Z') then s2 = 1
     31     sub $t0,$v0,64
     32     sgt $s3,$t0,$0      #if(v0 > 'A')  then  s3 = 1
     33     and $s1,$s2,$s3     #$s1 = ($s2 && s3)
     34     beq $s1,1,getuword
     35     
     36     #is lower case?
     37     sub $t0,$v0,123
     38     slt $s2,$t0,$0      #if (v0 < 'Z') then s2 = 1
     39     sub $t0,$v0,96
     40     sgt $s3,$t0,$0      #if(v0 > 'A')  then  s3 = 1
     41     and $s1,$s2,$s3     #$s1 = ($s2 && s3)
     42     beq $s1,1,getlword
     43     
     44 symble:
     45     li  $v0,11
     46     add $a0,$0,32        #load value 32 into argument register $a0
     47     syscall              #print space
     48     
     49     add $a0,$a0,10       #32 + 10 = '*'
     50     syscall 
     51     
     52     sub,$a0,$a0,32        #'*' - 32 = '
    '
     53     syscall
     54     j main
     55 
     56 getnum:
     57     add $t2,$t2,10        #add 10
     58     sll $t2,$t2,2         #every word use 1 byte (no.9 at address of 9<<2)
     59    
     60    la $s0,n_offset        #load address to $s0
     61    add $s0,$s0,$t2        #$s0 = $s0 + offset
     62    lw  $s1,($s0)  
     63    
     64    la $a0,number
     65    add $a0,$a0,$s1        #$a0 = number + offset
     66    li $v0,4
     67    syscall
     68    j main
     69 
     70 getuword:
     71     sub,$t0,$t0,1
     72     sll $t0,$t0,2
     73     la $s0,al_offset
     74     add $s0,$s0,$t0
     75     lw  $s1,($s0)
     76     la $a0,alphabetU
     77     add $a0,$a0,$s1
     78     li $v0,4
     79     syscall
     80     j main
     81 
     82 getlword:
     83     sub,$t0,$t0,1
     84     sll $t0,$t0,2
     85     la $s0,al_offset
     86     add $s0,$s0,$t0
     87     lw  $s1,($s0)
     88     la $a0,alphabetL
     89     add $a0,$a0,$s1
     90     li $v0,4
     91     syscall
     92     j main
     93 
     94 exit:
     95     add $a0,$0,'
    '
     96     li $v0,11
     97     syscall
     98     
     99     la $a0,exit_str
    100     li $v0,4
    101     syscall
    102     

    第二题:字符串查找比较

    题目要求

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

      1、如果找到,则在屏幕上显示:

           Success! Location: X

        其中,X为该字符在字符串中第一次出现的位置

      2、如果没找到,则在屏幕上显示

        Fail!

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

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

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

    MIPS代码

     1 #https://ehye.github.io/2017/10/10/MIPS-program-design0/
     2 .data 
     3     success_str: .asciiz  "
    Success! Location: "
     4     fail_str:  .asciiz  "
    Fail!
     5     buffer: .space 20
     6     exit_str: .asciiz "
    #Stop program#"
     7    str1:  .asciiz "Enter string: "
     8    str2:  .asciiz "Enter char: 
     9    
    10 .text
    11 .globl  main
    12 main:
    13     #init
    14     # a0 = input/result string
    15    # a1 = input string length
    16    # a2 = input char
    17    # a3 = loop donefail
    18    li $a3,0
    19    li $t0,0
    20    
    21    #take string
    22    la $a0,buffer
    23    li $a1,20
    24    li $v0,8
    25    syscall
    26    
    27 takechar:
    28     li $v0,12
    29     syscall
    30     beq $v0,'?',exit
    31     move  $a2,$v0
    32     
    33 search:
    34     beq $t0,$a1,fail       #if (i == length) then donefail
    35     la $a0,buffer                #else load byte
    36     add $t2,$a0,$t0            #$t2 = $a0 + offset
    37     lb  $s1,($t2)                #$s1 = *$t2
    38     beq $s1,$a2,success        #if($s1 == $a2),thne sucess
    39     add $t0,$t0,1                #i++
    40     j search
    41 
    42 fail:
    43     add $a3,$zero,1            # flag donefail = 1
    44     add $t0,$zero,$zero        # reset int i = 0
    45     
    46     la $a0,fail_str
    47     li $v0,4
    48     syscall
    49     
    50     add $a0,$zero,'
    '
    51     li $v0,11
    52     syscall
    53     j takechar
    54     
    55 success:
    56     la $a0,success_str
    57     li $v0,4
    58     syscall
    59     
    60     li $v0,1
    61     add $a0,$t0,1            #print index begin from 1 
    62     syscall
    63     
    64     add $a0,$zero,'
    '
    65     li $v0,11
    66     syscall
    67     add $t0,$zero,0          #reset int i = 0
    68     j takechar
    69     
    70 exit:
    71     la  $a0,exit_str    #print exit
    72     li  $v0,4
    73     syscall
    74     
    75     li  $v0,10                #exit
    76     syscall

    解释一下,由于这个编辑器插入代码不能选择MIPS,所以没有语法高亮,额,哎哎,水平太菜,知道好的解决方法得大佬请留言啊!

  • 相关阅读:
    [匈牙利算法] 洛谷 P1640 连续攻击
    [dfs] Jzoj P5916 flow
    [bfs] Jzoj P3522 迷宫花园
    [二分][状压dp] Jzoj P3521 道路覆盖
    [模拟] Jzoj P3520 原根
    [并查集] Jzoj P5914 盟主的忧虑
    [树上差分][子树求和][树形dp] Jzoj P5911 Travel
    [思维][暴力] Jzoj P5912 VanUSee
    [dfs][离散化] Jzoj P5910 DuLiu
    [cdq分治][树的重心] 洛谷 P3806 点分治1
  • 原文地址:https://www.cnblogs.com/lfri/p/9671186.html
Copyright © 2011-2022 走看看