2017-01-17 72 views
0

我是這個社區的新成員。我們在大學編程mips,在作業中我需要解決我的問題。 我們必須打開一個.pgm文件並讀取所謂的標題(在這種情況下,使用p5格式和可變長度x寬)。當你打開你讀過的文件時,你會得到4行第一行。 P5;第2位。長x寬;第三是ascii碼的顏色深度和第四長期。 我的工作是現在轉換這個ascii,我想我必須知道這個ascii的大小。 以前,我對ASCII轉換一個MIPS代碼,但現在的問題是,這個代碼轉換隻是我的ASCII術語的一部分,像這樣(的意見是德語的感到抱歉):Mips彙編程序 - 如何獲取.ascii的長度

.data 
str: .ascii "GV_]VTI=97:@JPH<1-/6;L\pz ­¶³¶»ÃËËÄ»°y{xzk`[email protected]@?>9326<DD:1.--++*-./-//000002222344///35;@LVau ¥´¬§»Çĸ³³»ª °¿Åù±¯¦||x{{yttw{sv}¡°¸±¡¡£¢£p_Z[_hfYUW^accacdehhhhdghjjlnnonnnljifjgfdggfdiiiillllglrvtkiltzx~«ÀÖ¿°©´¾ÃÇÈ×ßãÖÇ»º­¡±¼ËÙENSOIHD>;>CHTPB4/+.6<JWizª¯®°¸ÃËËÄ»¶xvj\NECDB<735:?:40//---,+,--./00000222235400259=DNXdw£­®³½Á½³¯¯²¢¥§°»ÃÆõ©«}z{|xtmmqus¡±À¹¦m`ZZ^ce\WZ^abcacdehhhhdghjjlnnonnnlljijhggihhfiiiillmljnuxvnlqw~|¤¶ÐáÕÉÅÇÈÇÉÌÝàÒľ³µª¡¡¤±¼ËÙ[email protected]??DILNRI=1,*-6=ISao §¨­·ÃËËÄ»º¯wpg\SIEDC>83359520110//.--,-//0000022224751139=CGOXfx£®¼¶®¨¤£¥°»À»¾¼³©¥vnjjmsz¬ÅÅƳxxttxuja[Y[_c`^]^abcacdfhhhhdghjjlnnnnnnonkjlkihjjhghhhhkkjknsy}vpqw~¸ÏãéáÝ×ÓÌÁÂÈÙ඲ª¬¥¦¢§ ¡¨±¼ÌÙ@[email protected]<82.+)-6>IO[e| £«´ÅËËļÁ¹­vndbVKACA<11/.-.//000022225772/4<AFIQYhx¢°½­{¡±½½±²¶´®|lmos¸ÍÌ®tpmjgnnjc[XX[`a`_^abcacdfhjhhdghjjlnoonnnpomknmkjljihggggjjjjsv{wrs}¸ÑãíêÝß×ÏǸ´½ÐÛµ²§¡¨¡ª ¢«²¤¡«±ºÌÙ:ADEA>:5;94268501051" 
# it converts just to: GV_]VTI=97:@JPH<1 
     .text 
main: 


addi $s0, $zero, 0 # $s0 :=0; hier wird das Ergebnis aufsummiert 
la $s1,str   # $s1 := &str; hier wird der Zeiger auf das nächste Zeichen gehalten 
addi $s2, $zero, 10 # $s2 := 10; hier steht konstand die 10 zur Multiplikaton 
addi $s3, $zero, 48 # s3 := 48; hier 48, um die ASCII "0" in den Wert 0 umzuwandeln 

loop: 
lb $s4,($s1)  # Lade nächstes Zeichen des 
sub $s4, $s4, $s3 #Bilde ASCII-Ziffer auf Integer-Wert [0..9] ab 
bltz $s4,terminate # Wenn Zeichen <0, 
mult $s0, $s2 
mflo $s0   # §s0 := §s0 *10 
add $s0, $s0, $s4 # s0= s0 + Ziffernwert 
addi $s1, $s1, 1 # s1= s1+1; also auf die nächstes Zeichn im String 
j loop 

terminate: 
li $v0,1   # Resultat ausgeben 
or $a0, $zero, $s0 # in ss0 stand das Ergebnis 
syscall 
li $v0,10 
syscall 

希望你能給我一個提示。

+1

目前尚不清楚你想轉換什麼。這顯然不是一個數字? – Jester

回答

0

起初,我誤解你的問題,但我仍然認爲我沒敢回答的也是真正的答案的一部分,所以首先:

一個問題應該是「如何找到頭端和圖像數據的開始「

PGM header的最後一個字符是「最大灰度值之後的第一個空白字符」。因此,您必須按值解析整個報頭值,直到您解析灰色最大值,那麼下一個字節應該是空格(空格),9(TAB),13(CR),10(LF),11(VT ),12(FF)),然後開始像素數據。

恕我直言,這是相當愚蠢的格式,因爲我敢打賭,在DOS下有人確實用灰色最大值後產生了一些帶有「13,10」CR + LF的圖像,但是......不是你的問題(或者加載到內存後檢查你的文件,它讀了什麼)。

現在回到你真正的問題...

首先,這些數據不是ASCII。它們是二進制像素數據。您的「GV」已經是值71和86的兩個像素。當您將它顯示爲ASCII字符串時,71當然會顯示爲'G',但這與任何方式無關。關於PGM的一切「ASCII」只是標題,在檢測到標題結尾之後,二進制數據就會流入。

而這些二進制數據的大小是width*height*bytes_per_pixelBytes_per_pixel對於gray_max < 256是1,對於gray_max是2對於256..65535的範圍。

當使用每個像素2字節時,最高有效字節是第一個(所以4097的值編碼爲字節:16, 1,值71編碼爲:0, 71)。

如果您在頭部設置爲255時將「max grey」設置爲0-255灰度圖像,則只需將文件的其餘(width*height)字節作爲二進制數據(在最後一個標頭字符後面)讀取即可,那些是您的像素數據,從上到下逐行排列。

如果max_gray是別的,比如40或15000,那麼是否應該以某種方式將像素數據轉換爲0-255的8位範圍(第一種情況是「升級」它們,第二種是「縮小比例」如果想成爲專業的PGM閱讀器,可能需要進行一些gamma轉換)。但是我希望你的學校任務只有約0-255張圖片,而不需要實施伽馬校正。