MIPS/ MARS:以二进制打印

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

该程序在开始处包含主代码,用于调用带有三个测试数字的名为 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

mips sql-server-mars
1个回答
0
投票

问题是您期望

$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
    ,则需要使用这种方法。有两种方法可以使用一些堆栈空间来保留该值:

    • 只需将 $a0 值“推送”(在 MIPS 意义上)到堆栈并根据需要从堆栈内存中重新加载它,或者,
    • 将 $s 寄存器“压入”堆栈并将 $a0 复制到该 $s 寄存器并从那里开始使用它。

    两种堆栈空间方法都需要您分配堆栈空间,并在返回调用者之前取消分配。

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