Я читал многочисленные темы здесь и в других местах в Интернете по этой теме. Отличные темы о смещениях бит (не обязательно относящиеся к сборке, но тема в целом: What are bitwise shift (bit-shift) operators and how do they work? Я дошел до копирования и вставки кода из OP здесь: How do I print a binary number with an inputed integer? и внесения изменений, которые предлагал репитер, и продолжаю создайте строку нуля независимо от того, что я делаю.MIPS Использование операторов битового сдвига для печати десятичного разряда в двоичном формате
Я понимаю, что такое сдвиг бит и как оно работает. Сдвиг вправо на «n» делит число на 2^n, а сдвиг влево умножает число на 2^n.
У меня была лаборатория, которая должна была состояться на прошлой неделе, а третья ее часть - предоставить программу, которая будет принимать пользовательский ввод, распечатать двоичную версию и затем шестнадцатеричную версию. , тогда программа должна была распечатать определенные биты в центр строки, а также ее двоичную и шестнадцатеричную версию.
Мои первоначальные мысли заключались в том, чтобы взять строку, а она с 0x01, напечатать результирующие «1» или «0», а затем сдвинуть бит справа на «1». Это содержалось в цикле и продолжалось до тех пор, пока мой счетчик не выполнил требование «32» и не выполнил его. Но я очень смущен, почему он печатает все «0». Я попробовал другие варианты, такие как:
сдвига пользовательского ввода влево на 31, а затем сделать петлю для каждого бита, но внутри цикла он смещается вправо (чтобы на обратном порядке бит) - не удался - все нули снова
делать противоположную сверху - не удались еще раз, все нули
Я знаю, что в моей голове, что я хочу сделать, это что-то вроде этого:
(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)
Я бы подумал, что это сработало бы. Даже если бы это привело к обратному результату, я подумал, что я все равно получил бы «1 в моей выпущенной строке, которую я бы заметил и обработал соответственно» (сдвиньте весь номер, оставшийся в $t0
, на «31», а затем выполнили приведенные выше инструкции. все '0's ...
Вот мой код. Теперь он снова поврежден благодаря моим многочисленным попыткам и изменениям. Я просто прошу помощи в понимании того, что мой подход, выделенный выше, полностью вне базы и что я могу сделать с примером кода ниже, чтобы исправить это.
Поймите, что это задание было включено, и я не завершил его из-за моего смятения. Я хочу понять это дальше. весь код, потому что я был в тупике по этой части. Я просто попрошу первую часть этого задания.
#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"
hexInput: .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
Утверждение, что пользовательский ввод равен 25 - было ли это введено как входное и входящее как строка, или оно передавалось как фактическое значение вашей функции? Если он передан как строка, вам сначала нужно сделать некоторые преобразования, чтобы получить его от строки до целого. Затем, нужна ли функции печати строка или число? Я предполагаю строку, и в этом случае вам нужно добавить '0' к вашему двоичному значению, чтобы он печатался правильно. –
'la $ a0, ($ s2)' действительно странно. 'la' должен быть как' li', но с 0x1001 как верхняя половина числа. Я удивляюсь, что это даже собрано, и нужно задаться вопросом, в чем он собрался. – harold
@MichaelDorgan Hmmm большие вопросы! Целое число - это пользовательский ввод, который я читаю как «li $ v0, 5' в моем коде. В строке 3 моей «петли» я печатаю целочисленное значение. Я думал, это сработало бы? – Pwrcdr87