Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
用MIPS编写的程序如何知道返回什么?_Mips - Fatal编程技术网

用MIPS编写的程序如何知道返回什么?

用MIPS编写的程序如何知道返回什么?,mips,Mips,我刚写了一个程序: 计数零: li $v0, 0 # count = 0 li $t0, 0 # int i = 0 li $v1, 1 # compare bit = 1 cz_环: bge $t0, 32, cz_exit # exit loop if i >= 32 andi $t1, $a0, 1 # bit = arg0 & 1 beq $t1, $v1, cz_s

我刚写了一个程序:

计数零:

    li      $v0, 0  # count = 0
    li      $t0, 0  # int i = 0
    li      $v1, 1  # compare bit = 1
cz_环:

    bge     $t0, 32, cz_exit # exit loop if i >= 32
    andi    $t1, $a0, 1 # bit = arg0 & 1
    beq     $t1, $v1, cz_skip # skip if bit = 1
    addi    $v0, $v0, 1 # adds 1 to count
cz_跳过:

    srl     $a0, $a0, 1 # shifts input right by 1
    add     $t0, $t0, 1 # i++

    j       cz_loop
cz_出口:

    jr      $ra
非常简单,只需计算32位字中的零数。我想知道程序如何知道如何在最后返回$v0?我知道v0和v1是返回寄存器,但我想知道这两个是否总是返回。如果没有,程序如何知道返回v0

此外,我知道jr$ra跳转到返回地址-但这意味着什么

感谢您的帮助。

“程序如何知道如何在最后返回$v0?”

它不知道,您正在$v0中写入“返回”值,实际上您可以在任何可用寄存器(如临时寄存器)中返回“结果或返回值”,使用$v0寄存器返回值(在MIPS中)只是一种惯例

“我想知道这两个人是否总是回来”

请记住,在您程序中的任何子例程中,您始终可以访问所有寄存器,因此对于哪些寄存器存储可以在语义上称为“返回值”的值没有“限制”,因此我可以轻松创建一个方法,在$t0、$t1、$t2中返回3个数字,但这是我的选择,您也可以在堆栈中返回值,有很多可能性,这取决于良好的编程实践和调用约定,您可以在这里找到MIPS调用约定:

“jr$ra跳转到回信地址-但这意味着什么?”

程序按指令执行(程序有一个指令指针又称程序计数器),当您调用子程序时,下一条指令的地址存储在$ra寄存器中,然后当您生成jr$ra时,程序执行返回到该地址(指令指针得到$ra的值)。

“程序如何知道如何在结束时返回$v0?”

它不知道,您正在$v0中写入“返回”值,实际上您可以在任何可用寄存器(如临时寄存器)中返回“结果或返回值”,使用$v0寄存器返回值(在MIPS中)只是一种惯例

“我想知道这两个人是否总是回来”

请记住,在程序中的任何子例程中,您始终可以访问所有寄存器,因此对于哪些寄存器存储的值在语义上可以称为“返回值”,没有“限制”“,因此我可以很容易地创建一个方法,在$t0、$t1、$t2中返回3个数字,但这是我的选择,您也可以在堆栈中返回值,有很多可能性,这取决于良好的编程实践和调用约定,在这里您可以找到MIPS调用约定:

“jr$ra跳转到回信地址-但这意味着什么?”


程序按指令执行(程序有一个指令指针又称程序计数器),当您调用一个子例程时,下一条指令的地址存储在$ra寄存器中,然后当您生成jr$ra时,程序执行返回到该地址(指令指针得到$ra的值).

在MIPS中,您将看到三种不同的跳跃。j、 日本航空公司

j:这被认为是无条件跳转。只要做:

j function
jr:aka跳转注册。和名字的发音完全一样,你可以跳转注册。这是指您的程序中已经保存了一个寄存器,您希望跳回该寄存器。通常看起来是这样的:

jr $ra
$ra是之前在jal(见下文)之前预留的寄存器,它将程序跳转回该地址

jal:aka Jump and link将下一条指令的地址复制到寄存器中,然后跳转到地址标签。换言之,日航和jr主要用于前往通常位于出口呼叫之后的功能

例:

另外,当我开始学习时,最有帮助的网站是:

我希望有人在我开始时告诉我一些其他快速提示:

  • 始终以“main:”开头:
  • 在乘法过程中要注意高低寄存器之间的差异 和除法整数
  • 始终跟踪您的注册表,因为有这么多的$s和$t $f和$p以及$a和$v寄存器同时工作,这是可以实现的 很快就会变得一团糟

    • 在MIPS中,您将看到三种不同的跳跃。j、 日本航空公司

      j:这被认为是无条件跳转。只要做:

      j function
      
      jr:aka跳转注册。和名字的发音完全一样,你可以跳转注册。这是指您的程序中已经保存了一个寄存器,您希望跳回该寄存器。通常看起来是这样的:

      jr $ra
      
      $ra是之前在jal(见下文)之前预留的寄存器,它将程序跳转回该地址

      jal:aka Jump and link将下一条指令的地址复制到寄存器中,然后跳转到地址标签。换言之,日航和jr主要用于前往通常位于出口呼叫之后的功能

      例:

      另外,当我开始学习时,最有帮助的网站是:

      我希望有人在我开始时告诉我一些其他快速提示:

      • 始终以“main:”开头:
      • 在乘法过程中要注意高低寄存器之间的差异 和除法整数
      • 始终跟踪您的注册表,因为有这么多的$s和$t $f和$p以及$a和$v寄存器同时工作,这是可以实现的 很快就会变得一团糟

      谢谢@kevinkl3。我想知道程序如何知道在这种情况下返回v0?因为您正在寄存器中存储返回值
      addi$v0,$v0,1#将1添加到count
      如果您更改此
      addi$v1,$v1,1
      的指令,程序将返回$v1中的值,它不知道这一切都取决于您。谢谢@ke