用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寄存器同时工作,这是可以实现的 很快就会变得一团糟
addi$v0,$v0,1#将1添加到count
如果您更改此addi$v1,$v1,1
的指令,程序将返回$v1中的值,它不知道这一切都取决于您。谢谢@ke