我有这个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吗?
答案 0 :(得分:1)
正在打印负数,因为您使用的是已签名版本的LoadByte lb
,而不是未签名的版本lbu
。
lb
指令从存储器读取一个字节并将其存储在目标寄存器的8个最低有效位中,并将剩余的24个位设置为读取字节的最高有效位的值。 lbu
指令将这24位设置为零。
因此,您发出的用于打印数字的系统调用将寄存器内容视为A2补码,因此当输入字节> = 128时打印负数。要修复程序,应使用lbu
指令