2015-02-08 195 views
2

我被要求用mips彙編語言編寫程序來執行一些基本的算術運算,例如將攝氏溫度轉換爲華氏溫度。因爲我使用了僞指令,所以我最終在這個任務上收到了差評。我不知道我甚至使用僞指令,因爲它看起來很多教程在線使用,沒有太多的澄清。如何轉換Mips僞指令?

出於好奇,我想知道如果有人能解釋如何將僞指令轉換爲非僞指令?下面

是僞指令我的工作程序:

## convert temperature from celsius to fahrenheit 
## F = (9*C/5)+32 
.text 
.globl main 
main:    # execution starts here 

la $a0,getCelsius # ask user for temperature in celcius 
li $v0,4   # print message to console 
syscall   

li $v0,5   # read integer from console 
syscall   

mul $t0,$v0,9 # compute ($v0 * 9) 
div $t0,$t0,5 # compute ($v0 * 9)/5 
addi $t0,$t0,32 # compute (($v0 * 9)/5) + 32 

la $a0,tempF  # print message to console 
li $v0,4 
syscall 

move $a0,$t0  # print result of (($v0 * 9)/5) + 32 
li $v0,1 
syscall 

li $v0,10   # Done 
syscall  

.data 
getCelsius: .asciiz "Enter celsius temperature: " 
tempF: .asciiz "Fahrenheit temperature = " 

我的一個朋友告訴我,垃圾消息模擬器實際上會自動轉換pseuo的指令並進行顯示。他說要複製並粘貼到記事本中並做一些小改動。我仍然困惑。

這是我結束了複製和修改:

.text 
.globl main 
main: 


lui $11, 0x1001 [getCelsius] # la $a0,getCelsius ask user for temperature 
in celcius# 
ori $4, $11, 0 [getCelsius] 
ori $2, $0, 4     # li $v0,4   print message to console# 
syscall       # syscall   
ori $2, $0, 5     # li $v0,5   read integer from console# 
syscall       # syscall   
ori $11, $0, 9     # mul $t0,$v0,9  compute ($v0 * 9)# 
mul $8, $2, $11 
ori $11, $0, 5     # div $t0,$t0,5  compute ($v0 * 9)/5# 
div $8, $11 
mflo $8 
addi $8, $8, 32     # addi $t0,$t0,32 compute (($v0 * 9)/5) + 32# 
lui $11, 0x1001 [tempF]   # la $a0,tempF  print message to console# 
ori $4, $11, 28 [tempF] 
ori $2, $0, 4     # li $v0,4 
syscall       # syscall 
addu $4, $0, $8     # move $a0,$t0  print result of (($v0 * 9)/5) + 32# 
ori $2, $0, 1     # li $v0,1 
syscall       # syscall 
ori $2, $0, 10     # li $v0,10   Done# 

回答

1

如果你沒有爲你的彙編詳細介紹了僞指令的文檔,你可以隨時拆卸只是二進制,看看你得到了什麼是真正的代碼。但要注意,一些反彙編程序會識別這些模式並重新創建僞指令。

這就是說,一些僞指令我可以當場:

la/li $r, x => lui $r, %hi(x) + addiu/ori $r, $r, %lo(x)因爲爲32位的指令立即沒有地方,該第一加載的高16位(清除底部16)然後添加低16位。如果已知前16位爲零,則可以使用addiu/ori $r, $0, x代替。另見this question

move $r0, $r1 => addu/or $r0, $0, $r1