MIPS 函数和数组
我可以在很大程度上理解和使用 Java/c++,但在我的一生中,汇编让我感到困惑,有 2 个函数我遇到了麻烦。第一个:
一个函数接收字符串并将其打印在终端上
,另一个函数接收字符串并将其转换为整数(字符串全部由数字组成)。
知道从哪里开始吗?
更新
在第二个函数上,到目前为止我得到了这个:
main:
atoi:
li $v0, 8
la $a0, tstr
li $a1, 64
syscall
sub $sp, $sp,4
sw $ra, 0($sp)
move $t0, $a0
li $v0, 0
next:
lb $t1, ($t0)
beqz $t1, endloop
mul $v0, $v0, 10
add $v0, $v0, $t1
sub $v0, $v0, 48
add $t0, $t0, 1
b next
endloop:
lw $ra, 0($sp)
add $sp, $sp, 4
更新了代码,仍然收到 10 是无效操作数的错误。关于 sub $v0, $v0, 48
我应该像 sub $t1, $t1, 48
那样做吗?
I can understand and use Java/c++ to a good extent, but for the life of me assembly just confuses me there are 2 functions I'm having trouble with. First:
One function that receives a string and prints it on the terminal
And another one that receives a string and converts it to integers (Strings given all made of numbers).
Any idea on where to start?
Update
On the second function, so far I got this:
main:
atoi:
li $v0, 8
la $a0, tstr
li $a1, 64
syscall
sub $sp, $sp,4
sw $ra, 0($sp)
move $t0, $a0
li $v0, 0
next:
lb $t1, ($t0)
beqz $t1, endloop
mul $v0, $v0, 10
add $v0, $v0, $t1
sub $v0, $v0, 48
add $t0, $t0, 1
b next
endloop:
lw $ra, 0($sp)
add $sp, $sp, 4
Updated code, still getting the error on 10 being an invalid operand. And about sub $v0, $v0, 48
should I just do it as sub $t1, $t1, 48
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
对于输入输出的东西,你必须使用系统调用。为了写入(以零结尾的)字符串,您将使用系统调用 #4,它需要 $a0 中的缓冲区地址。现在只需将系统调用的编号放入 $v0 中并执行它即可。例如,此代码片段读取一个字符串:
在这里您可以找到一些系统调用编号。
对于第二个练习,这是 C++ 代码,尝试翻译它:P
编辑:
好吧,有几个错误。首先,您没有检查是否已到达字符串末尾(只需将 $t1 与开头的 0 进行比较)。您应该首先从 $t1 中减去“0”,然后将其添加到 $v0。
For input-output stuff, you have to use system calls. For writing (zero-terminated) strings you'll use syscall #4, which wants the address of the buffer in $a0. Now just place the umber of the syscall in $v0 and execute it. For example, this snippet reads a string:
Here you can find some syscalls numbers.
For the second exercise, here's the C++ code, try to translate it :P
EDIT:
Ok, there are a couple of errors. First, you're not checking whether you've reached the end of the string (simply compare $t1 with 0 at the beginning). And you should first subtract '0' from $t1, then add it to $v0.