Assembly IEEE-754中打印浮点的程序仅在火星上有效

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$

程序接收一个浮点(具有单精度)并按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$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