2016-12-05 77 views
1
00111100000000010001000000000001 
00110100001001000000000000000000 
00100100000000100000000000000100 
00000000000000000000000000001100 
00100100000000100000000000001010 
00000000000000000000000000001100 

鑑於此機器代碼,我需要獲取第一行(32)個字符,以便我可以將其轉換回MIPS指令。我無法弄清楚如何獲得第一行代碼並將其存儲到寄存器中。有沒有人有任何想法如何獲得第一行,並在接下來的行?我被給了一個暗示來嘗試使用sll或srl指令,但是當我這樣做時,我沒有看到代碼中的任何更改。如何從MIPS中的字符串獲取指定數量的字符?

#File to be read from 
file: .asciiz "bincode1.txt" 
#place to store contents of file 
buffer: .space 1024 

    .text 

#Open the file 
li $v0, 13 #system call to open the file 
la $a0, file #load address of the file and store in a0 
li $a1, 0 #a1 is reserved for a line in the text file 
li $a2, 0 
syscall  #opens the file 
move $s0, $v0 #save file descriptor 

#Read the file 
li $v0, 14 #system call to read from the file 
move $a0, $s0 #put the file name into a0 
la $a1, buffer #address of the buffer to read 
li $a2, 1024 
syscall 

#Close the file 
li $v0, 16 #system call to close the file 
move $a0, $s0 #file name to close 
syscall 

#print contents of buffer to verify it copied correctly 
li $v0, 4 
la $a0, buffer 
syscall 

#la $t1, buffer 
srl $t2, $a0, 32 

li $v0, 4 
la $a1, ($t2) 
syscall 

文件bincode1.txt包含前面的6行機器碼。如果我嘗試將其移動32位,我會得到一個錯誤,而且我知道這是不正確的,但我不確定從這裏開始做什麼。任何的意見都將會有幫助。

+0

在我的代碼上,我忘了複製第一行上面的.data部分。那也應該在那裏。 – Jonathan

+0

你可以編輯你的問題來解決它,尋找標籤下的「編輯」。只是在**回答之後不要更改代碼/問題**,那麼只需在其他段落中添加任何勘誤或更多信息,那麼答案仍然與原始問題相關。在你得到任何答案之前:儘可能多地改進你的問題。它看起來很合理,但你仍然可以添加信息你使用什麼環境(什麼彙編程序,調試程序,命令行編譯可執行文件的外觀),並確保具有相同環境的任何人都可以複製/粘貼+運行到相同的問題。 – Ped7g

回答

0

打印內容後打斷點進行驗證,打開內存視圖指向地址buffer,您會看到文件的內容被讀爲連續的字節值,這些值被ASCII編碼形成文本。

所以實際字節值是:

buffer: .byte 48, 48, 49, 49, 49, ... , 48, 49, <EOL>, 48, 48, ...` 

哪裏<EOL>是線(可能在MIPS 13,也許只是10或兩者)的結束,48是ASCII字符的價值'0'49是價值ASCII字符'1'

當您在某個hexa-viewer中查看「bincode1.txt」文件的內容時,可以看到相同的字節。

所以根據'0' (48)/'1' (49)讀取字符(32個ASCII字符轉換成您必須通過32個字節環單32B值,設定單位爲0/1,決定如何處理錯誤的輸入與非0/1位數字,爲了簡單起見,您可能只需執行and char,1即可從任何字節(甚至非數字字符)中獲取0/1位,並忽略不正確的文件),並將這些位合併在一起。

合併位一同最簡單的方法是IMO一些臨時寄存器設置爲零提前環t0 = 0的,然後從buffer讀取下一個字符,你首先通過一個sll $t0, $t0, 1左其所有位移位,再經過設置最低顯著與從緩衝區中讀取的一位(bitwise OR可能會有所幫助,之後and char,1只從char中提取最低位(最右邊))。循環播放32次,瞧,你在t0中有32b數字(當你向左移動時,第一個字符將會在最左邊結束,這很可能是你想要的)。

然後您可以打印它作爲數值,以驗證轉換產生正確的結果。

提示:嘗試可視化您的輸入和輸出數據,以及這些位如何相互關聯,用調試器播放一下以查看它如何顯示內存和寄存器值(也許它允許多種不同的格式/分組,這可以使您更輕鬆地檢查不同情況下的特定值,例如,在檢查ASCII數據時,通常可以看到單獨的字節,但例如word大小的數字在4個字節分組爲單個值時更適合查看)。然後嘗試設想如何處理輸入數據以計算預期輸出,併爲其編寫算法。

相關問題