0

私はこのC関数を持っています:

int bin_img(unsigned char *ptr, int w, int h, unsigned char limiar);

私のコードでは、次のように関数を使用します。

printf("The value is %d\n",bin_img(dp, width, height, LIMIAR));

変数が次のように定義されていると想像してください。

#define LIMIAR 128
unsigned char *dp;
int w = 5;
int h = 0;

dp[] = {74,250,153,28,26}

MIPS で bin_img 関数をプログラムする必要があります。

次のコードがあるとします。

bin_img:

    lb  $15,0($4)   
    move    $2,$15
    jr  $31

74 witch is the first element of my array. と表示されます。私が行った場合

bin_img:

    lb  $15,1($4)   
    move    $2,$15
    jr  $31

またはこれ:

bin_img:

    lb  $15,2($4)   
    move    $2,$15
    jr  $31

それはいくつかの負の数を出力し、私がこれを行うと:

bin_img:

    lb  $15,3($4)   
    move    $2,$15
    jr  $31

またはこれ

bin_img:

    lb  $15,4($4)   
    move    $2,$15
    jr  $31

それぞれ 28 と 26 を出力します。負の数を出力するのはなぜですか?

250 と 153 を出力するべきではありませんか?

4

1 に答える 1

1

署名されていないバージョンの LoadByte のlb代わりに署名されたバージョンを使用しているため、負の数値が出力されますlbu

このlb命令は、メモリから 1 バイトを読み取り、それをデスティネーション レジスタの最下位 8 ビットに格納し、読み取ったバイトの最上位ビットの値で残りの 24 ビットを設定します。このlbu命令は、これらの 24 ビットをゼロに設定します。

したがって、数値を出力するために発行するシステムコールは、レジスタの内容を A2 補数として扱い、入力バイトが 128 以上の場合に負の数値を出力します。プログラムを修正するには、lbu命令を使用する必要があります。

于 2012-04-10T15:36:41.287 に答える