немного маскировки / сдвига в языке ассемблера mips? - PullRequest
0 голосов
/ 05 марта 2020

Требования программы размещены в приведенном ниже коде вместе с моим решением. Может кто-нибудь сказать мне, что я делаю неправильно, и показать мне, как я могу это исправить? Я получаю 0 в качестве результата для каждого введенного мной ввода. По большей части я считаю, что я неправильно маскирую, а не смещаю биты неправильно.

    ##########################################################################

############################
# prompt user to enter an integer, read the integer, and display a 0 if the bits at the
# 16 and 256 place value positions of the integer are both 1 and display a 1 otherwise
############################ data segment ################################
            .data
outputLegend1:      .asciiz "0 = both bits at 16 & 256 place value positions are 1\n"
outputLegend2:      .asciiz "1 = bits at 16 & 256 place value positions NOT both 1\n\n"
inputPrompt:        .asciiz "Enter integer: "
outputLabel:        .asciiz "Integer entered is of type "
############################ code segment ################################
            .text
            .globl main
main:
            li $v0, 4
            la $a0, outputLegend1        
            syscall         # print output legend part 1
            la $a0, outputLegend2        
            syscall         # print output legend part 2
            la $a0, inputPrompt        
            syscall         # print integer prompt
            li $v0, 5
            syscall         # read integer
            move $t0, $v0       # save integer read in $t0
            li $v0, 4
            la $a0, outputLabel        
            syscall         # print output label

            li $v0, 1

            ##########################################################
            # Insert NO MORE THAN 6 lines of code that involve ONLY 
            #   bit manipulating instructions (ANDing, ORing, XORing,
            #   NORing and shifting - only whatever that are needed)
            # so that the program will work just like the sample runs 
            # shown at the bottom (some blank lines edited out).








#my solution


            sll $t1,$t1,4
            andi $t2,$t1,1
            sll $t2,$t2,4
            andi $t3,$t2,1
            xor $a0, $t2,$t3






            syscall         # display desired output

                    ##########################################################

            li $v0, 10      # exit gracefully
                    syscall

########################## sample test runs ##############################
# 0 = both bits at 16 & 256 place value positions are 1
# 1 = bits at 16 & 256 place value positions NOT both 1
# 
# Enter integer: 0
# Integer entered is of type 1
# -- program is finished running --
# 
# Reset: reset completed.
# 
# 0 = both bits at 16 & 256 place value positions are 1
# 1 = bits at 16 & 256 place value positions NOT both 1
# 
# Enter integer: 16
# Integer entered is of type 1
# -- program is finished running --
# 
# Reset: reset completed.
# 
# 0 = both bits at 16 & 256 place value positions are 1
# 1 = bits at 16 & 256 place value positions NOT both 1
# 
# Enter integer: 256
# Integer entered is of type 1
# -- program is finished running --
# 
# Reset: reset completed.
# 
# 0 = both bits at 16 & 256 place value positions are 1
# 1 = bits at 16 & 256 place value positions NOT both 1
# 
# Enter integer: 272
# Integer entered is of type 0
# -- program is finished running --
# 
# Reset: reset completed.
# 
# 0 = both bits at 16 & 256 place value positions are 1
# 1 = bits at 16 & 256 place value positions NOT both 1
# 
# Enter integer: 12349876
# Integer entered is of type 0
# -- program is finished running --
# 
# Reset: reset completed.
# 
# 0 = both bits at 16 & 256 place value positions are 1
# 1 = bits at 16 & 256 place value positions NOT both 1
# 
# Enter integer: 12346789
# Integer entered is of type 1
# -- program is finished running --
# 
######################## end sample test runs ############################

1 Ответ

0 голосов
/ 05 марта 2020

У вас правильная идея (но много опечаток), так что продолжайте!


Нет ничего интересного в $t1, когда вы впервые меняете его. Я думаю, что вы изначально хотели сместить $t0, но на $t1, чтобы у вас все еще оставалось исходное значение пользовательского ввода для более поздней операции.


Следите за использованием регистра:

  • вам нужно источник регистров, которые target редактировались ранее в вашей программе,
  • вам нужно использовать новый / другой регистр для цели, если вам понадобится какое-то оригинальное / полученное значение позже (не стирайте значения, которые вам все еще нужны),
  • вы не можете просто получить новые регистры, когда вам нужны старые / оригинальные значения

Используйте один шаг, чтобы убедиться, что вы получаете промежуточные значения, которые вы ожидаете после каждой инструкции. Если нет, то проверьте, является ли инструкция источником правильных регистров, или, возможно, исходный регистр был удален более ранней инструкцией!


Кроме того, вы сдвигаетесь влево, когда вы хотите сдвинуть правильно ...


Вы просто догадаетесь, какой регистр использовать, когда. Итак, вот подход, который может помочь вам избежать путаницы из-за незнакомой сборки.

Попробуйте написать свой код в C , используя Трехадресный код - для этого задания не потребуется много, около 5 строк! Но это поможет вам понять, какую переменную использовать, когда. (Убедитесь, что ваш C трехадресный код работает - протестируйте и отладьте его где-нибудь, при необходимости включите C компилятор.)

Далее назначьте (создайте карту) все эти C ( TA C) переменные в регистры MIPS - прежде чем писать какие-либо инструкции.

Наконец, напишите инструкции по сборке, которые относятся к / mimi c этим трем адресным кодам, используя вашу карту переменных для регистров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...