在浏览MIPS代码时,我遇到了一些困惑。代码如下所示
.data
key: .ascii "key: " # "key: \n"
char: .asciiz " \n"
.text
.globl main
main:
jal getchar
la $a0, char # $a0 contains address of char variable (" \n")
sb $v0, ($a0) # replace " " in char with v0, which is read_character (X)
la $a0, key # now a0 will contain, address of "key: " "X\n"
我不明白的是加载地址指令的工作原理。首先a0包含char变量的地址。在下一行中,我们将v0的值存储在该位置。 ($a0
)没有偏移,假设为0,如0($a0
)?为什么只有“”空格被v0替换,为什么不替换“\ n”?或者也可能是空格和\ n字符都被v0重写。
其次,当我们在a0中加载密钥的地址时,应该覆盖先前的地址。 a0应该只包含key的地址,但是从注释中可以看出这两个字符串是连在一起的。这是怎么发生的。
答案 0 :(得分:1)
sb
在内存中存储一个字节。
详细回答您的问题:
there is no offset with ($a0), is that assumed to be 0 like in 0($a0)?
是
Why only the " " empty space is replaced with v0, and why not the "\n" get replaced?
sb
只存储一个字节,在本例中是地址char
上的字节,这是一个空格。换行符是下一个字节。
or It may also have been the case that both the empty space and \n character get replced by v0.
不,只有一个字节。
a0 should have contained the address of key only, but from comment it seems that the two strings are concatenated. How does that happen.
是,$ a0包含地址key
,但字符串由空字符关闭。当你这样做
key: .ascii "key: "
由"key: "
表示的字节放在内存中,最后没有空字符(因为使用了.ascii)。接下来,指令char: .asciiz " \n"
将" \n"
的字节放在内存中,在前一个字节之后。在这种情况下,它们是空终止的,因为使用了.asciiz(而不是.ascii)。因此,地址key
指向在换行符后以空值终止的字符串。或者,key
是字符串第一个字符的地址。
使其更清晰
.asciiz "abc"
和
.ascii "a"
.ascii "b"
.asciiz "c"
是一样的。