Двоичный файл в BCD с использованием сборки 8051 - PullRequest
1 голос
/ 13 февраля 2020

Меня попросили преобразовать с помощью программного кода 8-битный двоичный код в 3-х разрядный код BCD. Я видел, как онлайн люди используют DIV, но я совсем не понимаю, если бы кто-то мог объяснить, почему я бы поделился на # 0AH, я бы спасибо ful

также еще один вопрос, если меня попросили вычесть 16 бит на 16 бит, используя 2 пары 8-битных регистров, нужно ли мне передать его в 2-х comp, используя CPL и +1 или просто использовать SUBB команда? R4-7 регистры

        MOV A, R5
        SUBB A, R7
        JNC L1
        DEC R4
**L1:** MOV 20H,A
        CLR C
        MOV A, R4
        SUBB A, R6
        MOV 21H,A
        END

ура!

1 Ответ

2 голосов
/ 14 февраля 2020

Вопрос 1: Зачем мне нужно DIV на # 0AH, чтобы получить BCD двоичного значения?

Чаще всего каждое целое значение в компьютере (и микроконтроллере) это компьютер) хранится в двоичном виде в наши дни. Так что тут делать особо нечего. Если вы хотите BCD (двоично-десятичный код), вам понадобятся сотни, десятки и единицы, разделенные по 4 бита каждая. Для этого вам нужно разделить на 10 (и сохранить остаток), и это может быть закодировано как #0AH. Тем не менее, я бы не писал это, а написал бы #10, который показывает намного более ясный смысл.

Предположим, что число для преобразования находится в аккумуляторе A, и вы хотите получить результат в регистровой паре R0 (MSByte) и R1 (LSByte). Вам нужно более одного регистра, потому что вы получите 3 цифры, которые будут иметь ширину 12 бит.

DIV разделит A на B и даст целое отношение в A и остаток в B.

    MOV   B,#10
    DIV   AB      ; floor(number / 10) in A, 1s in B
    MOV   R1,B    ; 1s are now in R1 (bits 3 to 0)
    MOV   B,#10
    DIV   AB      ; floor(number / 100) in A, 10s in B
    MOV   R0,A    ; 100s are now in R0 (bits 3 to 0)
    MOV   A,B     ; 10s are now in ACC (bits 3 to 0)
    SWAP  A       ; 10s are now in bits 7 to 4 in ACC
    ORL   A,R1
    MOV   R1,A    ; 10s and 1s are now in R1

Вопрос 2. Нужно ли мне передавать [answerer: negate] второй операнд по CPL и +1 или можно просто использовать SUBB?

Нет, вы просто используете SUBB. Перед первым SUBB вы сбросите флаг переноса.

Предположим, что первый операнд (для вычитания из «minuend») находится в регистровой паре R0 (MSByte) и R1 (LSByte), и второй операнд (для вычитания «вычитаемое») находится в регистровой паре R2 (MSByte) и R3 (LSByte). Результат («разница») должен go в регистровой паре R4 (MSByte) и R5 (LSByte).

    CLR   C
    MOV   A,R1
    SUBB  A,R3
    MOV   R5,A
    MOV   A,R0
    SUBB  A,R2    ; borrow bit from LSByte subtraction is taken into account
    MOV   R4,A

Конечное примечание: Пожалуйста, используйте симулятор попробовать код, если вы хотите увидеть детали, не описанные здесь.

...