前提・実現したいこと
「以下のCコードで示した関数strcpyを$s0をiとして使ってMIPSのアセンブリコードで書き、また関数の実行前と実行中と実行後のスタックの様子を図示せよ。」
という課題が出されたのですがよくわからなかったので質問させていただきます。
主にわからない点は、
・以下のCコードにおけるdo while文の継続条件式の意味
・引数を使用していない関数なのにスタックポインタを使う理由($s0を退避させるだけでよいのか?退避させるべきレジスタは?)
です。
MIPSコードは書いてみましたが自信がないので、そちらの方も教えていただけると助かります。
該当のソースコード
C
1void strcpy(char dst[], char src[]) { 2 int i = 0; 3 4 do { 5 dst[i] = src[i]; 6 } while (src[i++]); 7}
MIPS
1#a0 = dstのベースアドレス、a1 = srcのベースアドレス 2 3strcpy: 4 addi $t4, 0x00 #$t4=0x00 5 addi $s0, $0 #$s0=i 6 addi $sp, $sp, -4 7 sw $s0, 0($sp) 8 9do: 10 add $t0, $t0, $a0 #address of dst[i] 11 add $t1, $t1, $a1 #address of src[i] 12 lb $t3, 0($t1) #$t3 = src[i] 13 sb $t3, 0($t0) #dst[i] = src[i] 14 beq $t3, $t4, done #if(dst[i] == \0) done 15 addi $s0, $s0, 1 #i=i+1 16 sll $t0, $s0, 2 #$t0 = i * 4 17 sll $t1, $s0, 2 #$t1 = i * 4 18 j do 19done: 20 lw $s0, 0($sp) 21 addi $sp, $sp, 4 22 23 jr $ra
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。