繁体   English   中英

Mips Assembler-如何获取.ascii的长度

[英]Mips Assembler- How to get the length of a .ascii

我是这个社区的新手。 我们正在大学里编程技巧,我需要解决自己作业中的问题。 我们必须打开一个.pgm文件,并读取所谓的标头(在本例中为p5格式,并且长度为x宽)。 当您打开已阅读的文件时,第1行有4行。 P5; 第2位。 长x宽; ASCII码的颜色深度和第四个长期值。 我的工作是现在转换这个ascii,我想我必须知道这个ascii的大小。 以前,我有一个用于转换ascii的mips代码,但是这里的问题是,该代码仅转换了我的ascii术语的一部分,就像这样(注释在德语中表示抱歉):

.data
str:    .ascii "GV_]VTI=97:@JPH<1-/6;L\pz ­¶³¶»ÃËËÄ»°y{xzk`L@@?>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~|¤¶ÐáÕÉÅÇÈÇÉÌÝàÒľ³µª¡¡¤±¼ËÙBGIHB@??DILNRI=1,*-6=ISao §¨­·ÃËËÄ»º¯wpg\SIEDC>83359520110//.--,-//0000022224751139=CGOXfx£®¼¶®¨¤£¥°»À»¾¼³©¥vnjjmsz¬ÅÅƳxxttxuja[Y[_c`^]^abcacdfhhhhdghjjlnnnnnnonkjlkihjjhghhhhkkjknsy}vpqw~¸ÏãéáÝ×ÓÌÁÂÈÙ඲ª¬¥¦¢§ ¡¨±¼ÌÙ@DFKC?=@CFFA<82.+)-6>IO[e| £«´ÅËËļÁ¹­vndbVKACA<632247322321011/.-.//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

希望你能给我一个提示。

刚开始我误解了您的问题,但我仍然认为我的回答也是真实答案的一部分,因此首先:

一个问题应该是“如何找到标题的结尾和图像数据的开头”

PGM标头的最后一个字符是“最大灰度值之后的第一个空白字符”。 因此,您必须按值来解析整个标头值,直到解析gray-max,然后下一个字节应为空白( 32 (空格), 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_pixel Bytes_per_pixel是1 gray_max < 256 ,和2 gray_max在256..65535范围内。

当每个像素使用2个字节时,最高有效字节在前(因此,值4097编码为字节: 16, 1值71编码为: 0, 71 )。

如果您有一些0-255的灰度图像,并且标题中的“最大灰度”设置为255,那么您只需将文件的剩余(width*height)字节读取为二进制数据(在最后一个标题字符之后),就可以了。是您的像素数据从上到下逐行显示。

如果max_gray是其他值(例如40或15000),那么是否应该将像素数据转换为0-255 8位范围(在第一种情况下是“放大”像素,在第二种情况是“缩小”像素)可能会有些伽马,这是个问题。如果想要成为专业的PGM读者,请进行转换)。 但是我希望您的学校任务仅执行0-255张图像,而无需执行伽玛校正。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM