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