我正在开展 MIPS 汇编中的一个大学项目,其中我需要通过在内存中的不同偏移量(例如 0、20、40)存储单词来管理电话目录。但是,当我尝试从特定偏移量加载和打印单词时,我始终获得存储在最后一个偏移量中的值。任何有关可能导致此行为的原因的见解或有关如何排除故障的建议将不胜感激。谢谢!
Get_Entry:
addi $sp,$sp,-4
sw $ra, 0($sp)
la $a0,Telephone_base_address
jal Get_Entry_Number
move $a0,$v1
jal Get_Entry_Last_Name
move $a0,$v1
jal Get_Entry_First_Name
move $a0,$v1
jal Get_Entry_Phone_Number
li $v0,4
lw $a0,0($v1)
syscall
lw $ra, 0($sp) ##restore $ra
addi $sp, $sp, 4
jr $ra
Get_Entry_Number:
addi $sp,$sp,-4
sw $ra, 0($sp)
move $t0,$a0
li $v0, 4
la $a0, get_entry_number
syscall
li $v0,12
syscall
li $t1, 60
mul $t2,$t1,$v0
#addition of Telephone base address with the product
add $t3,$t0,$t2
move $v1,$t3
lw $ra, 0($sp) ##restore $ra
addi $sp, $sp, 4
jr $ra
Get_Entry_Last_Name:
addi $sp,$sp,-4
sw $ra, 0($sp)
move $t0,$a0
li $v0, 4
la $a0, get_entry_last_name
syscall
li $v0, 8 # syscall code 8 for read_string
la $a0,buffer # address of the buffer
li $a1, 20
syscall
sw $a0,0($t0)
#sll $t0,$t0,20
move $v1,$t0
lw $ra, 0($sp) ##restore $ra
addi $sp, $sp, 4
jr $ra
Get_Entry_First_Name:
addi $sp,$sp,-4
sw $ra, 0($sp)
move $t0,$a0
li $v0, 4
la $a0, get_entry_first_name
syscall
li $v0, 8 # syscall code 8 for read_string
la $a0,buffer # address of the buffer
li $a1, 20
syscall
sw $a0,20($t0)
#sll $a0,$a0,20
move $v1,$t0
lw $ra, 0($sp) ##restore $ra
addi $sp, $sp, 4
jr $ra
Get_Entry_Phone_Number:
addi $sp,$sp,-4
sw $ra, 0($sp)
move $t0,$a0
li $v0, 4
la $a0, get_entry_phone_number
syscall
li $v0, 8 # syscall code 8 for read_string
la $a0, buffer # address of the buffer
li $a1, 20
syscall
li $v0, 8 # syscall code 8 for read_string
move $a0,$t0 # address of the buffer
li $a1, 20
syscall
move $v1,$t0
lw $ra, 0($sp) ##restore $ra
addi $sp, $sp, 4
jr $ra
这些函数中的每一个都认为
$a0
持有 Telephone_base_address
— 然而 $a0
不断变化,以便您可以使用 syscall#4 进行一些打印。
这就是您需要做的:使用简单的示例进行调试。单步执行每一行并验证每一行都按照您的预期进行。
在执行此单步执行之前,请先了解您的数据。例如,MARS 有一个标签及其值的列表。因此,您可以看到字符串
get_entry_number
的值。作为另一个示例,您可以计算指针是否引用 Telephone_base_address
中的条目。如果您这样做,您会注意到寄存器中的值不正确。
当有函数调用时,在进入任何函数时立即验证每个参数。然后在返回时,验证寄存器是否仍然保存您期望的内容(寄存器以恢复/返回的功能不起作用的方式更改是很常见的)。