Разделить 2-значное число в двоичном коде на однозначное число в двоичном - PullRequest
0 голосов
/ 21 октября 2011

У меня 47, в двоичном виде это 0010 1111. Мне нужно разделить 47, чтобы я получил 4 в двоичном 0000 0100 и 7 в двоичном 0000 0111.

Я вижу этот ответ , но мне интересно, поскольку у Intel 8085 нет инструкции div, которую я должен делить, выполняя последовательные вычитания, как мне получить модуль при этом?

Ответы [ 3 ]

3 голосов
/ 21 октября 2011

Если ваш процессор не имеет инструкции деления (или инструкции преобразования BCD, что было бы иначе), вам просто нужно будет выполнить повторное вычитание.Псевдокод для этого будет выглядеть примерно так:

    val = 47

    units = val
    tens = 0
loop:
    if units < 10 goto done
    units = units - 10
    tens = tens + 1
    goto loop
done:
    ;; tens = 4, units = 7.

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

Модуль Тхо - это то, что осталось в переменной units, когда оно опустится ниже десяти.

Для полноты (и, возможно, дополнительных отметок)если это домашнее задание, подтолкнуть, подмигнуть, подмигнуть), поскольку один октет может обрабатывать до 255:

    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:
    ;; hundreds = 2, tens = 4, units = 7.

В качестве доказательства того, что этот метод работает, вы можете попробовать следующий код Python:

val = 47

units = val
tens = 0
while units >= 10:
    units = units - 10
    tens = tens + 1

print "Tens = %d, Units = %d"%(tens,units)

, который действительно выводит:

Tens = 4, Units = 7

С точки зрения использования этих значений для управления светодиодным устройством, простая таблица поиска, вероятно,простой.Создайте массив значений, которые необходимо записать в два 8-разрядных адреса памяти, а затем используйте цифру для поиска этих значений для записи на устройство.

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

    a
   ---
f |   | b
   -g-
e |   | c
   ---     . h
    d

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

Значения для различных цифр (без десятичной точки) являются (не проверенными, поэтому может потребоваться некоторая подстройка):

   abcdefgh
0  11111100
1  01100000
2  11011010
3  11110010
4  01100110
5  10110110
6  10111110
7  11100000
8  11111110
9  11110110

Учитывая значение четыре, вы просто посмотрите байтсо смещением 4 в этой таблице (используя простое добавление базового адреса таблицы и значения), затем извлеките этот байт из памяти и используйте его для установки сегментов светодиода.Это значение 01100110 будет устанавливать сегменты b, c, f и g, давая вам:

|   |
 ---
    |

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

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

0 голосов
/ 21 октября 2011

Вы в основном имеете дело с BCD представлением здесь. Существует много ресурсов по преобразованию из двоичного файла в BCD, после чего очень просто получить отдельные цифры.

Например, используйте эти инструкции для преобразования из двоичного файла в bcd, затем просто зацикливайте подадреса цифр BCD, читая каждый из них как отдельный отдельный байт. Код прост, быстр и точен.

0 голосов
/ 21 октября 2011

Решение, которое я предлагаю, заключается в том, что у вас всегда есть две шестнадцатеричные цифры (в примере вы использовали 4 и 7, но это могут быть буквы A и E).* и 7 это 0111, а не 1111, как написано

Вот подсказка, что 1 шестнадцатеричная цифра соответствует ровно 4 двоичным цифрам.Так, например, 0xA245 равно 1010 (A) 0010 (2) 0100 (4) 0101 (5).

Наконец, я предлагаю только выполнить вращение вправо на 4 бита, чтобы получить высокий клев (4).Чтобы получить 7, просто замаскируйте байт против 0 при высоком клеве (0x0F).

В C это будет примерно так: highNibble = value >> 4;lowNibble = Значение & 0x0F;

Надеюсь, я дал понять, что это поможет вам решить эту проблему.

...