• ベストアンサー

汎用レジスタのワーキングビットテスト

アセンブラ初心者です。 汎用レジスタR0からR15をワーキングビットテストするアセンブラソースを書いているのですが実行すると暴走します。 汎用レジスタR0からR15をワーキングビットテストする場合、レジスタデータを一旦どこかに保存してから行うものなのでしょうか? また、R0がインデックスレジスタ(意味が良く分かってません)、R15がスタックポインタが格納されていますがこれらのレジスタも値を一旦どこかに退避しておけばテストを行ってもよいものなのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • tokichim
  • ベストアンサー率42% (88/205)
回答No.6

新人さんなのかなあ 社内の他の人に訊いてコミュニケーションとる&スキルアップすることも仕事のうちなのでそちらを勧めます。 あとソフト屋の先輩としてアドバイスできることは、とにかくノートを一冊用意しましょう。 意味のよくわかってないことがあるならノートに調べて書く。やり方がわからないことがあるならそれも含めて頭の中のイメージをノートに書く。わからない部分を埋めていく。思考の道筋を見える形にする。 これ以上は申し訳ないが時間割けないのでもっと親切な方に任せます。 以下は最後の補足。 SH2はしばらく使ってないので定かでないが スタックにいれるのは add #-64,r15 mov.l r0,@(0,r15) ... mov.l r15,@(15,r15) かな? Cでアルゴリズムを書いた例。 単純なプログラムでCコンパイラが吐き出したアセンブラソースをCソースと比較してみてレジスタの使い方を学ぶという方法もあり。 typedef unsigned long uint32t: #define NUM_REGS 16 /* レジスタ数 */ #define NUM_BITS 32 /* レジスタのビットサイズ */ uint32_t reg[NUM_REGS]; /* レジスタ regsの番号*rreg、ビット*rlocを先頭に1のビットを探す */ int walk_bittest( int *rreg, int *rloc, uint32_t *regs ) { int reg = *rreg; int loc = *rloc; int found_flg = 0; uint32_t bitwalker = (1 << 0); /* set to LSB */ /* 1のビット見つけるまでループ回す */ while( reg < NUM_REGS ) { while( loc < NUM_BITS) { /* walker found 1 ? */ if ((bitwalker & regs[reg]) != 0) { found_flg = 1; goto END; } /* walk to next bit */ bitwalker <<= 1; if (++loc == NUM_BITS) { /* all bit tested ? */ /* yes, reset bit location to LSB */ bitwalker = (1 << 0); loc = 0; break; } } reg++; } END: *rreg = reg; *rloc = loc; return found_flg; }

quest111
質問者

お礼

連絡が遅れてすいませんでした。 参考になりました。ありがとうございました。

その他の回答 (5)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

専門家さんは呆れてさじを投げちゃったのかな? >課題ならいいのですが、実務なので焦ってます。 もっと性質が悪いでしょ。それ。 仕事でやる話なら、同僚なり先輩なり上司に訊くべき話。 余談 SH7211ってSH2のお仲間なのね。 RISCの端くれだからそりゃあpush/popに専用命令なんかないですね。

  • tokichim
  • ベストアンサー率42% (88/205)
回答No.4

walking bit testね。納得。でもこれって公認された言葉かなあ? 1のビットを端からずらして(歩かせて)テストして、1であるところのレジスタとビット位置を調べる、ということでいいのかな? で、やり方は↑のとおり。(笑) スタックに入れる、ビットシフトする、テストorコンペアする具体的方法はCPUのマニュアルを参照してください。というかひととおり目を通してください。用意されている道具(レジスタ、フラグ、命令、メモリ)を組み合わせて使って何かを実現するというのは現実世界と何ら変わらないんよ。わからない場合は紙にイメージを書いてみて。 正直、この質問が何かの課題だったら、考えること自体に意味があるのでもうこれ以上教えません。

quest111
質問者

補足

はい、レジスタのビットに1を立てて、1つずつずらしていくテストです。 課題ならいいのですが、実務なので焦ってます。 (ーー;)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

専門家に任せますが(^^; walking bit test という言葉も知らなかったので調べてみたのですが メモリか何かのテストですか? --- Dear Maxim, I’m using your software, beside my Audio Precision System, for fast evaluation and when I am on the „road“ for nearly two years and I am very happy with it. When I asked for the “Bit True Test” in the pro version, for testing Digital to Digital Systems, I was thinking of the so called “walking bit” test (after a stark sequence, only one bit at a time is 1, and all the others are 0, and this one bit is “walking” on all positions until the test ends with a stop sequence). What do you think about this sort of implementation? --- でそれはそれとして、 > レジスタの値をスタックにコピーするにはアセンブラでどのようにかくのでしょうか? だから、使っているCPU(やアセンブリ言語)によって 違うんだから書けといわれたって無理でしょ。 レジスタ名が r0 ~ r15になってるCPUなんて幾つもありますよ。 ふつーは、pushすりゃあいいんだろうけど 68k みたいに便利な命令持っている石もあるし。

quest111
質問者

補足

補足不足ですいません。 RENESASのSH7211を使っています。 自分なりに調べてみたのですがPUSH,POP命令はありませんでした。

  • tokichim
  • ベストアンサー率42% (88/205)
回答No.2

> ワーキングビットテスト ANo.1さんと同じく意味不明。「ワーキング」なビットテストって聞いたことありません。誰かの造語かな? 単にあるビットの0/1を調べるビットテストのことだとしても、普通レジスタの内容は非破壊で調べるので暴走はしないですけど。 ちなみにある時点のレジスタ全部の値を調べたいなら、全レジスタをスタックにだーっと積んで(つまりスナップショットを取る)、そこの内容を調べればよろし。

quest111
質問者

補足

すいません、ワーキングではなくウォーキング(WalkingBitTest)でした。 レジスタの値をスタックにコピーするにはアセンブラでどのようにかくのでしょうか?

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

・なんというCPUに対するテストでしょうか? ・“ワーキングビットテスト”ってなんですか? #ぐぐったけど0件 >R0がインデックスレジスタ(意味が良く分かってません)、R15がスタックポインタ スタックポインタは迂闊に壊すと >実行すると暴走します。 でしょうねえ。

quest111
質問者

補足

すいません、ワーキングではなくウォーキング(WalkingBitTest)でした。

関連するQ&A