我的代码中出现以下错误。请帮忙。 指令引用0x00400014处的未定义符号[0x00400014] 0x0c000000 jal 0x00000000 [main]; 188:jal主要 此代码将Farenheit转换为Celsious和Celsius转换为Farenheit
public interface ISortable<T> : ISortable, IEnumerable<T>
{
// No members..
}
答案 0 :(得分:3)
你的代码甚至不能干净利落地组装。
使用$gp
[使用硬编码偏移量]访问.word 5,9,32
是过度的。为.data
部分设置显式地址可能也不好。
&#34;读取浮动&#34;系统调用返回$f0
和不 $v0
在celcius和fahrenheit部分之间有一个很多的复制代码可以合并。
你正在使用jr $ra
[从函数返回]而没有通过jal
实际调用计算部分
应该有更多的评论来解释你的逻辑流程。您可能希望在此处看到我的答案:MIPS linked list因为它有一些关于asm样式和清晰编码的提示。
无论如何,这里是经过清理,注释和工作的代码:
.data
temp5: .word 5
temp9: .word 9
temp32: .word 32
msg_scale: .asciiz "Select the temperature scale:<C or F><ENTER>"
msg_temp: .asciiz "Type the desired temperature <ENTER>"
msg_out: .asciiz "Temperature= "
msg_nl: .asciiz "\n"
.text
.globl main
main:
# prompt user for temp type/scale
li $v0,4
la $a0,msg_scale
syscall
# read in temp scale
li $v0,12
syscall
move $t0,$v0
# output a newline
la $a0,msg_nl
li $v0,4
syscall
# prompt for temperature
li $v0,4
la $a0,msg_temp
syscall
# read in temperature
# NOTE: result comes back in $f0 and _not_ $v0
li $v0,6
syscall
###lwc1 $f12,$v0
mov.s $f12,$f0
lwc1 $f16,temp5 # get 5
cvt.s.w $f16,$f16
lwc1 $f18,temp9 # get 9
cvt.s.w $f18,$f18
lwc1 $f14,temp32 # get 32
cvt.s.w $f14,$f14
# do fahrenheit to celcius
li $t1,'F'
beq $t0,$t1,Farenheit
li $t1,'f'
beq $t0,$t1,Farenheit
# do celcius to fahrenheit
li $t1,'C'
beq $t0,$t1,Celcius
li $t1,'c'
beq $t0,$t1,Celcius
j main_exit
# print results
main_print:
la $a0,msg_out
li $v0,4
syscall
mov.s $f12,$f0
li $v0,2
syscall
la $a0,msg_nl
li $v0,4
syscall
j main
main_exit:
li $v0,10
syscall
Farenheit:
div.s $f20,$f16,$f18 # get 5/9
sub.s $f12,$f12,$f14 # subtract 32 from temp
mul.s $f0,$f20,$f12 # multiply by 5/9
j main_print
Celcius:
div.s $f20,$f18,$f16 # get 9/5
mul.s $f12,$f12,$f20 # multiply by 9/5
add.s $f0,$f12,$f14 # add 32
j main_print
答案 1 :(得分:0)
首先感谢支持,这非常非常有帮助。对于我的风格,我是初学者在汇编和一般编程。我的代码有点困惑,因为我应该完成一个不完整的代码。让我的解释你。这是发音:
.data0x10008000
.word 5,9,32,100
.text
lui $gp, 0x100
ori $gp, $gp,0x8000
lwc1 $f16, 0($gp)
cvt.s.w $f16, $f16
lwc1 $f18, 4($gp)
cvt.s.w $f18, $f18
div.s $f20 , $f16,f$18
lwc1 $f14, 8($gp)
cvt.s.w $f14 $f14
lwc1 $f12,12($gp)
cvt.s.w $f12,$f12
sub.s $f12,$f12,$f14
mul.s $f0,$f20,$f12
jr $ra
您应该完成此代码并添加用户界面(就像我在我的代码中所做的那样),并且还要编写一个代码,它将从farheneit转换为摄氏度。这就是为什么我感到困惑:(
答案 2 :(得分:0)
我和我的大学有同样的文章(也许你也来自Auth,如果不是对这个括号没有意义:P)
如果您没有使用Craigs回复问题的答案,那么请查看我的代码,该代码正常运行。
我认为经过研究(MIPS $gp register并通过互联网),使用gp访问存储在静态数据段中的数据并不是一个好方法,但这就是程序被告知要完成的方式!
此外,由于未重新初始化您的模拟器,可能会发生许多错误!
这是我的代码,希望我伸出援手!
.data 0x10008000
.word 5, 9, 32
message1: .asciiz "Select the temparature scale:<C or F>:"
message2: .asciiz "Type the desired temperature:"
message3: .asciiz "Temparature= "
newline: .asciiz "\n"
.text
.globl main
main:
li $v0,4
la $a0,message1
syscall #prompt message
#read the character
li $v0,12
syscall
move $t0,$v0
#check the character and branch
li $t1,'F'
beq $t0,$t1,Fahrenheit
li $t1,'f'
beq $t0,$t1,Fahrenheit #fahrenheit to celsius
li $t1,'C'
beq $t0,$t1,Celsius
li $t1,'c'
beq $t0,$t1,Celsius #celsius to fahrenheit
li $v0,10
syscall #end program
Fahrenheit:
li $v0,4
la $a0,newline
syscall #type new line
li $v0,4 #type message 2
la $a0,message2
syscall
li $v0,6
syscall #read float from user
#gp has 0x10008000
lui $gp, 0x1000
ori $gp, $gp, 0x8000 #load to f16 number 5
lwc1 $f16, 0($gp)
cvt.s.w $f16, $f16 #convert to float
lwc1 $f18, 4($gp) #load number 9 to f18
cvt.s.w $f18, $f18 #convert to float
div.s $f20, $f16, $f18 #divide 5/9 and save it to f20
lwc1 $f14, 8($gp) #load number 32
cvt.s.w $f14, $f14 #convert to float
li $v0,6 #read from user float
mov.s $f12,$f0
sub.s $f12, $f12, $f14 #Fahrenheit - 32
mul.s $f0, $f20, $f12 #(Fahrenheit-32)*5/9 ,the result
li $v0,4
la $a0,newline
syscall #type new line
li $v0,4
la $a0,message3
syscall #type message 3
mov.s $f12,$f0
li $v0,2
syscall #type the result
jr $ra
Celsius:
li $v0,4
la $a0,newline
syscall #type new line
li $v0,4 #type message 2
la $a0,message2
syscall
li $v0,6
syscall #read float from user
lui $gp, 0x1000
ori $gp, $gp,0x8000
lwc1 $f16, 0($gp) #load number 5 to f16
cvt.s.w $f16, $f16 #convert to float
lwc1 $f18, 4($gp) #load number 9 to f18
cvt.s.w $f18, $f18 #convert to float
div.s $f20 , $f18,$f16 #save number 9/5( f18 / f16) to f20
lwc1 $f14, 8($gp) #load number 32 to f14
cvt.s.w $f14 $f14 #convert to float
li $v0,6 #read from user
mov.s $f12,$f0
mul.s $f0,$f12,$f20 #Celsius * 9/5
add.s $f0,$f0,$f14 #(Celsius*9/5)+32
li $v0,4
la $a0,message3
syscall #Type the Result!
mov.s $f12,$f0
li $v0,2
syscall
jr $ra
答案 3 :(得分:0)
@kintzo 嘿,Kintzo,我来自auth。谢谢你的帮助。我已经完成了我的代码,它与你的代码非常相似,但我做了两个功能,检查我的代码并告诉我你是否想要你的意见。还使用$ ra(函数返回)没有实际通过$ jal调用。那个问题已经被Craig.Here提到了我的代码
.data 0x10008000
.word 5,9,32
msg_scale: .asciiz "Select the temperature scale:<C or F><ENTER>"
msg_temp: .asciiz "Type the desired temperature <ENTER>"
msg_out: .asciiz "Temperature= "
msg_nl: .asciiz "\n"
.text
.globl main
main:
# prompt user for temp type/scale
li $v0,4
la $a0,msg_scale
syscall
# read in temp scale
li $v0,12
syscall
move $t0,$v0
# output a newline
la $a0,msg_nl
li $v0,4
syscall
# prompt for temperature
li $v0,4
la $a0,msg_temp
syscall
# read in temperature
# NOTE: result comes back in $f0 and _not_ $v0
li $v0,6
syscall
li $t1,'F'
beq $t0,$t1,F
li $t1,'C'
beq $t0,$t1,C
F:
jal Farenheit
la $a0,msg_out
li $v0,4
syscall
mov.s $f12,$f0
li $v0,2
syscall
la $a0,msg_nl
li $v0,4
syscall
j main_exit
C:
jal Celcius
la $a0,msg_out
li $v0,4
syscall
mov.s $f12,$f0
li $v0,2
syscall
la $a0,msg_nl
li $v0,4
syscall
j main_exit
main_exit:
li $v0,10
syscall
.globl Farenheit
Farenheit:
lui $gp , 0x1000
ori $gp , $gp, 0x8000
lwc1 $f16 , 0($gp)
cvt.s.w $f16,$f16
lwc1 $f18, 4($gp)
cvt.s.w $f18, $f18
lwc1 $f14, 8($gp)
cvt.s.w $f14 $f14
div.s $f20,$f16,$f18 # get 5/9
mov.s $f12,$f0
sub.s $f12,$f12,$f14 # subtract 32 from given temprerature
mul.s $f0,$f20,$f12 # multiply by 5/9
jr $ra
.globl Celcius
Celcius:
lui $gp , 0x1000
ori $gp , $gp, 0x8000
lwc1 $f16 , 0($gp)
cvt.s.w $f16,$f16
lwc1 $f18, 4($gp)
cvt.s.w $f18, $f18
lwc1 $f14, 8($gp)
cvt.s.w $f14 $f14
div.s $f20,$f18,$f16 # get 9/5
mov.s $f12,$f0
mul.s $f12,$f12,$f20 # multiply by 9/5
add.s $f0,$f12,$f14 # add 32
jr $ra