2012-10-02 194 views
1

雖然通過MIPS代碼,我有些困惑。代碼如下所示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應該只包含密鑰的地址,但從註釋看來,這兩個字符串是串聯的。這是怎麼發生的。

回答

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" 

是相同的。