Assembly IEEE-754中打印浮点的程序仅在火星上有效
程序接收一个浮点(具有单精度)并按IEEE-764标准打印,如下所示:Assembly IEEE-754中打印浮点的程序仅在火星上有效,assembly,mips,mars-simulator,qtspim,Assembly,Mips,Mars Simulator,Qtspim,程序接收一个浮点(具有单精度)并按IEEE-764标准打印,如下所示: 数字本身具有简单的精度 数字符号 指数减127 十六进制的尾数 .data zeroAsFloat:。浮点0.0 符号:.asciiz“0x” 结束行:.asciiz“\n” 阳性:.asciiz“+\n” 负数:.asciiz“-\n” hexresult:。空格8 .文本 主要内容: 李$v0,6 系统调用 mfc1$t8$f0#存储在$t8中 #提取位31 ori$t0$0 0x1 sll$t0$t0 31 和$a0$
.data
zeroAsFloat:。浮点0.0
符号:.asciiz“0x”
结束行:.asciiz“\n”
阳性:.asciiz“+\n”
负数:.asciiz“-\n”
hexresult:。空格8
.文本
主要内容:
李$v0,6
系统调用
mfc1$t8$f0#存储在$t8中
#提取位31
ori$t0$0 0x1
sll$t0$t0 31
和$a0$t0$t8
srl$a0$a0 31
加上$t1、$0、$a0
beq$a0,0,打印正
bne$a0,0,打印负片
主要内容2:
#提取位23-30
ori$t0$0 0xFF
sll$t0$t0 23
和$a0$t0$t8
srl$a0$a0 23
addi$t3$0,127
低于$a0、$a0、$t3
#打印指数
addi$v0$0 1
系统调用
李$v0,4
洛杉矶$a0,终点线
系统调用
李$v0,4
la$a0,符号
系统调用
#提取位0-22
ori$t0$0 0xFFFF
sll$t0$t0 7
ori$t0$t0 0x7F
和$a0$t0$t8
日航六角
李$v0,4
洛杉矶$a0,终点线
系统调用
李$v0,10
系统调用
打印正片:
加上$t4、$0、$a0
李$v0,4
la$a0,正值
系统调用
beqz$ra,main2#当$ra为零时,其他程序继续
jr$ra
打印负片:
加上$t4、$0、$a0
李$v0,4
la$a0,负数
系统调用
beqz$ra,main2#当$ra为零时,其他程序继续
jr$ra
十六进制:
sub$sp,$sp,24#将寄存器推送到堆栈上
sw$a0,0($sp)
sw$s0,4($sp)
sw$s1,8($sp)
sw$s2,12($sp)
sw$s3,16($sp)
sw$s4,20($sp)
移动$s2,$a0#移动a0到s2
li$s0,8#8位十六进制字
la$s3,hexresult#这里设置了十六进制字符串
六角环:
rol$s2,$s2,4#从最左边的数字开始
和$s1、$s2、0xf#在s2中屏蔽15位数字,并将结果放入s1
ble$s1,9,六角打印#如果s1结果
加上$s3,$s3,1#s3=s3+1
加上$s0,$s0,-1#s0=s0-1
bnez$s0,hexloop#如果s0!=0,转到hexloop
la$a0,hexresult#显示结果
李$v0,4
系统调用
jr$ra#回报
我不知道为什么程序在QTSpim中只打印信号,而在MARS中执行正常。有什么建议吗?(我相信这是由于
printPositive
和printNegative
函数中的jr
造成的)。您的标题声称它无法编译。但在文本中,你说它打印“信号”。你能更具体地说明你在qtSPIM中得到了什么和你期望得到什么吗。你不能在你跳到使用beq/bne
的东西中使用jr$ra
。您必须用硬编码跳转(例如,jmain2
)替换那些jr
指令,或者以使用jal
跳转到打印函数的方式重写代码。该程序确实使用QtSPIM为我编译。
.data
zeroAsFloat: .float 0.0
symbol: .asciiz "0x"
endLine: .asciiz "\n"
positive: .asciiz "+\n"
negative: .asciiz "-\n"
hexresult: .space 8
.text
main:
li $v0, 6
syscall
mfc1 $t8 $f0 #store in $t8
#extract bit 31
ori $t0 $zero 0x1
sll $t0 $t0 31
and $a0 $t0 $t8
srl $a0 $a0 31
add $t1, $zero, $a0
beq $a0, 0, printPositive
bne $a0, 0, printNegative
main2:
#extract bits 23-30
ori $t0 $zero 0xFF
sll $t0 $t0 23
and $a0 $t0 $t8
srl $a0 $a0 23
addi $t3, $zero, 127
sub $a0, $a0, $t3
#print exponent
addi $v0 $zero 1
syscall
li $v0, 4
la $a0, endLine
syscall
li $v0, 4
la $a0, symbol
syscall
#extract bits 0-22
ori $t0 $zero 0xFFFF
sll $t0 $t0 7
ori $t0 $t0 0x7F
and $a0 $t0 $t8
jal hex
li $v0, 4
la $a0, endLine
syscall
li $v0, 10
syscall
printPositive:
add $t4, $zero, $a0
li $v0, 4
la $a0, positive
syscall
beqz $ra, main2 # when $ra is zero end program else continue
jr $ra
printNegative:
add $t4, $zero, $a0
li $v0, 4
la $a0, negative
syscall
beqz $ra, main2 # when $ra is zero end program else continue
jr $ra
hex:
sub $sp, $sp, 24 # Push register onto stack
sw $a0, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $s2, 12($sp)
sw $s3, 16($sp)
sw $s4, 20($sp)
move $s2, $a0 # Move a0 to s2
li $s0, 8 # 8 digits for hex word
la $s3, hexresult # Hex string set up here
hexloop:
rol $s2, $s2, 4 # Start with leftmost digit
and $s1, $s2, 0xf # Mask 15 digits in s2 and place results in s1
ble $s1, 9, hexprint # If s1 <= 9, go to print
add $s1, $s1, 7 # Else s1 = s1 + 7 (to get A-F)
hexprint:
add $s1, $s1, 48 # Add 48 (30 hex) to get ascii code
sb $s1,($s3) # Store byte in result. s3 -> result
add $s3, $s3, 1 # s3 = s3 + 1
add $s0, $s0, -1 # s0 = s0 - 1
bnez $s0, hexloop # If s0 != 0, go to hexloop
la $a0, hexresult # display result
li $v0, 4
syscall
jr $ra # Return