无法找出 MARS 中的 MIPS 错误:错误:无效的程序计数器值:0x00000000 Go:执行因错误而终止
Unable to figure out MIPS error in MARS: Error in : invalid program counter value: 0x00000000 Go: execution terminated with errors
我正在尝试将这个简单的 C 片段翻译成 MIPS:
int leaf_example(int g, int h, int i, int j) {
int f;
f = (g + h) - (i + j);
return f;
}
这是我的 MIPS 代码:
.text
main:
leaf:
addi $sp, $sp, -8 #adjust stack to make room for 3 items
sw $t1, 8($sp) #save register $t1 for use in memory location 8
sw $t0, 4($sp) #save register $t0 for use in memory location 4
sw $s0, 0($sp) #save register $s0 for use in memory location 0
add $t0, $a0, $a1 #register $t0 contains $a0 + $a1
add $t1, $a2, $a3 #register $t1 contains $a2 + $a3
sub $s0, $t0, $t1 #$t0 = $t0 - $t1 -> $t0 = ($a0 + $a1) - ($a2 + $a3)
add $v0, $s0, $zero #copy $s0 to return register $v0
#Before returning, we restore three original values of registers we pushed onto stack by popping them
lw $s0, 0($sp) #restore register $s0 for caller
lw $t0, 4($sp) #restore register $t0 for caller
lw $t1, 8($sp) #restore register $t1 for caller
addi $sp, $sp, 8 #adjust stack to delete 3 items
jr $ra #jump back to calling routine
然而,当我编译并尝试 运行 这个时,它给我这个错误:
“错误:无效的程序计数器值:0x00000000
执行:执行因错误而终止。
我完全不明白这个错误。谁能指出我正确的方向?
好像是MARS把寄存器$ra
初始化为0x00000000
,使用jr $ra
,程序跳转到了0x00000000
,认为无效
我想你应该在main:
之后写一些调用函数leaf
的代码(然后通过system call 10号退出)来测试你的函数。
实际上你不需要保存和恢复$t0,$t1
因为如果调用函数不使用这些寄存器,
拯救和恢复它们的努力被浪费了。为了避免这种浪费,MIPS 将
注册到保留和非保留类别。保留的寄存器包括 $s0 – $s7
(因此得名,已保存)。非保留寄存器
include $t0 – $t9
(因此他们的名字,临时的)。一个函数必须保存并且
恢复它希望使用的任何保留的寄存器,但它可以更改
非保留的自由注册。
.text
main:
addi $a0,[=10=],1 #argument 0 = 1
addi $a1,[=10=],2 #argument 1 = 2
addi $a2,[=10=],3 #argument 2 = 3
addi $a3,[=10=],4 #argument 3 = 4
jal leaf # call function leaf
add $s0,$v0,$zero # return value
li $v0,10
syscall
leaf:
addi $sp, $sp, -12 #adjust stack to make room for 3 items
sw $s0, 8($sp) #save register $t1 for use in memory location 8
sw $t0, 4($sp) #save register $t0 for use in memory location 4
sw $t1, 0($sp) #save register $s0 for use in memory location 0
add $t0, $a0, $a1 #register $t0 contains $a0 + $a1
add $t1, $a2, $a3 #register $t1 contains $a2 + $a3
sub $s0, $t0, $t1 #$t0 = $t0 - $t1 -> $t0 = ($a0 + $a1) - ($a2 + $a3)
add $v0, $s0, $zero #copy $s0 to return register $v0
#Before returning, we restore three original values of registers we pushed onto stack by popping them
lw $t1, 0($sp) #restore register $s0 for caller
lw $t0, 4($sp) #restore register $t0 for caller
lw $s0, 8($sp) #restore register $t1 for caller
addi $sp, $sp, 12 #adjust stack to delete 3 items
jr $ra #jump back to calling routine
改进版。
.text
main:
addi $a0,[=11=],2 #argument 0 = 2
addi $a1,[=11=],3 #argument 1 = 3
addi $a2,[=11=],4 #argument 2 = 4
addi $a3,[=11=],5 #argument 3 = 5
jal leaf # call function leaf
add $s0,$v0,$zero # return value
li $v0,10
syscall
leaf:
addi $sp, $sp, -4 #adjust stack to make room for 3 items
sw $s0, 0($sp) #save register $t1 for use in memory location 8
add $t0, $a0, $a1 #register $t0 contains $a0 + $a1
add $t1, $a2, $a3 #register $t1 contains $a2 + $a3
sub $s0, $t0, $t1 #$t0 = $t0 - $t1 -> $t0 = ($a0 + $a1) - ($a2 + $a3)
add $v0, $s0, [=11=] #copy $s0 to return register $v0
#Before returning, we restore three
#original values of registers we pushed
#onto stack by popping them
lw $s0, 0($sp) #restore register $t1 for caller
addi $sp, $sp, 4 #adjust stack to delete 3 items
jr $ra #jump back to calling routine
我正在尝试将这个简单的 C 片段翻译成 MIPS:
int leaf_example(int g, int h, int i, int j) {
int f;
f = (g + h) - (i + j);
return f;
}
这是我的 MIPS 代码:
.text
main:
leaf:
addi $sp, $sp, -8 #adjust stack to make room for 3 items
sw $t1, 8($sp) #save register $t1 for use in memory location 8
sw $t0, 4($sp) #save register $t0 for use in memory location 4
sw $s0, 0($sp) #save register $s0 for use in memory location 0
add $t0, $a0, $a1 #register $t0 contains $a0 + $a1
add $t1, $a2, $a3 #register $t1 contains $a2 + $a3
sub $s0, $t0, $t1 #$t0 = $t0 - $t1 -> $t0 = ($a0 + $a1) - ($a2 + $a3)
add $v0, $s0, $zero #copy $s0 to return register $v0
#Before returning, we restore three original values of registers we pushed onto stack by popping them
lw $s0, 0($sp) #restore register $s0 for caller
lw $t0, 4($sp) #restore register $t0 for caller
lw $t1, 8($sp) #restore register $t1 for caller
addi $sp, $sp, 8 #adjust stack to delete 3 items
jr $ra #jump back to calling routine
然而,当我编译并尝试 运行 这个时,它给我这个错误:
“错误:无效的程序计数器值:0x00000000
执行:执行因错误而终止。
我完全不明白这个错误。谁能指出我正确的方向?
好像是MARS把寄存器$ra
初始化为0x00000000
,使用jr $ra
,程序跳转到了0x00000000
,认为无效
我想你应该在main:
之后写一些调用函数leaf
的代码(然后通过system call 10号退出)来测试你的函数。
实际上你不需要保存和恢复$t0,$t1
因为如果调用函数不使用这些寄存器,
拯救和恢复它们的努力被浪费了。为了避免这种浪费,MIPS 将
注册到保留和非保留类别。保留的寄存器包括 $s0 – $s7
(因此得名,已保存)。非保留寄存器
include $t0 – $t9
(因此他们的名字,临时的)。一个函数必须保存并且
恢复它希望使用的任何保留的寄存器,但它可以更改
非保留的自由注册。
.text
main:
addi $a0,[=10=],1 #argument 0 = 1
addi $a1,[=10=],2 #argument 1 = 2
addi $a2,[=10=],3 #argument 2 = 3
addi $a3,[=10=],4 #argument 3 = 4
jal leaf # call function leaf
add $s0,$v0,$zero # return value
li $v0,10
syscall
leaf:
addi $sp, $sp, -12 #adjust stack to make room for 3 items
sw $s0, 8($sp) #save register $t1 for use in memory location 8
sw $t0, 4($sp) #save register $t0 for use in memory location 4
sw $t1, 0($sp) #save register $s0 for use in memory location 0
add $t0, $a0, $a1 #register $t0 contains $a0 + $a1
add $t1, $a2, $a3 #register $t1 contains $a2 + $a3
sub $s0, $t0, $t1 #$t0 = $t0 - $t1 -> $t0 = ($a0 + $a1) - ($a2 + $a3)
add $v0, $s0, $zero #copy $s0 to return register $v0
#Before returning, we restore three original values of registers we pushed onto stack by popping them
lw $t1, 0($sp) #restore register $s0 for caller
lw $t0, 4($sp) #restore register $t0 for caller
lw $s0, 8($sp) #restore register $t1 for caller
addi $sp, $sp, 12 #adjust stack to delete 3 items
jr $ra #jump back to calling routine
改进版。
.text
main:
addi $a0,[=11=],2 #argument 0 = 2
addi $a1,[=11=],3 #argument 1 = 3
addi $a2,[=11=],4 #argument 2 = 4
addi $a3,[=11=],5 #argument 3 = 5
jal leaf # call function leaf
add $s0,$v0,$zero # return value
li $v0,10
syscall
leaf:
addi $sp, $sp, -4 #adjust stack to make room for 3 items
sw $s0, 0($sp) #save register $t1 for use in memory location 8
add $t0, $a0, $a1 #register $t0 contains $a0 + $a1
add $t1, $a2, $a3 #register $t1 contains $a2 + $a3
sub $s0, $t0, $t1 #$t0 = $t0 - $t1 -> $t0 = ($a0 + $a1) - ($a2 + $a3)
add $v0, $s0, [=11=] #copy $s0 to return register $v0
#Before returning, we restore three
#original values of registers we pushed
#onto stack by popping them
lw $s0, 0($sp) #restore register $t1 for caller
addi $sp, $sp, 4 #adjust stack to delete 3 items
jr $ra #jump back to calling routine