该程序在开始处包含主代码,用于调用带有三个测试数字的名为 print_binary 的子例程。你的工作是编写 print_binary。 print_binary 的结尾已经为您写好了:它打印一个新行并返回:
00000000000000000000000000000011
11111111111111111111111111111111
11001010111111101111000000001101
到目前为止我的输出是:
00000000000000000000000000000000
10000000000000000000000000000000
10000000000000000000000000000000
我很感激我能得到的任何帮助,
谢谢,
.text
main:
li $a0, 2
jal print_binary
li $a0, -1
jal print_binary
li $a0, 0xcafef00d
jal print_binary
li $v0, 10 # exit
syscall
# On entry, a0 = number to print in binary
print_binary:
li $t1, 32 # Initialize a counter for the bit position (32 bits for unsigned)
loop:
beqz $t1, end # Exit the loop if all bits have been processed
srl $t2, $a0, 31 # Get the most significant bit of the number
andi $t2, $t2, 1 # Mask the least significant bit
addi $t2, $t2, 48 # Convert the bit value to ASCII ('0' or '1')
li $v0, 11 # syscall to print one char
move $a0, $t2 # Load the bit value into $a0
syscall
sll $a0, $a0, 1 # Shift the original number to the left by 1 bit
addiu $t1, $t1, -1 # Decrement the counter
j loop
end:
li $v0, 11 # syscall to print one char
li $a0, 10 # Load newline character into $a0 ('\n')
syscall
jr $ra
问题是您期望
$a0
保持其值,而打印字符的代码会将其擦除。
li $v0, 11 # syscall to print one char
move $a0, $t2 # Load the bit value into $a0 <<--- overwrites $a0
syscall
您将找到一种方法以某种方式保留
$a0
中保存的价值。有多种选择。
转移(复制/移动)到另一个寄存器。
syscall
是友好的,并且保留除返回值之外的所有寄存器(如果系统调用提供了一个寄存器),因此您可以将值移动到函数开头的 $t3
并从那里使用它,而不是从 $a0
开始使用它。
使用一些堆栈空间——如果您调用另一个函数而不是使用
syscall
,则需要使用这种方法。有两种方法可以使用一些堆栈空间来保留该值:
两种堆栈空间方法都需要您分配堆栈空间,并在返回调用者之前取消分配。