assembly - 在 MIPS 中的 .data 中发出打印常量
问题描述
对此的跟进
差不多就这样了。这次我觉得问题更简单了。
在底部有一个打印常量 A 到 H 的函数。当我运行代码时,我在打印第一个常量的系统调用上遇到了一些错误。不知道为什么。理想情况下,我希望这些整数以十六进制打印。
也有人可以向我解释这些错误的含义以及如何阅读它们?通常我只是寻找导致问题的线路,然后我退后一步尝试猜测问题可能是什么。
这是我的代码:
.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
是什么导致了这个错误,我该如何解决?
解决方案
解决了,我在打印这些数字的函数中混合了 $v0 和 $a0。
推荐阅读
- firebase - flutter 联系人列表显示顺序
- flutter - 跨越另一个列表视图的 ListView 子 AnimatedContainer
- android - net::ERR_HTTP_RESPONSE_CODE_FAILURE 加载 url android webview
- python - 将 Python 变量传递给“LIKE”SQL 查询
- java - 如何处理 android.view.InflateException?当我尝试打开地图时出现此错误
- python - Python将属性的属性添加到类的实例
- python - 如何隐藏程序执行时弹出的黑色cmd窗口
- javascript - 删除另一个数组Javascript中的数组内的对象
- visual-studio-2019 - 如何更改 Visual Studio 2019 中“开发人员-PowerShell”的颜色
- spring - Groovy 中的 Mockito.verify() 导致 Spring @MockBean 的方法不明确