1

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 にはキーのアドレスのみが含まれているはずですが、コメントからは 2 つの文字列が連結されているようです。それはどのように起こりますか。

4

1 に答える 1

1

sbメモリに 1 バイトを格納します。

質問に詳しく答えるには:

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は 1 バイトのみを格納します。この場合は address のバイトでchar、これはスペースです。改行は次のバイトです。

or It may also have been the case that both the empty space and \n character get replced by v0.

いいえ、1 バイトだけです。

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 には addresskeyが含まれていますが、文字列は null 文字で閉じられています。あなたがするとき

key: .ascii "key: "

で表されるバイト"key: "はメモリに配置され、最後にヌル文字はありません (.ascii が使用されているため)。次に、命令は前のバイトの後に、メモリ内char: .asciiz " \n"のバイトを配置します。" \n"この場合、(.ascii の代わりに) .asciiz が使用されるため、null で終了します。したがって、アドレスkeyは、改行の後に null で終了する文字列を指しています。または、key文字列の最初の文字のアドレスです。

より明確にするために

.asciiz "abc"

.ascii "a"
.ascii "b"
.asciiz "c"

同じだ。

于 2012-10-02T09:35:23.173 に答える