В следующем примере программы мы выполним конвертацию BCD числа в его эквивалент двоичного числа.
1; Автор: Довгополов Евгений Сергеевич 2 3number:db24h 4result:db00h 5 6main: 7lxisp,0100h; Инициализируем указатель стека по адресу 0100h 8 9lxih,number; Загружаем адрес переменной number в пару регистров HL 10lxid,result; Загружаем адрес переменной result в пару регистров DE 11 12mova,m; Копируем значение в памяти на которую указывает пара регистров HL в A 13callcvt8b_v; Вызываем процедуру cvt8b_v. Результат в A 14staxd; Сохраняем значение в A по адресу в памяти на которую указывает DE 15 16hlt; Останавливаем выполнение программы 17 18cvt8b_v:; Процедура cvt8b_v 19pushh; Кладем значение пары регистров HL на вершину стека 20pushd; Кладем значение пары регистров DE на вершину стека 21 22ani0Fh; Отделяем первый полубайт (LSB) 23movc,a; Сохраняем значение регистра A в регистр C 24mova,m; Копируем значение в памяти на которую указывает пара регистров HL в A 25ani0F0h; Отделяем второй полубайт (MSB) 26 27rrc; Поворачиваем значение в регистре A на 1 вправо без учёта флага CY 28rrc; Поворачиваем значение в регистре A на 1 вправо без учёта флага CY 29rrc; Поворачиваем значение в регистре A на 1 вправо без учёта флага CY 30rrc; Поворачиваем значение в регистре A на 1 вправо без учёта флага CY 31 32movd,a; Сохраняем второй полубайт (MSB) в регистр D 33xraa; Обнуляем регистр A 34mvie,0Ah; Устанавливаем счётчик цикла E равным 10 35 36SumLoop: 37addd; Складывам второй полубайт (MSB) 10 раз. A + D 38dcre; Уменьшаем значение регистра-счётчика E на 1 39jnzSumLoop; Выполняем переход на метку SumLoop пока E не будет равен 0 40 41addc; Прибавляем первый полубайт (LSB) ко второму полубайту (MSB) 42 43popd; Выталкиваем значение из стека в пару регистров DE 44poph; Выталкиваем значение из стека в пару регистров HL 45ret; Возврат из процедуры обратно к месту вызова