2017-01-17 63 views
0

이 커뮤니티에서는 새로운 항목입니다. 우리는 대학에서 프로그래밍 밉스 (mips)를하고 있으며 숙제 문제에 대한 해결책이 필요합니다. .pgm 파일을 열고 헤더 (이 경우 p5 형식 및 가변 길이 x 넓음)를 읽어야합니다. 읽은 파일을 열면 1과 4 행을 얻습니다. p5; 2 위. 길이 x 너비; 세 번째는 아스키 코드의 색 깊이와 네 번째 장기 값입니다. 내 직업은이 ascii를 변환하는 것이고이 ascii의 크기를 알아야한다고 생각합니다. 이전에,이 (코멘트 독일 -에서 그 죄송합니다)처럼이 코드는, 내 아스키 용어의 단지 일부를 변환하는 것으로, 아스키 변환하는 MIPS 코드,하지만 여기에 문제가 있었다 :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의 마지막 문자는 "최대 회색 값 이후의 첫 번째 공백 문자"입니다. 그래서 당신은 회색 - 맥스를 파싱 할 때까지 전체 바이트 값을 파싱해야합니다. 그 다음 바이트는 공백 (32 (공백), 9 (탭), 13 (CR), 10 (LF), 11 (VT), 12 (FF))이면 픽셀 데이터가 시작됩니다.

IMHO는 아주 어리석은 형식입니다. 도스에서 누군가가 "13, 10"CR + LF로 회색 최대 값을 가진 일부 이미지를 만들었지 만 ... 문제가 아니거나 메모리에로드 한 후 파일을 확인하면, 무엇을 읽었습니까?)

다시 진짜 문제는 지금

그리고 ...

우선은, 그 데이터는 ASCII 없습니다. 이진 픽셀 데이터입니다. "GV"는 이미 값 71과 86의 두 픽셀입니다. ASCII 문자열로 표시하면 과정 71이 'G'로 표시되지만 어떤 방식 으로든 관련이 없습니다. PGM에 관한 모든 "ASCII"는 헤더 일 뿐이며 헤더 끝을 감지하면 바이너리 데이터가 입력됩니다.

그리고 이진 데이터의 크기는 width*height*bytes_per_pixel입니다. Bytes_per_pixelgray_max < 256에 대해 1이고 gray_max에 대해 2는 256..65535 범위에 있습니다.

픽셀 당 2 바이트를 사용하는 경우 가장 중요한 바이트가 먼저옵니다 (따라서 값 4097은 바이트로 인코딩 됨 : 16, 1이고 값 71은 0, 71으로 인코딩 됨).

"max 회색"이 255로 설정된 0-255 그레이 스케일 이미지가있는 경우 나머지 (width*height) 바이트의 파일을 이진 데이터 (마지막 헤더 문자 뒤)로 읽으면됩니다. 행별로 픽셀 데이터가 위에서 아래로 나타납니다.

max_gray가 40, 15000과 같은 다른 것이라면 픽셀 데이터를 0-255 8 비트 범위로 변환해야하는지 여부가 의심 스럽습니다 (첫 번째 경우에는 "확대", 두 번째는 "축소"). 이것이 PGM 독자가되기를 원한다면 아마도 감마 변환에 의해). 하지만 감마 보정을 구현하지 않고 학교 과제물이 약 0-255 개의 이미지에 불과하다고 생각합니다.