MIPS寄存器的行为是否不同?

MIPS寄存器的行为是否不同?,mips,cpu-registers,Mips,Cpu Registers,MIPS寄存器的作用是否不同?例如,有保存的寄存器和临时寄存器,它们可以互换使用吗?临时寄存器是否可能被操作系统过度写入,而保存的寄存器则不会(因此而得名),或者这纯粹是约定吗?MIPS有32个通用寄存器和另外32个浮点寄存器。临时寄存器是通用寄存器,可自由用于算术和其他指令,而保存的寄存器必须在函数调用中保持其值 系统服务调用遵循标准调用约定,临时寄存器($t0-$t9)可以更改,保存的寄存器($s0-$s7,$fp,$ra)将保留 整数寄存器$t0-$t9和浮点寄存器$f4-$f10和$f1

MIPS寄存器的作用是否不同?例如,有保存的寄存器和临时寄存器,它们可以互换使用吗?临时寄存器是否可能被操作系统过度写入,而保存的寄存器则不会(因此而得名),或者这纯粹是约定吗?

MIPS有32个通用寄存器和另外32个浮点寄存器。临时寄存器是通用寄存器,可自由用于算术和其他指令,而保存的寄存器必须在函数调用中保持其值

系统服务调用遵循标准调用约定,临时寄存器($t0-$t9)可以更改,保存的寄存器($s0-$s7,$fp,$ra)将保留

整数寄存器$t0-$t9和浮点寄存器$f4-$f10和$f16-$f18(单精度或双精度)用于保存不需要在过程调用中保留的临时量

因此,如果在循环中打印一系列值,则循环计数器和当前数组地址/索引需要保存的寄存器

例如: 调用函数时,约定保证$s寄存器在返回后相同,而约定不保证$t寄存器相同

.data
newline: .asciiz "\n"
.text
.globl main

main:
addi $s0, $zero, 5
# li $t0, 5

jal increment 


li $v0, 4
la $a0, newline    #print newline string
syscall

move $a0, $s0       #print saved register after calling function --> output = 5
li $v0, 1        
syscall

end:
li $v0, 10
syscall

increment:
addi, $sp, $sp, -4      # to store old value of--> -4 because store in 4 bytes (allocated in stack)
sw $s0, 0($sp)          # save the value of $s0 to the first location in stack pointer  

addi $s0, $s0, 1        # add 1 

move $a0, $s0
li $v0, 1               #print saved register after calling function  --> output = 6
syscall

lw $s0, 0($sp)          # will load previous value 
addi $sp, $sp, 4

jr $ra

即使保存的寄存器值在函数中递增,在函数结束后,我们仍然可以访问原始值。

MIPS有32个通用寄存器和另外32个浮点寄存器。临时寄存器是通用寄存器,可自由用于算术和其他指令,而保存的寄存器必须在函数调用中保持其值

系统服务调用遵循标准调用约定,临时寄存器($t0-$t9)可以更改,保存的寄存器($s0-$s7,$fp,$ra)将保留

整数寄存器$t0-$t9和浮点寄存器$f4-$f10和$f16-$f18(单精度或双精度)用于保存不需要在过程调用中保留的临时量

因此,如果在循环中打印一系列值,则循环计数器和当前数组地址/索引需要保存的寄存器

例如: 调用函数时,约定保证$s寄存器在返回后相同,而约定不保证$t寄存器相同

.data
newline: .asciiz "\n"
.text
.globl main

main:
addi $s0, $zero, 5
# li $t0, 5

jal increment 


li $v0, 4
la $a0, newline    #print newline string
syscall

move $a0, $s0       #print saved register after calling function --> output = 5
li $v0, 1        
syscall

end:
li $v0, 10
syscall

increment:
addi, $sp, $sp, -4      # to store old value of--> -4 because store in 4 bytes (allocated in stack)
sw $s0, 0($sp)          # save the value of $s0 to the first location in stack pointer  

addi $s0, $s0, 1        # add 1 

move $a0, $s0
li $v0, 1               #print saved register after calling function  --> output = 6
syscall

lw $s0, 0($sp)          # will load previous value 
addi $sp, $sp, 4

jr $ra

即使保存的寄存器值在函数中递增,在函数结束后,我们仍然可以访问原始值。

。操作系统不会过度写入临时寄存器。请看以下帖子:@OmidCompSCI我刚看了一眼,看到了以下内容:
main:li$s0 7 li$t0 7 jal myFunction#$s0保证等于7#$t0值不保证
为什么$t0不能保证保持7的值?例如,如果函数A使用寄存器$t0和$s0,然后调用函数B,那么如果它想在函数B返回后使用它,它必须保存寄存器$t0。函数B必须先保存$s0,然后才能开始使用它。”他说的是,如果是在函数调用之后。否则,没有jal myFunction的那些行本身也会起同样的作用。@OmidCompSCI如何保存“登记册?纯粹是惯例。操作系统不会过度写入临时寄存器。请看以下帖子:@OmidCompSCI我刚看了一眼,看到了以下内容:
main:li$s0 7 li$t0 7 jal myFunction#$s0保证等于7#$t0值不保证
为什么$t0不能保证保持7的值?例如,如果函数A使用寄存器$t0和$s0,然后调用函数B,那么如果它想在函数B返回后使用它,它必须保存寄存器$t0。函数B必须先保存$s0,然后才能开始使用它。”他说的是,如果是在函数调用之后。否则,没有jal myFunction的那些行本身也会起同样的作用。@OmidCompSCI如何“保存”寄存器?