Юный техник - для умелых рук 1989-07, страница 13

Юный техник - для умелых рук 1989-07, страница 13

LDAX D SBB В STAX D INX D LDA DEL+2 MOV C,A LDA DEL+3

восстановлено исходное значение регистров DE ;если перенос установлен, значит ;делитель стал больше делимого •.запомнено состояние переноса ; подсчет числа вычитаний делителя ;из делимого ; HL —адрес результата DELI: INR М

JNZ R3 1NX Н

INR М

JNZ R2

INX Н

INR М

DCX Н

R2: DCX Н

R3: POP PSW

JMP R1 ВОССТАНОВЛЕНИЕ ОСТАТКА KD: LDA DEL

MOV С,А LDA DEL+1 MOV В,А LDAX D ADD С STAX D INX D LDAX D ADC В STAX D INX D LDA DEL+2 MOV C,A LDA DEL+3 MOV B,A LDAX D ADC С STAX D INX D LDAX D ADC В STAX D DCX D DCX D

DCX D ;DE — адрес остатка RET

ПРЕОБРАЗОВАНИЕ ЧИСЕЛ

Люди привыкли работать с десятичными числами, а вычислительные машины работают только с двоичными, поэтому, если требуется отображать результаты работы ЭВМ в десятичном виде или преобразовывать вводимые десятичные числа в

двоичный формат, необходимы специальные программы.

В вычислительной технике есть понятие двоично-десятичного числа. Двоично-десятичным числом называется число, в котором каждые четыре бита представляют десятичную цифру от 0 до 9. Например, двоичное число 00001111 в двоично-десятичном виде будет 00010101.

Суть описываемой программы преобразования двоичного числа в двоично-десятичное заключается в том, что двоичное число, которое в обычном виде выглядит так: двоичное число:

бит7-27+бит6-26+бит5-25+бит4-24+ битЗ-23+бит2-22+бит1-2'+бит0-2° преобразуется к виду: десятичное число:

((((((бит7-2+бит6)-2+бит5)-2+бит4)-2+ битЗ)-2+бит2)-2+бит1)-2+битО.

ПРЕОБРАЗОВАНИЕ ДВОИЧНОГО ЧИСЛА ;В ДВОИЧНО-ДЕСЯТИЧНОЕ

;BCD2B - программа перевода двухбайтного ;двоичного числа в двоично-десятич-;ное. Двоичное число передается ;в регистрах HL, результат работы: ;А —десятки тысяч, ;В — тысячи и сотни, ;С - десятки и единицы. ;BCD1B —программа перевода однобайтного ;числа в двоично-десятичный код. ;Двоичное число записывается ;в регис тр Н, регистр L сбрасывается. ;Результат работы: ;А—разряды сотен, ;В —разряды десятков и единиц. BCD2B: MVI Е,17 установка счетчика ;первого цикла CALL CONV вычисление младшего двоично-десятичного байта MOV С,А вычисленный результат сохранен MVI ЕД7 -установка счетчика ;второго цикла

JMP PROD BCD1B: MVI Е,9 установка счетчика ;для программы ;BCD1B

CALL CONV вычисление двух

;старших байтов MOV В,А ;запомнен промежуточный двоично-десятичный результат MOV A,L ;установкастаршего ;двоично-десятич-;ного байта

RET

CONV: XRA А ;сброс регистра А ;в нуль

SBIT DCR Е уменьшение на 1 ;счетчика ;числа циклов

RZ

DAD Н ;сдвиг старших разрядов в перенос

ADC А

DAA ;двоично-десятич-

;ная коррекция JNC SBIT двоично-десятичный байт больше ;99?

INX Н ;да JMP SBIT

Обратите внимание, как в строке с меткой CONV: устанавливается в нуль регистр А. Операция ИСКЛЮЧАЮЩЕЕ ИЛИ аккумулятора с самим собой обнулит его, а также сбросит и бит переноса.

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

ходимо преобразовать однобайтное или двухбайтное десятичное число в двоичное? Это не сложно. Для этого надо выделить биты, определяющие десятки тысяч, и умножить их на 10000, затем выделить биты, определяющие тысячи, и умножить на 1000, выделить сотни и умножить на 100, выделить десятки и умножить на 10, и, наконец, выделить единицы. Сложение всех этих чисел даст нужный результат.

Все эти действия выполняет следующая программа.

;вход в программу: ;А — десятки тысяч, ;В —тысячи и сотни, ;С —десятки и единицы, результат работы: ;HL —двоичное число. DVH: LXI D.10000

CALL UMNOG

PUSH

H

;обрабоганы десят

ки тысяч и сохране

ны в стеке

MOV

А,В

разряды тысяч за

нимают четыре

;старших бита

RAR

е

RAR

RAR

RAR

разряды тысяч в

;младших битах

AN1

0FH

;выделены разряды

:тысяч

LXI

D,1000

CALL

UMNOG обработаны раз-

ряды тысяч

POP

D

;DE — предыдущий

результат

DAD

D

PUSH

H

MOV

А,В

ANI

OFH

;выделены разряды

;сотен

LXI

D.100

CALL

UMNOG

POP

D

DAD

D

PUSH

H

MOV

А,С

RAR

RAR

RAR

RAR

AHI

OFH

;выделены разряды

;десягков

LXI

D,10

CALL

UMNOG

POP

D

DAD

D

MOV

А,С

ANI

OFH

;выделены разряды

;единиц

MOV

E,A

MVI

D,0

DAD

D

;HL — исходное чис-

;ло в двоичном виде

RET

ЗАКЛЮЧЕНИЕ

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

М. Иванюшин

MOV В,А LDAX D SBB С STAX D INX D LDAX D SBB В STAX D DCX D DCX D DCX D

PUSH PSW

;если установлен ;признак равенства ;нулю, значит, в ре- ! ;зультате выполнения команды ;INR М

;возник перенос и ,его надо учесть ;увеличен на едини-;цу следующий байт результата

;восстановление исходного значения регистров HL восстановлен текущий перенос ;для правильного выполнения сложения в цикле R1

13