プロが教える店舗&オフィスのセキュリティ対策術

アセンブラ初心者です。
汎用レジスタR0からR15をワーキングビットテストするアセンブラソースを書いているのですが実行すると暴走します。

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

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/04/23 10:27

専門家さんは呆れてさじを投げちゃったのかな?



>課題ならいいのですが、実務なので焦ってます。

もっと性質が悪いでしょ。それ。
仕事でやる話なら、同僚なり先輩なり上司に訊くべき話。

余談
SH7211ってSH2のお仲間なのね。
RISCの端くれだからそりゃあpush/popに専用命令なんかないですね。
    • good
    • 0

walking bit testね。

納得。でもこれって公認された言葉かなあ?

1のビットを端からずらして(歩かせて)テストして、1であるところのレジスタとビット位置を調べる、ということでいいのかな?
で、やり方は↑のとおり。(笑)

スタックに入れる、ビットシフトする、テストorコンペアする具体的方法はCPUのマニュアルを参照してください。というかひととおり目を通してください。用意されている道具(レジスタ、フラグ、命令、メモリ)を組み合わせて使って何かを実現するというのは現実世界と何ら変わらないんよ。わからない場合は紙にイメージを書いてみて。

正直、この質問が何かの課題だったら、考えること自体に意味があるのでもうこれ以上教えません。

この回答への補足

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

補足日時:2008/04/09 14:31
    • good
    • 0

専門家に任せますが(^^;



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 みたいに便利な命令持っている石もあるし。

この回答への補足

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

補足日時:2008/04/09 14:26
    • good
    • 0

> ワーキングビットテスト


ANo.1さんと同じく意味不明。「ワーキング」なビットテストって聞いたことありません。誰かの造語かな?
単にあるビットの0/1を調べるビットテストのことだとしても、普通レジスタの内容は非破壊で調べるので暴走はしないですけど。

ちなみにある時点のレジスタ全部の値を調べたいなら、全レジスタをスタックにだーっと積んで(つまりスナップショットを取る)、そこの内容を調べればよろし。

この回答への補足

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

補足日時:2008/04/09 10:25
    • good
    • 0

・なんというCPUに対するテストでしょうか?


・“ワーキングビットテスト”ってなんですか?
#ぐぐったけど0件

>R0がインデックスレジスタ(意味が良く分かってません)、R15がスタックポインタ

スタックポインタは迂闊に壊すと
>実行すると暴走します。
でしょうねえ。

この回答への補足

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

補足日時:2008/04/09 10:24
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!