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 女巫是我数组的第一个元素。如果我做

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指令从内存中读取一个字节并将其存储在目标寄存器的 8 个最低有效位中,并将剩余的 24 个位设置为所读取字节的最高有效位的值。该lbu指令将这 24 位设置为零。

因此,您发出的打印数字的系统调用将寄存器内容视为 A2 补充,因此当您的输入字节> = 128 时打印负数。要修复您的程序,您应该使用该lbu指令。

于 2012-04-10T15:36:41.287 回答