0

私の目標は、以下のCコードをMIPSアセンブリに変換することです。コードの重要な部分が欠落しているように感じます。誰かが私が間違っていることと、問題を解決するために私がしなければならないことを説明できますか?

Cコードは次のとおりです。

char str[] = "hello, class";
int len = 0;
char *ptr = str;
while (*ptr && *ptr != ’s’)
   ++ptr;
len = ptr - str;

これまでの私のコードは次のとおりです。

.data
    myStr: .asciiz "hello, class"
    s: .asciiz "s"
main:
    la $t0, myStr
    la $t1, s
    lbu $t1, 0($t1)

loop:
    beq $t0, $t1, continue
    addi $t0, $t0, 1
    j loop

continue:
    sub $v0, $t0, $t1
4

2 に答える 2

3

myStrまず、ループ内からバイトをロードしていません。

ループが始まる前にキャラクターをlbuロードしますが、ループ内では、それをアドレスと比較します。s$t1 $t0

あなたがする必要があるのは、ループを通過するたびlbuにバイトを調べ、それを。と比較することです。$t0$t1

MIPSを実行してからしばらく経ちますが、これで修正できると思います。

変化する:

loop:   beq    $t0, $t1, continue
        addi   $t0, $t0, 1
        j      loop

の中へ:

loop:   lbu    $t2, 0($t0)            ; get character at current string location.
        beq    $t1, $t2, continue     ; exit loop is it matches.
        beq    $0, $t2, continue      ; exit loop if it's null.
        addi   $t0, $t0, 1            ; continue loop with next character.
        j      loop

目標が単にCコードをMIPSに変換することである場合は、MIPSgccコンパイラーのコピーを取得して実行しgcc -S、場合によって-O0は出力を理解できるようにすることができます:-)

それがおそらく最速の方法です。もちろん、あなたの意図がそれを手で行う方法を学ぶことであるならば、あなたはこのアドバイスを無視したいかもしれませんが、それでも私の意見では学ぶのに便利です。

于 2012-02-07T02:29:08.940 に答える
1

ループの外側でA/myStrからバイトをロードするのではなく、アドレスをロードしてループ内でインクリメントしますが、アドレスをそのアドレスの文字ではなく文字「s」と比較します。

また、その文字を0と比較することもありません。

于 2012-02-07T02:34:45.413 に答える