MIPS usando operadores de deslocamento de bits para imprimir um decimal em binário

Eu li vários tópicos aqui e em outros lugares on-line sobre esse tópico. Ótimos tópicos sobre mudanças de bits (não necessariamente relacionados à montagem, mas o tópico em geral são:O que são operadores de deslocamento bit a bit (deslocamento por bit) e como eles funcionam? Eu fui tão longe quanto copiar e colar o código do OP aqui:Como imprimo um número binário com um número inteiro inserido? e fazendo as alterações sugeridas pelo replicador e continuo produzindo uma série de zero, não importa o que eu faça.

Entendo o que é uma mudança de bits e como ela funciona. Deslocar para a direita por 'n' divide o número por 2 ^ n e deslocar para a esquerda multiplica o número por 2 ^ n.

Eu tinha um laboratório que deveria ser entregue na semana passada e a terceira parte era fornecer um programa que recebesse a entrada do usuário, imprimisse a versão binária e, em seguida, a versão hexidecimal. Feito isso, o programa deveria imprimir certos bits no centro da string e produzir sua versão binária e hexidecimal também.

Meu pensamento original era pegar a string, E com 0x01, imprimir o resultado '1' ou '0' e, em seguida, mudá-lo para a direita por '1'. Isso estava contido em um loop e continuaria até meu contador atender ao requisito '32' e terminar com ele. Mas estou extremamente confuso sobre o motivo de imprimir todos os '0'. Eu tentei outras versões, como:

desloque a entrada do usuário para a esquerda em 31 e faça o loop para cada bit, mas dentro do loop estava deslizando para a direita (para compensar a ordem inversa dos bits) - falhou - todos os zero são novamente

faça o oposto de cima - falhou novamente, todos os zero

Eu sei na minha cabeça o que eu quero fazer algo assim:

(NOT CODE OBVIOUSLY)
User input is: 25 <-- store at $t0 
    Binary rep is: 0000 0000 0000 0000 0000 0000 0001 1001 # 25 in $t0

LOOP:
    AND with 0x01: 0000 0000 0000 0000 0000 0000 0000 0001 #saved to $t1

    Produces:      0000 0000 0000 0000 0000 0000 0000 0001 #saved to $t2

    Print to Console: 1 #send contents of $t2 to syscall

    Shift $t0 Right 1: 0000 0000 0000 0000 0000 0000 0000 1100 #

j LOOP (until the beq branch was met and I left the loop)

Eu teria pensado que isso teria funcionado. Mesmo que produzisse o resultado de trás para a frente, pensei que ainda teria recebido '1s' na minha sequência produzida que eu teria notado e tratado adequadamente (altere o número inteiro deixado em$t0 por '31' e, em seguida, executou as instruções acima. Ainda todos os '0' ...

Aqui está o meu código. Agora, novamente, ele foi corrompido por minhas inúmeras tentativas e alterações. Estou apenas pedindo ajuda para entender se minha abordagem destacada acima é completamente fora da base e o que posso fazer com o código de exemplo abaixo para corrigir isso.

Entenda que esta tarefa foi entregue e não a completei devido à minha confusão. Eu estou olhando para entender isso ainda mais. Não completei o código inteiro porque fiquei perplexo com essa parte. Então, pedirei a primeira parte desta tarefa.

#Read integer A from user and store it into a register
#Display the integer in binary
#Display the integer in Hex
#set Register $a0 to contain only bits 12,13,14,15 of $a0
#Display the integer in binary contained in $a0
#Display the integer in hex contained in $a0

.data

    userInput: .asciiz "Please enter your integer:\n"
    binaryInput: .asciiz "Here is the input in binary: "
    nl: .asciiz "\n\n"
    h,exInput: .asciiz "Here is the input in hexidecmal: "
    binaryOutput: .asciiz "Here is the output in binary: "
    hexOutput: .asciiz "Here is the output in hexidecimal: "

.text
    main:

    #ask end-user to submit an integer value
    li $v0, 4
    la $a0, userInput
    syscall

    #read user-input
    li $v0, 5
    syscall

    #enter user input into $t0
    move $t0, $v0
    add $t1, $zero, $zero       #counter
    addi $t2, $zero, 32     #target
    sll $s1, $t0, 31        #shift left number 31 bits to s1
    li $v0, 4
    la $a0, binaryInput     #print out string to user
    syscall


loop:
    andi $s2, $s1, 1        #and 0x01 with s1 to s2
    srl $s1, $s1, 1         #shift right s1 by 1 bit
    li $v0, 1
    la $a0, ($s2)           #print digit held in s2 to screen
    syscall
    add $t1, $t1, 1         #add 1 to counter
    bne $t1, $t2, loop      #check if counter is equal to target, if not continue loop

    #exit the program 
    li $v0, 10
    syscall

questionAnswers(1)

yourAnswerToTheQuestion