Алгоритм сборки

Это мой алгоритм, чтобы продолжать делить число на 2, пока частное не достигнет 0, он остановится, но мне нужно напечатать остатки, чтобы оно было в двоичном формате, и я попытался в своем коде ниже. Но когда я запускаю его, он ничего не печатает.

 a = userInput/2
 if (a doesNotEqual 0)
 {
  while(quotient doesNotEqual 0)
  { 
    quotient=a/2
    a = quotient
   }
 }

!!!!!!

.section ".data"

prompt: .asciz "\nEnter a number: "
format: .asciz "%d"


prompt2: .asciz "\nPlease choose one of the following options: \n 1. Print the number in binary seperating each 4 bits with a space. \n"
prompt3: .asciz " 2. blahblahblahblahblahblahblahblahblahblahblahblah. \n 3. blahblahbalhblahblahbla. \n"
prompt4: .asciz " 4. blahblahblahblahblahblahblahb \n 5. Enter in a new number \n 6. Quit the program\n\n"
format2: .asciz "%d"


string: .asciz "\nYou entered option: %d\n"

string1: .asciz "%d"




define(a,l0)
define(quotient, l1)
define(remainder, l2)


!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.align 4
input: .word 0
input2: .word 0


.align 4
.section ".text"
.global main
main:
save %sp, -96, %sp


clr   %a
clr   %quotient

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
set   prompt, %o0
call  printf
nop
set   format, %o0
set   input, %o1
call  scanf
nop
ld   [%o1], %g1                  ! g1 = userInput #


set   prompt2, %o0               ! menu
call  printf
nop
set   prompt3, %o0
call  printf
nop
set   prompt4, %o0
call  printf
nop
                                 ! menu
set   format2, %o0
set   input2, %o1
call  scanf
nop
set  input2, %o1
ld   [%o1], %g2                 ! g2 = option selected
set  string, %o0
mov  %g2, %o1
call printf
nop                             ! this is a check to see that g2 is indeed the option selected

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!problem somewhere below
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

mov   %g1, %o0
call  .div
mov   2, %o1
mov   %o0, %a                      ! a = input #/2
cmp   %a, 0                        ! if (a doesNotEqual 0)
be    done

test:

cmp   %quotient, 0                ! while(quotient doesNotEqual 0)
be    done1
nop
mov   %a, %o0
call  .div
mov   2, %o1                      
mov   %o0, %quotient              ! quotient = a/2


mov   %a, %o0
call  .rem
mov   2, %o1
mov   %o0, %remainder
set   string1, %o0
mov   %remainder, %o1
call  printf
nop

mov   %quotient, %a               ! a = quotient

ba    test
nop

done:
done1:

ret
restore

person Selena Gomez    schedule 22.03.2014    source источник
comment
Это похоже на SPARC для меня? На какой платформе вы работаете, пробовали ли вы использовать gdb для отладки своего кода? Вы также можете изучить аргументы функций Вы звоните сюда.   -  person Jens    schedule 23.03.2014


Ответы (1)


Поскольку вы чередуете nl между input и input2, последние больше не будут выровнены, отсюда и ошибка шины. Между прочим, я видел, как вы делали это nl несколько раз, и, кажется, я уже говорил вам, что в этом нет никакого смысла. scanf не использует третий параметр, потому что строка формата имеет только один спецификатор поля, и даже если бы он был, это не было бы новой строкой.

У вас могут быть и другие проблемы, это просто первое, что я заметил. Научитесь пользоваться отладчиком.

person Jester    schedule 22.03.2014
comment
Я пытаюсь преобразовать userInput # в двоичный файл. Из приведенного выше кода он запрашивает userInput #, затем печатает меню, пользователь выбирает параметр, он печатает параметр, и он должен преобразовать десятичное число в двоичное сразу после независимо от того, какой вариант вы выберете (сначала получите правильный алгоритм) . Так, например, userInput = 9. Продолжайте делить на 2, пока частное = 0, а остатки от последнего до первого будут двоичным числом. 9/2=4 с остатком 1. 4/2=2 с остатком 0. 2/2=1 с остатком 0. 1/2=0 с остатком 1 Таким образом, двоичное число для 9 - это остатки от последнего к первому, поэтому 1001. - person Selena Gomez; 23.03.2014