【发布时间】:2015-09-16 15:05:10
【问题描述】:
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 不只是字符串的一个字符吗?
【问题讨论】:
-
回复。第三个问题:ASCII 表中的大写字符没有设置第 5 位(0x20),而小写字符有。示例:“a”的值为 0x61,“A”的值为 0x41。
-
"这段代码的目的是从用户那里得到一个字符串并把这个字符串打印回来"。谁告诉你的?我想说它的目的(或者,至少,它做什么)是读取一个字符串,如果该字符是一个字母,将第 6 个字符的大小写更改为大写,然后打印字符串。
-
@Kenney 所以这条线基本上是说要大写字符?但是如果输入字符串甚至不是一个字母呢?这是否意味着它接受任何不是小写 a 到 z 的字符?
-
@Michael 为什么是第 6 个字符?
-
因为
5($a0)是字符串的第六个字符。您必须询问编写代码的人为什么他们对那个角色特别感兴趣。