2012-04-10 17 views
0

我有這樣的C函數:MIPS返回的值不正確

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 r espectively。爲什麼它會打印負數?

Should'n其打印250和153?

回答

1

它正在打印負數,因爲您使用的是簽名版本的LoadByte lb而不是未簽名版本lbu

lb指令從存儲器中讀取一個字節,並將其存儲在目標寄存器的8個最低有效位中,並將其餘24位設置爲讀取字節最高有效位的值。 lbu指令將這些24位設置爲零。

因此,發出打印號碼的系統調用將寄存器內容視爲A2恭維,因此當輸入字節大於等於128時打印負數。要修復程序,應使用lbu指令。

+0

謝謝。已解決驗證讀取的數字是否大於0.如果不是,則添加255.您的解決方案是正確的,並且soooooo更容易。非常感謝 – Favolas 2012-04-10 21:06:43