ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのRecursive, 32bitのintegerの1と0を区別する

  • mixiチェック
  • このエントリーをはてなブックマークに追加
アセンブリの勉強をしているのですがぶち当たっている問題が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++で訳していただける方、さらにはアセンブリ言語で書いていただければ大変助かります。

助言、アドバイス等よろしくお願いします。

コメント(5)

基本文法のみのJavaコードですよね…。

この程度なら、C++わかるのに、Javaがわからないって言うほうがわからない…。

どちらも、基本文法に大差ないです。
1はむちゃんさん
返答ありがとうございます。処理系に問題があっても、これをアセンブリにするのでロジックがあればなんとかやって見れるので大丈夫です。ありがとうございます

3. 檸檬さん
本当だ。C++とほとんど変わらない。つまり結論出すと何の言語であれリカーシブの基本が理解していなかったという事になるかもしれません。試行錯誤します。

4.Pseudecodeをありがとうございます。ストーリができるとやりやすくなります。とりあえずアセンブリで間違い前提で以下まで作ってみました。どうもヘルプをありがとうございます。

count:
add $sp, $sp, -8
sw $ra, 4($sp)
sw $a0, 0($sp)


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

誰かチェックしていただけると大変ありがたいですが場所違いになるかな、本当に困ったときはアセンブリの方でもまたお願いすることにします。
コメントをありがとうございました。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。