2014-05-20 24 views
0

我做了一個項目在MPS模擬器在火星模擬器和我的程序掛在系統調用由於奇怪的行爲。不正確加載的值從內存註冊到mips

我想存儲給定的字符緩衝區文件並傳遞給系統調用適當的長度。

.data 
line_length: .space 4 
# ... 

.text 
# ... 

lb $t0, line_length 
li $v0, 15 
lb $a0, io_descriptors+4 
la $a1, output_line 
move $a2, $t0 
syscall 

存儲在line_length中的值是0x80。在lb指令之前和之後,情況確實如此。雖然lb之後$ t0的值是0xffffff80,這是出於我理解之外的原因。由於數字是負數,系統調用失敗。可能是$ t0不存儲0x80值的原因是什麼?我該如何解決它?

+1

這已經有一段時間,因爲我與MIPS的工作,但我認爲,這是怎麼回事是字節值0x80表示被簽名擴展到32位。即它是一個有符號的字節加載。 0x80是8位二進制補碼值-128。 MSB是1,所以是負數。 – Kaz

回答

2

將單個字節(8位)加載到寄存器(MIPS上的32位)時,該值需要爲擴展以填充剩餘的24位。有兩個選項:

  • 零擴展與零填充剩餘的高位比特。當值爲未簽名的時,這是有意義的。
  • Sign extend它用最高有效位的副本填充剩餘的高位。當值爲時,這是有意義的

lb加載一個字節,並且將其放入32位寄存器之前登錄延伸它。由於您讀取的是0x80,因此最高位爲1,因此32位結果爲0xFFFFFF80

既然你已經宣佈line_length爲4個字節,要使用lw它加載一個完整的32位字(不帶擴展名)。只要確保你符合你用來訪問和操作這個變量的指令。

參見:

+0

非常感謝您的回覆。整個項目主要是在字符上,所以我變得太習慣lb.不知道這個簽名擴展是如何工作的,並且讓人感到困惑。 –