gpt4 book ai didi

使用递归的 C 到 MIPS 十进制到二进制转换器

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:09 24 4
gpt4 key购买 nike

我是 MIPS 的新手,我写了一个基本格式,我认为我写的 C 文件中的代码等同于 MIPS。我的任务是将我编写的以下 C 文件转换为 MIPS 应该是什么的直接翻译。我当前的 C 代码是:

#include <stdio.h>
int d2b(int d)
{
if(d == 0)
{
return;
}
else
{
return (d %2 + 10 * d2b(d/2));
}
}

int main()
{
int d = 99;
int b;

b = d2b(d);
printf("Input => %d \n", d);
printf("Output => %d ", b);

return;
}

到目前为止,我有以下内容:

.data
msg1 .asciiz “Number is “
msg2 .asciiz “\nConverted to \n“
.text
.globl main

main:
li $v0, 4
la $a0, msg1
syscall

li $v0, 5 #Exit syscall
syscall
add $a0, $v0, $zero
jal fact

add $a0, $v0, $zero
li $v0, 1
syscall

li $v0, 10
la $a0, msg2
syscall


fact:
li $t0 0 #load 0
beq $a0, $t0, skip #test n
li $v0 0
jr $ra
skip:
subu $sp, $sp, 32
sw $ra 20($sp)
sw $fp, 16($sp)
addiu $fp, $sp, 28
sw $a0, 0($fp) #save n
li $t1 2 #load 2
divu $a0 $t1 #n / 2
mfhi $t2 #remainder
mflo $t3 #quotient
move $a0, $t3 #n = quotient
addi $v0, $a1, 10
jal fact
lw $a0, 0($fp) #restore n
multu $v0, $a0
lw $ra, 20($sp)
lw $fp, 16($sp)
addiu $sp, $sp, 32
jr $ra

我的主要问题是不知道如何使用系统调用,也不真正了解 MIPS 中的递归函数。请指出我的错误和错误!

最佳答案

你的 MIPS 系统调用在这个部分

li $v0, 4        
la $a0, msg1
syscall

li $v0, 5 #Exit syscall
syscall
add $a0, $v0, $zero
jal fact

add $a0, $v0, $zero
li $v0, 1
syscall

li $v0, 10
la $a0, msg2
syscall

他们被错误地评论

在 MIPS 系统调用中,$v0 包含“系统调用函数”或英文,即您希望操作系统执行的服务。 There's a table of them here.

$a0 将保存传递给调用的第一个参数。要设置此参数,一种技术是将输入值加零,将结果存储到 $a0 这就是为什么你有这么多行这样的

add $a0, $v0, $zero # this adds $v0 to the number zero and storing in $a0

最后,您使用的系统调用是(4 => 打印字符串,5 => 读取整数,1 => 打印整数,10 => 退出)

因此,您的代码的正确注释示例将是

la $a0, msg1         # load string as parameter
li $v0, 4 # load operation "print string"
syscall # request "print string" for msg1

li $v0, 5 # load operation "read integer"
syscall # request "read integer"
add $a0, $v0, $zero # load the read integer into $a0
jal fact

add $a0, $v0, $zero # load the value of $v0 into $a0
li $v0, 1 # load operation "print integer"
syscall # request "print integer"

如您所见,我的困惑不是来自您使用系统调用的能力,而是来自您对您认为使用系统调用来做什么的描述。

你说你想从十进制输入打印一个二进制数,如 01001010。这通常涉及在循环中分解十进制数,在每个二进制数位置打印出零或一。由于这需要对二进制数中的每个占位符进行循环,因此似乎不可能对“打印整数”进行一次调用(除非输入仅限于十进制“1”和“0”,或者输入被限制为如此小的数字,以至于它的二进制表示形式(以十进制格式表示)小于 max_int)。

因此,对于 5 的输入,所需的输出将是 101,这将是 3 次打印调用,顺序为“1”、“0”、“1”。我相信这种循环打印数字的方法会给您带来更大的成功,并允许您打印输入的每个正十进制数。

简而言之,我认为您对 syscall 的命令很好,但是您仍在为如何执行循环和解决汇编中的问题而苦恼。尝试弄清楚如何使用铅笔和纸手工确定所需顺序的数字,然后尝试将其编码到您的程序中。

关于使用递归的 C 到 MIPS 十进制到二进制转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50275043/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com