1 .data
2 msg1: .word 0:24
3 .text
4 .globl main
5 main:
6 li $v0, 8 #syscall for read str
7 la $a0, msg1 #load address of msg1 to store string
8 li $a1, 100 #msg1 is 100 bytes
9 syscall
10 lb $t0, 5($a0) #load the character into $t0
11 li $t1, 'a' #get value of 'a'
12 blt $t0, $t1, nomodify #do nothing if letter is less than 'a'
13 li $t1, 'z' #get value of 'z'
14 bgt $t0, $t1, nomodify #do nothing if letter is greater than 'z'
15 addi $t0, $t0, -0x20 #encap the letter
16 sb $t0, 5($a0) #store the new letter
17 nomodify:
18 li $v0, 4 #syscall for print str
19 syscall
20 li $v0, 10 #system call for exit
21 syscall # we are out of here.
首先,此代码的目的是从用户处获取字符串并将字符串打印回来。
我的第一个问题:
在第10行中,为什么要从$ a0 + 5加载一个字节?我得到$ a0是要打印的输入字符串,但我不明白为什么它被5偏移。
第二个问题:
在第11-14行中,如果字符小于'a'或字符大于'z',为什么分支到nomodify?如果它不在a-z的范围内,那不就是打印字符吗?
第三个问题:
在第11-16行中,如果字符既不小于'a'也不大于'z',则第15行表示将立即值-0x20添加到$ t0中,评论说这是“封装”信件”。那是什么意思?
最后:
继续使用“char”这个词令我困惑。这段代码是读取/打印字符串的吗? char只是字符串中的一个字符吗?
答案 0 :(得分:0)
18 li $v0, 4 #syscall for print str
19 syscall
20 li $v0, 10 #system call for exit
21 syscall # we are out of here.
{{1}}
这将是简单读/写输入字符串的真正代码。问题中的代码(特别是第10-17行)我问的是为第6个字符做了额外的事情。