2017-01-17 6 views
0

このコミュニティでは新しいです。私たちは大学でmipsをプログラミングしています。私は宿題で私の問題を解決する必要があります。 .pgmファイルを開いて、いわゆるヘッダー(この場合はp5形式と可変長x幅)を読み取る必要があります。読み込んだファイルを開くと、1行目に4行が表示されます。 p5; 2番目。長さx幅; 3番目はアスキーコードの色の濃さと4番目の長さです。 私の仕事は今このasciiを変換することです、そして、私はこのasciiのサイズを知る必要があると思います。 以前、私は、ASCIIに変換するためのMIPSコードを持っていましたが、ここでの問題は、このコードは、この(コメントはそのためのgerman-に残念である)のように、私のアスキー用語の一部だけを変換することを、次のとおりです。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の最後の文字は「最大グレー値の後の最初の空白文字」です。したがって、grey-maxを解析してから次のバイトを空白文字(32(スペース)、9(TAB)、13(CR)、10(LF)、11(VT) )、12(FF))、ピクセルデータが開始される。

私はDOSで誰かが "13、10" CR + LFでグレーの最大値を持つ画像を生成したと思うので、かなり愚かなフォーマットですが、問題はありません(メモリにロードした後、何を読みましたか)。

そして今、戻ってあなたの本当の問題に...

まず最初は、これらのデータはASCIIではありません。それらは2値画素データである。あなたの "GV"は既に値71と86の2ピクセルです。あなたがASCII文字列として表示すると、コース71は 'G'として表示されますが、それは決して関連しません。ヘッダーの終わりを検出した後、バイナリデータが入ります。

これらのバイナリデータのサイズはwidth*height*bytes_per_pixelです。 Bytes_per_pixelは、gray_max < 256の場合は1であり、gray_maxの場合は2は256..65535の範囲にあります。

ピクセルあたり2バイトを使用する場合、最上位バイトが最初です(したがって、値4097はバイトとしてエンコードされます。16, 1、値71は0, 71としてエンコードされます)。

ヘッダーに "max gray"を255に設定した0-255のグレースケールイメージがある場合は、残りの(width*height)バイトのファイルをバイナリデータ(最後のヘッダー文字の後ろ)として読み込むだけです。行ごとに、上から下へのピクセルデータです。

max_grayが40や15000のようなものであれば、ピクセルデータを何らかの形で0-255の8ビット範囲に変換する必要があるかどうかは疑問です(最初のケースでは "アップスケール"、2番目の "ダウンスケーリング"これがプロフェッショナルPGMリーダーになりたいと思えば、おそらく何らかのガンマ変換によって)。しかし、あなたの学校の仕事はガンマ補正を実装していない約0-255の画像しかないと思います。

関連する問題