Как напечатать числа больше 10 на языке ассемблера ARM200 - PullRequest
0 голосов
/ 25 октября 2011

Мы используем ARM200 для изучения ассемблера. У меня есть часть памяти с 32 целыми числами, заполняющими ее. Мне нужно уметь распечатать эти 32 целых числа на экране. Я могу распечатать числа 0 - 9 достаточно просто, просто добавив значение ASCII числа 0 к тому, что находится в регистре, но я очень озадачен тем, как вы печатаете числа больше 9.

Print   LDR     r5, [r2]        ;load whats in that part of memory to r5.
        CMP     r5, #9      ;compare if number is greater or less then 9
       ADDLE    r0, r5, #"0"    ;add value in array to ascii value of 0 to print
       SWI  SWI_WriteC  ;Print Value    
       ADD  r6, r6, #1  ;increment counter
       ADD  r2, r2, #4  ;move portion of memory to the next int.
       CMP  r6, #32     ;check if you are done printing 32 ints
       BNE  Print       ;if not loop back up to print
       MOV  pc, r14     ;return

r0 - регистр, используемый для печати, и r2 указывает на место в памяти для всех целых чисел. r5 - это то, что я положил в память значения из памяти, а r6 используется для счетчика.
Да, я понимаю, что между каждым числом в памяти есть 4 байта, но это не имеет значения для этого проекта.

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Вы можете сделать это с помощью простого цикла, разделив ваше число на 10 и сохраняя остаток каждый раз, пока число, наконец, не станет равным 0. В итоге вы получите массив чисел от 0 до 9, который вы можете затем печатать по одному за раз. Вы должны сохранить их перед печатью, потому что каждая цифра будет в обратном порядке. например:

Number | Buffer
123    | { EMPTY }
12     | 3         (123 / 10 = 12, remainder 3)
1      | 3 2       (12 / 10 = 1, remainder 2)
0      | 3 2 1     (1 / 10 = 0, remainder 1)

Каждый раз, когда вы добавляете число в буфер, увеличивайте свой счетчик. Как только вы закончили деление и теперь ваш номер равен 0, вы можете начать печать. Цикл от count до 0, распечатка номера, хранящегося в Buffer + count.

Для буфера, если вы говорите, что каждое число может быть длиной до 4 байтов (32 бита), то вы знаете, что в десятичном виде наибольшее число, которое может быть представлено, - это либо 2147483647 (со знаком), либо 4294967295 (без знака) , В обоих случаях наибольшее количество цифр составляет 10, поэтому вы можете выделить буфер из 10 байтов (1 байт достаточно для хранения каждой цифры от 0 до 9).

Другая альтернатива (которую я сделал перед выполнением той же задачи, что и вы для другого чипа) - это использовать стек, а не выделять буфер, и помещать каждую цифру в стек на каждой итерации цикла. Оба способа довольно просты.

Я позволю вам придумать код, поскольку вы должны научиться делать это.

Редактировать: Это некоторый псевдокод общего метода, который я описал выше:

Buffer[10]

Num = 123

count = 0
// Split the number into an array of digits
WHILE Num IS NOT 0
   Buffer[count] = Num % 10 // Store the remainder
   Num = Num / 10
   count++

count-- // count will be 1 more than the amount in Buffer

// Print the digits
WHILE count IS >= 0
   PRINT Buffer[count]
   count--
1 голос
/ 25 октября 2011

Поскольку вы учитесь (то есть, можете выполнять домашнюю работу), я дам только общий совет.

Допустим, у вас есть номер 247, и вы хотите распечатать трицифры по одному.

Как вы можете получить сотню цифр 2 из 247 и оставить 47 для следующей итерации?

Поместите это значение во временную переменную и установите счетчик на ноль.Затем, пока значение температуры больше 99, вычтите из него 100 и добавьте к счетчику значение 1.

Это даст вам счетчик 2 и значение времени 47.Используйте 2 для вывода вашей цифры (вы заявляете, что уже можете это сделать).

Теперь перейдите к десяткам.

Установите счетчик на ноль.

Затем, пока значение температуры больше 9, вычтите из него значение 10 и добавьте 1 к счетчику.

Это даст вам счетчик 4 и значение времени 7.Используйте 4 для вывода вашей цифры.

Наконец, единицы.

Используйте последний остаток 7 для вывода последней цифры.


Вот некоторый псевдокод, подобный ассемблеру, который я использовал в другом ответе (слегка измененном), чтобы сделать аналогичную вещь.

    val = 247

    units = val
    tens = 0
    hundreds = 0
loop1:
    if units < 100 goto loop2
    units = units - 100
    hundreds = hundreds + 1
    goto loop1
loop2:
    if units < 10 goto done
    units = units - 10
    tens = tens + 1
    goto loop2
done:
    if hundreds > 0:                 # Don't print leading zeroes.
        output hundreds
    if hundreds > 0 or tens > 0:
        output tens
    output units
    ;; hundreds = 2, tens = 4, units = 7.

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

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