
4 Разработка программы на языке ассемблера и в машинных кодах
В таблице 2 приведен текст программы на ассемблере и машинных кодах с подробными комментариями, составлены по алгоритму, разработанному нами ранее.
Таблица 2
Адрес |
Машин-ный код |
Метка |
Мнемо-ника |
Операнд |
Комментарии |
Блок начальных директив |
|||||
|
|
|
ORG |
0000H |
Директива начального адреса |
|
|
PORTX |
EQU |
01H |
Инициализация портов ввода переменных x(t), y(t), z(t) и вывода V(t) |
|
|
PORTY |
EQU |
02H |
|
|
|
PORTZ |
EQU |
04H |
|
|
|
PORTV |
EQU |
08H |
|
|
|
SAVEH |
EQU |
1000H |
Инициализация вспомогательных констант |
|
|
SAVEB |
EQU |
1002H |
|
|
|
OST |
EQU |
1003H |
|
0000 |
C3 00 01 |
|
JMP |
START |
|
|
|
|
ORG |
0100H |
Директива начального адреса программы |
0100 |
3E 00 |
START: |
MVI |
A |
Обнуление флага наличия в результате остатка 0,5 (Флаг по адресу 1003H) |
0102 |
32 03 10 |
|
STA |
OST |
|
0105 |
OE 02 |
|
MVI |
C,02H |
|
0107 |
DB 02 |
REP: |
IN |
PORTY |
Организация очереди на стеке. И заполнение ее опережающим сигналом. |
0109 |
00 |
|
NOP |
|
|
010A |
00 |
|
NOP |
|
|
010B |
00 |
|
NOP |
|
|
010C |
00 |
|
NOP |
|
|
010D |
FE 42 |
|
CPI |
4DH |
|
010F |
DA 07 01 |
|
JC |
REP |
|
0112 |
67 |
|
MOV |
H,A |
|
0113 |
E5 |
|
PUSH |
H |
|
0114 |
0D |
|
DCR |
C |
|
0115 |
C2 07 01 |
|
JNZ |
REP |
|
0118 |
0E 01 |
|
MVI |
C,01H |
|
Ввод переменной y(t) |
|||||
011A |
DB 02 |
REPP: |
IN |
PORTY |
Ввод y(t); параметр в аккумуляторе |
011C |
00 |
|
NOP |
|
Пустые операции для увеличения длительности такта ввода |
011D |
00 |
|
NOP |
|
|
011E |
00 |
|
NOP |
|
|
011F |
00 |
|
NOP |
|
|
0120 |
FE 42 |
|
CPI |
4DH |
Проверка на не превышение допустимого входного сигнала |
0122 |
F2 1A 01 |
|
JM |
REPP |
|
0125 |
67 |
|
MOV |
H,A |
Запись y(t) в очередь. |
0126 |
E5 |
|
PUSH |
H |
|
0127 |
0D |
|
DCR |
C |
|
0128 |
C2 30 01 |
|
JNZ |
SHAG |
|
012B |
31 FD FF |
|
LXI |
SP,FFFD |
|
012E |
0E 03 |
|
MVI |
C,03H |
|
Ввод переменной x(t) |
|||||
0130 |
DB 01 |
SHAG: |
IN |
PORTX |
Ввод x(t); параметр в аккумуляторе |
0132 |
00 |
|
NOP |
|
Пустые операции для увеличения длительности такта ввода |
0133 |
00 |
|
NOP |
|
|
0134 |
00 |
|
NOP |
|
|
0135 |
00 |
|
NOP |
|
|
0136 |
FE 42 |
|
CPI |
4DH |
Проверка на не превышение допустимого входного сигнала |
0138 |
F2 1A 01 |
|
JM |
REPP |
|
013B |
5F |
|
MOV |
E,A |
Сохранение x(t) в регистровой паре DE |
013C |
16 00 |
|
MVI |
D,00H |
|
Ввод переменной z(t) |
|||||
013E |
DB 04 |
|
IN |
PORTZ |
Ввод z(t); параметр в аккумуляторе |
0140 |
00 |
|
NOP |
|
Пустые операции для увеличения длительности такта ввода |
0141 |
00 |
|
NOP |
|
|
0142 |
00 |
|
NOP |
|
|
0143 |
00 |
|
NOP |
|
|
0144 |
FE 42 |
|
CPI |
4DH |
Проверка на не превышение допустимого входного сигнала |
0146 |
F2 1A 01 |
|
JM |
REPP |
|
Вычисление значения |
|||||
0149 |
EB |
|
XCHG |
|
Помещение множимого в HL |
014A |
CD 87 01 |
|
CALL |
MUL |
Вызов подпрограммы умножения
|
014D |
62 |
|
MOV |
D,H |
Помещение результата в регистровую пару DE |
014E |
6B |
|
MOV |
E,L |
|
Вычисление
значения
|
|||||
014F |
3E 07 |
|
MVI |
A,05H |
Помещение множителя 05H в аккумулятор |
0151 |
CD 87 01 |
|
CALL |
MULL |
Вызов подпрограммы умножения |
0154 |
A7 |
|
ANA |
A |
Сброс флага перенос |
0155 |
7A |
|
MOV |
A,D |
Старший
байт
|
0156 |
1F |
|
RAR |
|
Сдвиг аккумулятора без переноса, младший бит старшего байта в аккумуляторе |
0157 |
57 |
|
MOV |
D,A |
Аккумулятор в регистр H |
0158 |
7B |
|
MOV |
A,E |
Младший байт в аккумуляторе |
0159 |
1F |
|
RAR |
|
Сдвиг аккумулятора без переноса, младший бит старшего байта становится старшим битом младшего байта, младший бит младшего байта в аккумуляторе(Остаток) |
015A |
5F |
|
MOV |
E,A |
Аккумулятор в регистр L В
регистровой паре HL
|
015B |
D2 47 01 |
|
JNC |
STEP |
Проверка на наличие остатка, если есть остаток то в ОЗУ по адресу 1003H заносится 01H |
015E |
3E 01 |
|
MVI |
A,01H |
|
0160 |
32 03 10 |
|
STA |
OST |
|
0163 |
19 |
STEP: |
DAD |
D |
Вычисление
|
0164 |
EB |
|
XCHG |
|
в регистровую пару DE |
Вычисление значения |
|||||
0165 |
E1 |
|
POP |
H |
y(t) из очереди в регистровую пару HL |
0166 |
6C |
|
MOV |
L,H |
|
0167 |
26 00 |
|
MVI |
H,00H |
|
0169 |
3B |
|
DCX |
SP |
|
016A |
3B |
|
DCX |
SP |
|
016B |
3B |
|
DCX |
SP |
|
016C |
3B |
|
DCX |
SP |
|
016D |
0D |
|
DCR |
C |
|
016E |
19 |
|
DAD |
D |
в регистровой паре HL |
Вывод результата V(t) |
|||||
0170 |
3A 03 10 |
|
LDA |
OST |
Загрузка значения флага остатка из ОЗУ в аккумулятор |
0173 |
FE 01 |
|
CPI |
01H |
Проверка на наличие остатка |
0175 |
C2 7D 01 |
|
JNZ |
ASTEP |
В случае наличия остатка выполняется присвоение старшему биту результата 1 |
0178 |
1F |
|
RAR |
|
|
0179 |
7C |
|
MOV |
A,H |
|
017A |
17 |
|
RAL |
|
|
017B |
0F |
|
RRS |
|
|
017C |
67 |
|
MOV |
H,A |
|
017D |
7D |
ASTEP: |
MOV |
A,L |
Вывод младшего байта результата
|
017E |
D3 08 |
|
OUT |
PORTV |
|
0180 |
7C |
|
MOV |
A,H |
Вывод старшего байта результата
|
0181 |
D3 08 |
|
OUT |
PORTW |
|
0183 |
C3 1A 01 |
|
JMP |
REPP |
Безусловный переход к новому циклу
|
0186 |
76 |
|
HLT |
|
Остановка программы |
Подпрограмма умножения |
|||||
0187 |
EB |
MUL: |
XCHG |
|
Начало подпрограммы умножения. Сохранение регистровой пары HL в ОЗУ |
0188 |
22 00 10 |
|
SHLD |
SAVEH |
|
018B |
EB |
|
XCHG |
|
|
018C |
16 00 |
|
MVI |
D,00H |
Обнуление частичной суммы |
018E |
1E 00 |
|
MVI |
E,00H |
|
0190 |
06 08 |
|
MVI |
B,08H |
Установка счетчика циклов |
0192 |
0F |
REPT: |
RRC |
|
Сдвиг следующего разряда множителя в флаг переноса |
0193 |
D2 99 01 |
|
JNC |
ZERO |
Если следующий разряд не ноль то прибавляем к частичной сумме множимое |
0196 |
EB |
|
XCHG |
|
|
0197 |
19 |
|
DAD |
D |
|
0198 |
EB |
|
XCHG |
|
|
0199 |
29 |
ZERO: |
DAD |
H |
Удвоение регистровой пары HL |
019A |
05 |
|
DCR |
B |
Уменьшение счетчика циклов |
019B |
C2 92 01 |
|
JNZ |
REPT |
Переход если вычисления не закончены |
019E |
2A 00 10 |
|
LHLD |
SAVEH |
Загрузка значений регистровой пары HL из ОЗУ |
0201 |
EB |
|
XCHG |
|
|
0202 |
3A 02 10 |
|
LDA |
SAVEB |
Загрузка значения регистра B из ОЗУ |
0205 |
47 |
|
MOV |
B,A |
|
0206 |
C9 |
|
RET |
|
Выход из подпрограммы |
|
|
|
END |
|
Директива достижения конца программы |