gpt4 book ai didi

c - C语言到MIPS的解释

转载 作者:行者123 更新时间:2023-11-30 20:42:11 25 4
gpt4 key购买 nike

我想创建一个 MIPS 程序。这是我的 C 代码,如下所示:

#include <stdio.h>

int main()
{
int i, j, row;

printf("\nEnter a random row\n");
scanf("%d", &row);

for (i=1; i <= row; i++)
{
for (j=1; j <= i; j++)
{
printf("%d", j);
}
printf("\n");
}
}

下面显示的代码是我如何从 C 转换为 MIPS:

    .data
word: .asciiz "Please enter a random row: \n"
.text
.globl main

main:
la $a0, word # load word
li $v0, 4 # print integer
syscall

addi $s0, $s0, -1 # for accommodating loop condition
lw $s1, i # set i = 1
lw $s2, j # set j = 1
lw $s3, row # load row


loop1:
blt $s0, $s1, exit # for(i = 0; i < row; i++)
addi $s1, $s1, 1 # i++
li $s2, 1 # resets j to 1 after every iteration of for loop
move $a0, $t0 # move register to be printed into argument register $a0
j loop2 # executing the nested for loop


loop2:
blt $s1, $s2, loop1 # for(i = 0; i < j; i++)
li $v0, 1 # read_double => scanf("%d")
move $a0, $t0 # move register to be printed into argument register $a0
syscall
j loop2


li $v0, 10 # loading exit code
syscall # execute exit

一开始,虽然我确实创建了预期的结果,即要求用户插入输入的随机数,但有一个即将到来的问题,即循环没有成功地完成整个程序。我陷入了循环1。

最佳答案

你的逻辑有几个地方不正确,注释也有错误,这可能是造成困惑的很大一部分。

我看到的问题(希望没有遗漏任何问题):

main:   
la $a0, word # load word
li $v0, 4 # print integer
  • 这是打印字符串,不是,所以注释是错误的。

  • 也许也是因为您没有读取与 C scanf("%d", &row); 对应的整数。行,所以需要添加:

    li $v0, 5
    syscall
    move $s3, $v0

下一个:

addi $s0, $s0, -1    # for accommodating loop condition
lw $s1, i # set i = 1
lw $s2, j # set j = 1
lw $s3, row # load row
  • 不确定 s0 的用途,因为您有 I、j 和 row 的变量
  • 你想为 I 和 j 以及 row 分配一个寄存器,所以不需要将 I 或 j 加载到其中(无论如何你都没有它们的标签),所以实际应该是这样的:

    li $s1, 1           # set i = 1 
    li $s2, 1 # set j = 1
    • s3(行)需要作为 scanf 添加的一部分加载

下一个:

loop1:
blt $s0, $s1, exit # for(i = 0; i < row; i++)

addi $s1, $s1, 1 # i++
  • blt $s0, $s1,exit 有错误注释,没有退出标签,需要比较 I(s1) 和 row(s3) 而不是 s0。
  • addi $s1, $s1, 1 应该在循环 2 完成之后,因为 I 在循环 2 aos 中使用,如果在这里递增,对于下一个循环将是错误的。
  • 更改为:

    loop1:
    blt $s3, $s1, exit_loop1 # for(i = 1; i <= row; i++)

下一个:

move $a0, $t0        # move register to be printed into argument register $a0
j loop2 # executing the nested for loop - this does nothing as next instruction is loop2
  • t0 未设置任何内容,并且此处未使用 a0,因此看起来毫无意义

  • j Loop2 正在跳转到下一条指令,因此不需要

下一个:

loop2:
blt $s1, $s2, loop1 # for(i = 0; i < j; i++)
  • 注释错误应该是(j=1; j <= i; j++)
  • 需要在loop2末尾打印换行符并从loop1增加I,因此需要在返回loop1之前跳转到中间步骤

下一个:

li  $v0, 1          # read_double => scanf("%d")
move $a0, $t0 # move register to be printed into argument register $a0
syscall
  • 对 li 的错误注释 - 它的 print int
  • 您还需要在打印后增加 j

下一个:

  • 循环2结束后不打印换行符

通过所有这些更改,我得到:

  .data
word: .asciiz "Please enter a random row: \n"
newline: .asciiz "\n" # added
.text
.globl main

main:
la $a0, word # load word
li $v0, 4 # print prompt
syscall

# read integer scanf(%d), save to s3
li $v0, 5
syscall
move $s3, $v0

li $s1, 1 # set i = 1 for loop 1
loop1:
blt $s3, $s1, exit_loop1 # for(i = 1; i <= row; i++)

# set up loop2 stuff
li $s2, 1 # resets j to 1 after every iteration of for loop

loop2:
blt $s1, $s2, exit_loop2

li $v0, 1 # print int j
move $a0, $s2
syscall

# increment j
addi $s2, $s2, 1

j loop2

exit_loop2:
# printf("\n");
la $a0, newline # load newline string
li $v0, 4
syscall

# increment loop1 i
addi $s1, $s1, 1 # i++

j loop1

exit_loop1:
li $v0, 10 # loading exit code
syscall # execute exit

关于c - C语言到MIPS的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53186867/

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