MIPS使用位移运算符以二进制形式打印小数 [英] MIPS Using Bit Shift Operators to Print a Decimal in Binary

查看:124
本文介绍了MIPS使用位移运算符以二进制形式打印小数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在这里和在线其他地方,我已经阅读了许多与此主题相关的主题.有关移位的重要主题(不一定涉及汇编,但总的来说是以下主题:如何打印带有输入整数的二进制数?并做出回复者建议的更改,无论我做什么,我都会继续产生一个零字符串.

I've read numerous threads here and elsewhere online concerning this topic. Great topics regarding bit shifts (not necessarily pertaining to Assembly but the topic in general are: What are bitwise shift (bit-shift) operators and how do they work? I've gone as far as copying and pasting the code from the OP here: How do I print a binary number with an inputed integer? and making the changes that the replier had suggested and I continue to produce a string of zero's no matter what I do.

我了解移位是什么以及它是如何工作的.向右移动'n'可以将数字除以2 ^ n,向左移动可以将数字乘以2 ^ n.

I understand what bit shifting is and how it works. Shifting to the right by 'n' divides the number by 2^n and shifting left multiplies the number by 2^n.

我有一个应该在上周进行的实验,它的第三部分是提供一个程序,该程序将接受用户输入,先打印出二进制版本,然后打印出十六进制版本.完成此操作后,程序将在字符串的中心打印出某些位,并生成该字符串的二进制和十六进制版本.

I had a lab that was due this past week and the third portion of it was to provide a program that would take user input, print out the binary version of it and then the hexidecimal version. Once that was done, the program was then to print out certain bits in the center of the string and produce its binary and hexidecimal version of that as well.

我最初的想法是将字符串取为0x01,然后将结果打印为"1"或"0",然后将其右移"1".这被包含在一个循环中,并将一直持续到我的计数器满足"32"要求并完成为止.但是我对于为什么打印全0感到非常困惑.我尝试过其他版本,例如:

My original thoughts were to take the string, AND it with 0x01, print the resulting '1' or '0', and then bit shift it right by '1'. This was contained in a loop and would continue until my counter met the '32' requirement and be done with it. But I'm extremely confused as to why it prints all '0's. I've tried other versions such as:

  • 将用户输入向左移动31,然后对每个位进行循环,但在循环内它向右移动(以补偿位的反向顺序)-失败-再次为全零

  • shift the user input left by 31, then do the loop for each bit but inside the loop it was shifting to the right (to make up for the reversed order of bits) - failed - all zero's again

执行与上相反的操作-再次失败,全为零

do the opposite from above - failed again, all zero's

我知道我想做什么,就像这样:

I know in my head what I want to do it something like this:

(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 ...

I would have thought that this would have worked. Even if it produced the result backwards, I thought I would have still received '1's in my produced string that I would have noticed and dealt with accordingly (shift the entire number left in $t0 by '31' and then performed the instructions above. Still all '0's...

这是我的代码.再说一次,由于我的无数次尝试和改变,它变得腐败了.我只是在寻求帮助,以了解上面突出显示的方法是否完全偏离基础,以及我可以对下面的示例代码进行哪些操作以解决此问题.

Here is my code. Now again, it has become corrupted through my numerous attempts and changes. I'm just asking for some help in understanding if my approach highlighted above is completely off-base and what I can do to the sample code below to fix this.

了解此作业已上交,由于困惑我没有完成.我希望进一步了解这一点.我没有完成整个代码,因为我对此感到困惑.因此,我只要求这份作业的第一部分.

Understand that this assignment has been turned in and I did not complete it because of my confusion. I'm looking to understand this further. I didn't complete the entire code because I was stumped on this part. So I'll just ask for the first part of this assignment.

#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

推荐答案

此处的方法与您的基本方法有些不同.它将二进制输出和十六进制输出视为通用输出函数的参数.位掩码/位移位相似,但掩码和位宽是可变的.

Here's a method that is somewhat different from your basic approach. It treats binary output and hex output as parameters to a common output function. The bit masking/bit shifting is similar but the mask and bit width are variable.

# 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: "
binaryInput:    .asciiz "Here is the input in binary: "
nl:         .asciiz     "\n"
hexInput:   .asciiz     "Here is the input in hexadecimal: "
binaryOutput:   .asciiz "Here is the output in binary: "
hexOutput:  .asciiz     "Here is the output in hexadecimal: "
hexDigit:   .asciiz     "0123456789ABCDEF"
obuf:       .space      100
obufe:

    .text
    .globl  main
main:
    # ask end-user to submit an integer value
    li      $v0,4
    la      $a0,userInput
    syscall

    # read user-input
    li      $v0,5
    syscall
    move    $s0,$v0

    # output original in binary
    la      $a0,binaryInput
    li      $a1,32
    jal     prtbin

    # output original in hex
    la      $a0,hexInput
    li      $a1,32
    jal     prthex

    # isolate bits 12,13,14,15
    srl     $s0,$s0,12
    andi    $s0,$s0,0x0F

    # output isolated in binary
    la      $a0,binaryOutput
    li      $a1,4
    jal     prtbin

    # output isolated in hex
    la      $a0,hexOutput
    li      $a1,4
    jal     prthex

    # exit the program
    li      $v0,10
    syscall

# prtbin -- print in binary
#
# arguments:
#   a0 -- output string
#   a1 -- number of bits to output
prtbin:
    li      $a2,1                   # bit width of number base digit
    j       prtany

# prthex -- print in binary
#
# arguments:
#   a0 -- output string
#   a1 -- number of bits to output
prthex:
    li      $a2,4                   # bit width of number base digit
    j       prtany

# prtany -- print in given number base
#
# arguments:
#   a0 -- output string
#   a1 -- number of bits to output
#   a2 -- bit width of number base digit
#   s0 -- number to print
#
# registers:
#   t0 -- current digit value
#   t5 -- current remaining number value
#   t6 -- output pointer
#   t7 -- mask for digit
prtany:
    li      $t7,1
    sllv    $t7,$t7,$a2             # get mask + 1
    subu    $t7,$t7,1               # get mask for digit

    la      $t6,obufe               # point one past end of buffer
    subu    $t6,$t6,1               # point to last char in buffer
    sb      $zero,0($t6)            # store string EOS

    move    $t5,$s0                 # get number

prtany_loop:
    and     $t0,$t5,$t7             # isolate digit
    lb      $t0,hexDigit($t0)       # get ascii digit

    subu    $t6,$t6,1               # move output pointer one left
    sb      $t0,0($t6)              # store into output buffer

    srlv    $t5,$t5,$a2             # slide next number digit into lower bits
    sub     $a1,$a1,$a2             # bump down remaining bit count
    bgtz    $a1,prtany_loop         # more to do? if yes, loop

    # output string
    li      $v0,4
    syscall

    # output the number
    move    $a0,$t6                 # point to ascii digit string start
    syscall

    # output newline
    la      $a0,nl
    syscall

    jr      $ra                     # return

这篇关于MIPS使用位移运算符以二进制形式打印小数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆