如何从MIPS中的字符串中获取指定数量的字符?

时间:2016-12-05 03:56:12

标签: assembly mips

00111100000000010001000000000001
00110100001001000000000000000000
00100100000000100000000000000100
00000000000000000000000000001100
00100100000000100000000000001010
00000000000000000000000000001100

鉴于此机器代码,我需要获取第一行(32)字符,以便我可以将其转换回MIPS指令。我无法弄清楚如何获取第一行代码并将其存储到寄存器中。有没有人对如何获得第一行以及之后的下一行有任何想法?我有一个提示尝试使用sll或srl指令,但是当我这样做时,我没有看到代码有任何变化。

#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,我会收到错误,我知道这是不正确的,但我不知道该怎么做。任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:0)

在打印内容进行验证后打开断点,打开内存视图以指向地址buffer,您将看到文件的内容被读取为连续的字节值,这些值是ASCII编码形成文本。 / p>

所以实际的字节值是:

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

其中<EOL>是行尾(MIPS上可能为13,可能只有10或两者都有),而48是ASCII字符'0'的值49是ASCII字符'1'的值。

当您查看&#34; bincode1.txt&#34;的内容时,您可以看到相同的字节。文件在一些hexa-viewer。

因此,要将32个ASCII字符转换为单个32b值,您必须循环32个字节,根据读取的字符('0' (48) / '1' (49)将单个位设置为0/1,决定如何处理错误的输入与非0/1数字,为简单起见,你可能只是and char,1从任何字节获得0/1位,甚至是非数字的,并忽略不正确的文件),并将这些位合并在一起。 / p>

将位合并在一起的最简单方法是IMO在循环t0 = 0之前将一些临时寄存器设置为零,然后在从buffer读取下一个字符后,首先将其所有位向左移一个{ {1}},然后将最低有效位设置为从缓冲区读取的那一位(按位sll $t0, $t0, 1可能会有所帮助,之后OR仅从char中提取最低(最右侧)位。通过这循环32次,瞧,你在and char,1中有32b的数字(当你向左移动时,第一个字符读取将在最左边的位置结束,这很可能是你想要的)。

然后您可以将其打印为数字值,以验证转换产生的正确结果。

提示:尝试可视化您的输入和输出数据,以及这些位如何相互关联,与调试器一起使用以查看它如何显示内存和寄存器值(可能它允许几种不同的格式/分组,这可以使您更容易在不同情况下检查特定值,例如在检查ASCII数据时,通常可以看到单独的字节,但是例如{4}}大小的数字最好在4字节时查看被分组为单个值)。然后尝试想象如何处理输入数据以计算预期输出,并为其编写算法。