MIPS中.data中的问题打印常量

问题描述 投票:0回答:1

关注this

几乎完成了。这次我认为问题很简单。

在底部,有一个打印常数A到H的函数。当我运行代码时,在syscall上出现一些错误以打印第一个常数。不知道为什么。理想情况下,我希望这些整数以十六进制打印。

enter image description here

也有人可以向我解释这些错误的含义以及如何阅读它们?通常,我只是寻找引起问题的线路,然后退后一步,尝试猜测可能是什么问题。

这是我的代码:

.data

    A:      .word   0x87564C0C
    B:      .word   0xF1369725
    C:      .word   0x82E6D493
    D:      .word   0x63A6B509
    E:      .word   0xDD9EFF54
    F:      .word   0xE07C2655
    G:      .word   0xA41F32E7
    H:      .word   0xC7D25631
    W:      .word   0x6534EA14
    K:      .word   0xC67178F2

    str_A:      .asciiz "A="
    str_B:      .asciiz "\nB="
    str_C:      .asciiz "\nC="
    str_D:      .asciiz "\nD="
    str_E:      .asciiz "\nE="
    str_F:      .asciiz "\nF="
    str_G:      .asciiz "\nG="
    str_H:      .asciiz "\nH="

    start:      .asciiz "\nSTART:\n"
    final:      .asciiz "\n\nFINAL:\n"



.text
.globl  main

main:

    ##### Print constants

    li $v0, 4       
    la $a0, start
    syscall 

    jal print_vals

    #####




    li  $s0,0   #loop counter
    li  $s1,64  #loop limit

    main_loop: #for(int i=0; i<64; i++)
        bge $s0,$s1,end_main_loop

            jal box_0
            move    $a0,$v0 #save return value in $a0 to be used as argument by box_1

            jal box_1
            move    $a0,$v0 #

            jal box_2
            move    $a0,$v0 #
            move    $s2,$a0 #will be necessary for the input of box_4 later

            jal box_3
            move    $s3,$v0 #Will be assigned to E later

            jal box_4
            move    $a0,$v0 #

            jal box_5
            move    $s4,$v0 #Will be assigned to A later


            ###Assignments

            lw  $a0,G
            la  $a1,H
            sw  $a0,($a1) #Old G goes into new H

            lw  $a0,F
            la  $a1,G
            sw  $a0,($a1)   #Old F goes into new G

            lw  $a0,E
            la  $a1,F
            sw  $a0,($a1)   #Old E goes into new F

            #

            la  $a1,E
            sw  $s3,($a1)   #Output of box_3 goes into new E

            #

            lw  $a0,C
            la  $a1,D
            sw  $a0,($a1)   #Old C goes into new D

            lw  $a0,B
            la  $a1,C

            sw  $a0,($a1)   #Old B goes into new C

            lw  $a0,A
            la  $a1,B

            sw  $a0,($a1)   #Old A goes into new B

            #

            la  $a0,A
            sw  $s4,($a0)   #Output of box_5 goes into new A


            addi    $s0,$s0,1   #increment loop counter

            j   main_loop



    end_main_loop:

        #Print final constants

        li $v0, 4       
        la $a0, final
        syscall 

        jal print_vals

        ##


        li  $v0, 10          # terminate program
        syscall


.text
.globl red_boxes

red_boxes:

box_0:

    lw  $t0,W
    lw  $t1,K

    addu    $t0,$t0,$t1 #Wt + Kt

    move    $v0,$t0

    jr  $ra


box_1:  




    addi $sp, $sp, -4
    sw $ra, ($sp)
    jal Ch  
    move    $t1,$v0


    move    $t0,$a0     #output of box_0

    lw  $t3,H

    addu    $t0,$t0,$t1
    addu    $t3,$t0,$t3

    move    $v0,$t3

    lw $ra, ($sp)
    addi $sp, $sp, 4

    jr  $ra

box_2:


    addi $sp, $sp, -4
    sw $ra, ($sp)
    jal Sigma1
    move    $t1,$v0

    move    $t0,$a0     #output of box_1

    addu    $t0,$t0,$t1

    move    $v0,$t0

    lw $ra, ($sp)
    addi $sp, $sp, 4

    jr  $ra

box_3:

    move    $t0,$a0     #output of box_2

    lw  $t1,D

    addu    $t0,$t0,$t1

    move    $v0,$t0

    jr  $ra

box_4:

    addi $sp, $sp, -4
    sw $ra, ($sp)

    jal Ma
    move    $t1,$v0

    move    $t0,$a0     #output of box_2 

    addu    $t0,$t0,$t1 

    move    $v0,$t0

    lw $ra, ($sp)
    addi $sp, $sp, 4

    jr  $ra

box_5:

    addi $sp, $sp, -4
    sw $ra, ($sp)

    jal Sigma0  
    move    $t1,$v0

    move    $t0,$a0     #output of box_4

    addu    $t0,$t0,$t1

    move    $v0,$t0

    lw $ra, ($sp)
    addi $sp, $sp, 4

    jr  $ra

.text
.globl op_boxes

op_boxes:

Ch:
#           (G&!E) || (F&E)

            lw  $t0,E
            lw  $t1,F
            lw  $t2,G


            and $t1,$t1,$t0 #(F&E)
            not $t0,$t0     #!E
            and $t2,$t2,$t0 #(G&!E)

            or  $t0,$t1,$t2 #(G&!E) || (F&E)

            move    $v0,$t0 

            jr  $ra

Sigma1:

            lw  $t0,E       #Sigma1

            ror $t1,$t0,6   #rotates E to the right by 6 bits   X
            ror $t2,$t0,11  # '''           by 11 bits  Y
            ror $t3,$t0,25  # '''           by 25 bitsZ


            #X XOR Y XOR Z

            xor $t2,$t2,$t1 #X XOR Y
            xor $t3,$t3,$t2 #(X XOR Y) XOR Z

            move    $v0,$t3

            jr  $ra

Ma:

#           majority = (A&B) | (B&C)    

            lw  $t0,A                       
            lw  $t1,B
            lw  $t2,C

            or $t3, $t0, $t2
            and $t1, $t1, $t3
            and $v0, $t0, $t2

            or $v0, $t1, $v0

            jr  $ra

Sigma0:

#Same as Sigma1 but shifted by different values
            lw  $t0,A       #Sigma0

            ror $t1,$t0,2   #X
            ror $t2,$t0,13  #Y
            ror $t3,$t0,22  #Z

            #X XOR Y XOR Z

            xor $t2,$t2,$t1 #X XOR Y
            xor $t3,$t3,$t2 #(X XOR Y) XOR Z



            move    $v0,$t3

            jr  $ra

.text
.globl output

output:

print_vals:

    li $v0, 4       # print A
    la $a0, str_A 
    syscall 



    lw $v0, 34
    li $a0, 34     
    syscall 

    #

    li $v0, 4       # print B
    la $a0, str_B
    syscall 

    lw $v0, B     
    li $a0, 34       
    syscall 

    #

    li $v0, 4        # print C
    la $a0, str_C
    syscall 

    lw $v0, C     
    li $a0, 34      
    syscall 

    #

    li $v0, 4       #print D
    la $a0, str_D
    syscall 

    lw $v0, D     
    li $a0, 34       
    syscall 

    #

    li $v0, 4       #print E
    la $a0, str_E 
    syscall 

    lw $v0, E
    li $a0, 34       
    syscall 

    #
    li $v0, 4       #print F
    la $a0, str_F
    syscall 

    lw $v0, F    
    li $a0, 34       
    syscall 

    #
    li $v0, 4       #print G
    la $a0, str_G
    syscall 

    lw $v0, G    
    li $a0, 34      
    syscall 

    #

    li $v0, 4       #print  H
    la $a0, str_H
    syscall 

    lw $v0, H     
    li $a0, 34     
    syscall 

    jr $ra

什么原因导致此错误,如何解决?

assembly mips
1个回答
0
投票

解决了,我在打印那些数字的函数中把$ v0和$ a0混在一起了。

© www.soinside.com 2019 - 2024. All rights reserved.