繁体   English   中英

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

[英]How to get specified number of character from a string in 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,我会收到错误,我知道这是不正确的,但我不知道该怎么做。 任何的意见都将会有帮助。

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

所以实际的字节值是:

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

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

在某些hexa-viewer中查看“bincode1.txt”文件的内容时,可以看到相同的字节。

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

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

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

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

暂无
暂无

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

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