アセンブリの勉強をしているのですがぶち当たっている問題がJavaで書かれている部分がありそこで皆さんに聞こうと思い書き込みをしました。C++はわかるので、日本語かC++に訳していただければ結構であります。 問題が二問続きます。 1.アセンブリで32ビットの整数integer $t0の1が幾つあるか数えるコードを書け。 つまり、0001 1110 1011 1000 0100 1111 0000 1100 1001 という情報が$t0に入っていると、アウトプットは1が17個あるので17になります。これを私は main: addi $t4,$zero,$zero addi $t3,$zero,1 addi $t2,$zero,28 add $t0, $zero, $zero add $v0, $zero, $zero loop: and $t4, $a0, $t3 #test if the least significant has 1 or 0. srl $a0, $a0, 1 #shift 1 bit to right. addi $v0, $zero, $t4 addi $t4, $zero, $zero add $t0, $t0, 4 bne $t2, $t0, loop
と答えました。おそらくロジカル的には正解していると思います。 次の(が)問題です。 上記のコードをリカーシブ recursive functionに直せ。細かい説明書きですが、for each invocation, saves any registers that it uses and the return addresses on the stack. All caller's registers, including $a0, but not $vo, should be restored before returning to the caller. Register $v0 will contain the result. そして例として回答がJavaで表されています。 int countOnes(int x){ if (x==0) return 0; int lsbx = x&(0x00000001);//hex constant x = x>>>2; //right logical shitf return lsbx + ones(x); } 再度ですがこのJavaコードが良くわからないので、日本語、英語、もしくはC++で訳していただける方、さらにはアセンブリ言語で書いていただければ大変助かります。
and $t4, $a0, $t3 #check if the least significant of $a0 has 1 or not
addi $v0, $zero, $t3 #set the result//increment if 1 comes from AND instruction
addi $t4, $zero, $zero #store zero into $t4 for next time
srl $a0, $a0, 1 #shitf right by 1 bit for next AND instn
addi $sp, $sp, 8 #reset stack pointer
jr $ra #return
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
jr $ra
main;
addi $t3, $zero, 1 #this is for AND instruction
addi $t4, $zeor, $zero #the result of AND instn
addi $v0, $zero, 1