2

摂氏の温度を華氏に変換するなど、いくつかの基本的な演算を実行するプログラムを 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 = "

私の友人は、Spim シミュレーターが実際に疑似命令を自動的に変換して表示すると教えてくれました。彼はそれをコピーしてメモ帳に貼り付け、小さな変更を加えるように言いました。私はまだ混乱しています。

これは私がコピーして変更したものです:

.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#
4

1 に答える 1