MIPS返回的值不正确

时间:2012-04-10 11:10:23

标签: assembly mips

我有这个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吗?

1 个答案:

答案 0 :(得分:1)

正在打印负数,因为您使用的是已签名版本的LoadByte lb,而不是未签名的版本lbu

lb指令从存储器读取一个字节并将其存储在目标寄存器的8个最低有效位中,并将剩余的24个位设置为读取字节的最高有效位的值。 lbu指令将这24位设置为零。

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