Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MIPS汇编语言-Base64编码?_Assembly_Encoding_Base64_Mips - Fatal编程技术网

Assembly MIPS汇编语言-Base64编码?

Assembly MIPS汇编语言-Base64编码?,assembly,encoding,base64,mips,Assembly,Encoding,Base64,Mips,这个程序的要点是对用户提供的字符串进行base64编码,然后输出新的编码字符串 编码是通过从原始字符串中收集3个字符(每个字符为8位)然后将其拆分为4个字符(每个字符为6位)来完成的 如何正确访问和操作用户输入的字符串 目前,第一次迭代带来了正确的输出,但第二次迭代总是给t2值“0”,无论输入是什么,这将使用输出A停止程序;两者都是错误的 .data sentence: .space 64 prompt: .asciiz "Enter the string: " ASC: .byte 'A

这个程序的要点是对用户提供的字符串进行base64编码,然后输出新的编码字符串

编码是通过从原始字符串中收集3个字符(每个字符为8位)然后将其拆分为4个字符(每个字符为6位)来完成的

如何正确访问和操作用户输入的字符串

目前,第一次迭代带来了正确的输出,但第二次迭代总是给t2值“0”,无论输入是什么,这将使用输出A停止程序;两者都是错误的

.data
sentence: .space 64
prompt: .asciiz "Enter the string: "
ASC: .byte    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'

.text
.globl main

main:

la $s0, ASC

la $a0, prompt      #ask for string
li $v0, 4
syscall

li $v0, 8            #take string
la $a0, sentence     #load byte space into address
li $a1, 64       #max number of bytes
syscall

la $t0, sentence    
lb $t2, 0($t0)          #to load the first 8 bits   

j read_ASC

read_ASC: beq $t2, $0, exit

lb $t2, 0($t0)          #to load the first 8 bits
andi $a0, $t2, 63   #takes first 6 bits of string
    #srl $t0, $t0, 6    #removes the 6 bits we just took
sub $t0, $t0, $t2   #removes the char we just took

addu $t1, $a0, $s0  #s0 being the base of the table, $a0 being the offset

#lbu $a0, ASC($a0)
lbu $a0, 0($t1)     #sees value of the 6 bits from string to retrieve encoded value from table

li $v0, 11      #prints the new encoded char
syscall

j read_ASC

exit:   li $v0, 10      #end
syscall

错误是:无法直接从文本段读取。另外,我试着用lw$t2,0($t0)代替lb,程序将永远运行,而不是只输出“A”,这是我表格的第一个元素。你使用的是火星模拟器,还是SPIM模拟器?在MARS In debugger中,您可以看到内存内容,尽管仅分组为“字”(32位=4字节值),因此读取字符串有点困难(因为字符串“ABCDEF\n\0”存储为8字节
41 42 44 45 46 0A 00
,但当作为小尾端字查看时,这是两个字
44434241 000A4645
(当然,所有值都是六进制的,因此您可以很容易地看到单个字节值)。因此,您可以尝试输入一些字符串,然后在“内存”视图中查看自己,该字符串是如何存在的,但您似乎已经理解每个字符都是1字节。@Samer Basta:请回答您的问题并将这些新信息添加到其中,您不应将其作为您自己问题的注释发布。谢谢。
lb$t2,0($t0)
是有道理的。我不会说关于
beq$t0,$0,exit
=为什么要将内存地址与零进行比较?不能有“nullptr”在这里,正如您之前所做的那样,
la$t0,句子
。然后您不推进
t0
内存地址,因此您将继续读取相同的内存点。
andi$a0,$t2,6
没有意义,
andi
是位运算符,“6”是二进制的
0…0110
,因此您只保留原始值的两位,而不是其中的六位。也就是说,您似乎正在与基本的计算机体系结构问题作斗争,例如什么是内存、如何寻址、什么是位、字节等。回答这样的问题有点烦人,因为通常都很难猜出内存的级别OP,即需要解释多少基础知识,以及答案因过于宽泛而迅速扩大,或替换了适当的教程/书籍。仅从这些评论中,您似乎取得了极好的进展,也许是时候让您重新阅读一些关于基础知识的教程/书籍+单步检查其中的一些示例。