2016-09-11 28 views
-1

沒有在我的代碼不尋常的行爲,我只是想不通錯誤的S0寄存器中,而打印

 .data 
hello:  .asciiz "Hello\n" 
msg1:  .asciiz "lol" 
msg2:  .asciiz "msg2" 
     .text 
main: 
    la $a0, hello 
    jal print 

la $a0, msg1 
jal create 
move $s1, $v0 #s0 

move $a0, $v0 
jal print 

la $a0, msg2 
jal create 
move $s2, $v0 #s1 

move $a0, $v0 
jal print 

move $a0, $s1 #s0 
move $a1, $s2 #s1 
jal append 

move $a0, $v0 
jal print 

li $v0, 10 
syscall 

在一個評論,如果我開關S1與S0和S2與S1線,我的代碼無法按照它的方式工作。無論我使用的其他保存寄存器的索引是什麼,代碼的行爲都很好,但如果我使用0,程序就會出錯。

+0

'我的程序出錯'不是問題描述。 – EJP

+1

查看http://stackoverflow.com/questions/6077852/mips-is-it-elegant-to-use-s0-etc-reginsters-inside-the-procedure-and-restore爲什麼你不應該修改S0或任何S寄存器。 這是一個運氣問題使用S1或S2不是問題。 –

+1

由於您沒有包含您調用的任何子例程('create','print','append'),因此您向我們顯示的代碼不足以重現此問題。 – Michael

回答

2

這些是32 MIPS寄存器及其功能。

 $zero 0 constant value 0 
     $at 1 assembler temp 
     $v0 2 funcZon return 
     $v1 3 funcZon return 
     $a0 4 argument 
     $a1 5 argument 
     $a2 6 argument 
     $a3 7 argument 
     $t0 8 temporary value 
     $t1 9 temporary value 
     $t2 10 temporary value 
     $t3 11 temporary value 
     $t4 12 temporary value 
     $t5 13 temporary value 
     $t6 14 temporary value 
     $t7 15 temporary value 
     $s0 16 saved temporary 
     $s1 17 saved temporary 
     $s2 18 saved temporary 
     $s3 19 saved temporary 
     $s4 20 saved temporary 
     $s5 21 saved temporary 
     $s6 22 saved temporary 
     $s7 23 saved temporary 
     $t8 24 temporary value 
     $t9 25 temporary value 
     $k0 26 reserved for OS 
     $k1 27 reserved for OS 
     $gp 28 global pointer 
     $sp 29 stack pointer 
     $fp 30 frame pointer 
     $ra 31 return address 

$s$t寄存器之間的區別是$s寄存器的函數返回後不變,而有此不能保證爲$t寄存器。

如果使用$s寄存器,則必須保存並恢復其值。例如,如果功能create使用寄存器$t0$s0,然後調用功能print,則它必須保存寄存器$t0,如果它想在print返回後使用它。 print必須先保存$s0,然後才能開始使用它。

在這種情況下,您應該使用$t寄存器。

+0

由於's'寄存器保存了內容,這是我使用它們的原因。對於'print',我使用了寄存器$ t0,所以我不想使用它,因爲我的數據將被覆蓋。對於任何其他$ s寄存器,無論我使用哪個索引,除0之外,它都可以正常工作 –

+1

與大多數拱門不同,mips不會硬連線寄存器。 H/W硬連線'$ zero'爲0.'jal'指令硬連線到'$ ra',但'jalr'不會。沒有'push/pop' insts,所以棧指針可以是任何reg [如果你需要的話]。在一個自包含的程序中,您可以將任何寄存器用於任何目的。 ABI更像是一個「建議」(即創造你自己的約定)。 OP使用'*'非常好[並且_is_ ABI符合這裏] - 'main'的調用者不設置's *',所以'main'可以在不保存的情況下設置它們。 –

+0

看,我非常感謝你的幫助,而且我從你上次的評論中學到了一些東西,但在我的例子中,我正在移動的$ v0只是一些小數的整數值,例如13左右。這就是爲什麼我不清楚發生了什麼問題,因爲即使'$ s0'寄存器還沒有用於我認爲的任何其他功能。 無論如何,如果你有時間再多一個問題,我怎麼能打印存儲在2個寄存器中的乘法結果(hi和lo)。他們在兩個不同的寄存器中... –