MIPS 32 位,汇编程序:压入和弹出
MIPS 32 bit, assembler: push and pop
我的代码有问题,MARS 不会 assemble 它,因为我为 sw
指令使用了错误类型的寄存器。
为什么我不能使用这条线
sw $so, 0($sp)
在sw
中使用s类型寄存器有问题吗?
我想将 $so
的值保存在堆栈上,我应该怎么做?
完整代码:
.data
.text
f1:
li $s0, 30
addi $sp, $sp, -4
sw $so, 0($sp)
jal f2
lw $v2, 0($v1)
add $sp, $zero, $zero
addi $sp, $sp, -4
add $sp, $zero, $zero
j Exit
f2:
addi $sp, $sp, -4
sw $sp, 0($ra)
jal f3
lw $to, 0($vo)
srl $t0, $to, 1
add $to, $to, $to
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
f3:
addi $vo, $so, 1
jr $ra
Exit:
result .asciiz "Value is "
la $v2, result
syscall
编辑:
感谢您的回答,我的事情更正确了,现在我的新代码中的第 16 行有问题。
在我将地址保存到堆栈之前应该发生什么,以便不会出现以下错误?
错误:
line 16: Runtime exception at 0x00400028: Cannot write directly to text segment!0x00400010
代码:
.data
result: .asciiz "Value is "
.text
f1:
li $a0, 30 #n=30
addi $sp, $sp, -4 #set sp back for save
sw $a0, 0($sp) #save a0 to stack
jal f2
lw $a1, 0($v1)
add $sp, $zero, $zero
addi $sp, $sp, -4
add $sp, $zero, $zero
j Exit
f2:
addi $sp, $sp, -4
sw $sp, 0($ra)
jal f3
lw $t0, 0($v0) #
srl $t0, $t0, 1
add $t0, $t0, $t0
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
f3:
addi $v0, $a0, 1 #
jr $ra
Exit:
li $v0, 4
la $a2, result
syscall
sw $s0, 0($sp)
应该在你的堆栈顶部写入 $S0
我的代码有问题,MARS 不会 assemble 它,因为我为 sw
指令使用了错误类型的寄存器。
为什么我不能使用这条线
sw $so, 0($sp)
在sw
中使用s类型寄存器有问题吗?
我想将 $so
的值保存在堆栈上,我应该怎么做?
完整代码:
.data
.text
f1:
li $s0, 30
addi $sp, $sp, -4
sw $so, 0($sp)
jal f2
lw $v2, 0($v1)
add $sp, $zero, $zero
addi $sp, $sp, -4
add $sp, $zero, $zero
j Exit
f2:
addi $sp, $sp, -4
sw $sp, 0($ra)
jal f3
lw $to, 0($vo)
srl $t0, $to, 1
add $to, $to, $to
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
f3:
addi $vo, $so, 1
jr $ra
Exit:
result .asciiz "Value is "
la $v2, result
syscall
编辑:
感谢您的回答,我的事情更正确了,现在我的新代码中的第 16 行有问题。 在我将地址保存到堆栈之前应该发生什么,以便不会出现以下错误? 错误:
line 16: Runtime exception at 0x00400028: Cannot write directly to text segment!0x00400010
代码:
.data
result: .asciiz "Value is "
.text
f1:
li $a0, 30 #n=30
addi $sp, $sp, -4 #set sp back for save
sw $a0, 0($sp) #save a0 to stack
jal f2
lw $a1, 0($v1)
add $sp, $zero, $zero
addi $sp, $sp, -4
add $sp, $zero, $zero
j Exit
f2:
addi $sp, $sp, -4
sw $sp, 0($ra)
jal f3
lw $t0, 0($v0) #
srl $t0, $t0, 1
add $t0, $t0, $t0
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
f3:
addi $v0, $a0, 1 #
jr $ra
Exit:
li $v0, 4
la $a2, result
syscall
sw $s0, 0($sp)
应该在你的堆栈顶部写入 $S0