Программа конвертации BCD в двоичное

В следующем примере программы мы выполним конвертацию BCD числа в его эквивалент двоичного числа.

1; Автор: Довгополов Евгений Сергеевич
2
3number: db 24h
4result: db 00h
5
6main:
7    lxi     sp, 0100h  ; Инициализируем указатель стека по адресу 0100h
8
9    lxi     h, number  ; Загружаем адрес переменной number в пару регистров HL
10    lxi     d, result  ; Загружаем адрес переменной result в пару регистров DE
11
12    mov     a, m       ; Копируем значение в памяти на которую указывает пара регистров HL в A
13    call    cvt8b_v    ; Вызываем процедуру cvt8b_v. Результат в A
14    stax    d          ; Сохраняем значение в A по адресу в памяти на которую указывает DE
15
16    hlt                ; Останавливаем выполнение программы
17
18cvt8b_v:               ; Процедура cvt8b_v
19    push    h          ; Кладем значение пары регистров HL на вершину стека
20    push    d          ; Кладем значение пары регистров DE на вершину стека
21
22    ani     0Fh        ; Отделяем первый полубайт (LSB)
23    mov     c, a       ; Сохраняем значение регистра A в регистр C
24    mov     a, m       ; Копируем значение в памяти на которую указывает пара регистров HL в A
25    ani     0F0h       ; Отделяем второй полубайт (MSB)
26
27    rrc                ; Поворачиваем значение в регистре A на 1 вправо без учёта флага CY
28    rrc                ; Поворачиваем значение в регистре A на 1 вправо без учёта флага CY
29    rrc                ; Поворачиваем значение в регистре A на 1 вправо без учёта флага CY
30    rrc                ; Поворачиваем значение в регистре A на 1 вправо без учёта флага CY
31
32    mov     d, a       ; Сохраняем второй полубайт (MSB) в регистр D
33    xra     a          ; Обнуляем регистр A
34    mvi     e, 0Ah     ; Устанавливаем счётчик цикла E равным 10
35
36SumLoop:
37    add     d          ; Складывам второй полубайт (MSB) 10 раз. A + D
38    dcr     e          ; Уменьшаем значение регистра-счётчика E на 1
39    jnz     SumLoop    ; Выполняем переход на метку SumLoop пока E не будет равен 0
40
41    add     c          ; Прибавляем первый полубайт (LSB) ко второму полубайту (MSB)
42
43    pop     d          ; Выталкиваем значение из стека в пару регистров DE
44    pop     h          ; Выталкиваем значение из стека в пару регистров HL
45    ret                ; Возврат из процедуры обратно к месту вызова
Made on
Tilda