РЕЗЕРВИРОВАНИЕ СЛОВ, МНЕМОНИКА И Т.Д.
Список резервных инструкции внутри GENS4. Эти символы не могут
использоваться как метки, хотя они могут быть частью меток. Все резервные
инструкции состоят из заглавных букв:
A |
B |
С |
D |
E |
H |
L |
I |
R |
S, |
AF |
AF' |
ВС |
DE |
HL |
IX |
|
|
|
|
IY |
SP |
NC |
Z |
NZ |
M |
|
|
|
|
P |
PE |
PO |
|
|
|
|
|
|
|
Ниже приводится список мнемоники Z80, директив ассемблера и его команд.
Они также должны состоять из заглавных букв.
ADC |
ADD |
AND |
BIT |
CALL |
CCF |
СР |
CPD |
CPDR |
SPI |
CPIR |
CPL |
DAA |
DEC |
Dl |
DJNZ |
EI |
EX |
EXX |
HALT |
IM |
IN |
INC |
IND |
INDR |
INI |
INIR |
JP |
JR |
LD |
LDD |
LDDR |
LDI |
LDIR |
NEG |
NOP |
OR |
OUTDR |
OTIR |
OUT |
OUTD |
OUTI |
POP |
PUSH |
RES |
RET |
RETI |
RETN |
PL |
RRA |
RLC |
RLCA |
RLD |
RR |
RLA |
RRC |
RRCA |
RRD |
RST |
SBC |
SCF |
SET |
SLA |
SRA |
SRL |
DEFB |
DEFM |
DEFS |
DEFW |
ELSE |
END |
ENT |
EQU |
IF |
ORG |
ЫАС |
ENDM |
|
|
|
*D |
*E |
*H |
*L |
*S |
*C |
*F |
*M, |
|
|
РАБОЧИЙ ПРИМЕР
Ниже приводится пример типичного сеанса работы с использованием GENS4.
Если вы новичок по части использования ассемблерных программ или вы немного
не уверены в том, как использовать ассемблер/редактор GENS4, то мы
настоятельно советуем вам тщательно проработать этот пример. Лишний раз
заметим, что <ENTER> означает, что вы должны нажать клавишу "ENTER" на
клавиатуре.
Цель примера:
Написать и проверить программу целочисленного умножения, текст которой
' V II •—I—1II
должен быть сохранен на магнитной ленте, используя команду редактора "Т" так,
чтобы легко было включать ее в состав будущих программ с магнитной ленты.
ПОСЛЕДОВАТЕЛЬНОСТЬ РАБОТЫ:
1 — напишите программу умножения как подпрограмму и запишите ее на
ленту, используя команду редактора "Р", чтобы ее можно было легко восстановить
во время сеанса при наличии ошибок.
2 — отладьте подпрограмму умножения, редактируя ее, если это необходимо.
Зи «—I—I II
— запишите отлаженную программу на ленту, используя команду Т так,
чтобы эта подпрограмма могла быть помещена с ленты в другие программы. Перед
стартом мы должны загрузить GENS4 в компьютер — делайте так:
LOAD "" CODE 2 6000 <ENTER>
Чтобы загрузить ассемблер с адреса 26000. Затем введите:
RANDOMIZE USR 2 6000 <ENTER>
Сейчас вы находитесь в режиме редактирования, т.е. компьютер готов для
создания программ на ассемблере.
1-я стадия: запись программы целочисленного умножения.
Мы используем команду редактора I, чтобы ввести текст, используя <^>
(символ табуляции) для получения табулированного листинга.
Ниже мы не указываем, где используется табуляция. Но вы можете
предположить, что табуляция используется между мнемоникой команды и между
мнемоникой и операндом. Заметим, что адреса, показанные в ассемблерном
листинге примера, который следует, могут не соответствовать полученным в вашем
компьютере, они служат только для иллюстрации:
>I10,10 <ENTER>
10 ;А FAST INTEGER MULTIPLY <ENTER>
2 0 ;ROUTINE>MULTIPLIES HL <ENTER>
3 0 ;BY DE.RETURN THE RESULT <ENTER>
4 0 ;IN HL.C FLAG SET ON AN <ENTER>
5 0 ;OVERFLOW. <ENTER>
6 0 ;<ENTER>
7 0 ORG #7F0 0 <ENTER>
8 0 <ENTER>
9 0 MULT OR A <ENTER>
10 0 SBC HL,DE;HL>DE? <ENTER>
110 ADD HL,DE <ENTER>
12 0 JR NC,MU1;YES <ENTER>
13 0 EX DE,HL <ENTER>
14 0 MU1 OR D <ENTER>
15 0 SCF; OVERFLOW IT <ENTER>
160 RET NZ;DE>255 <ENTER>
17 0 OR E; TIMES 0? <ENTER>
18 0 LD E,D <ENTER>
19 0 JR NZ,MV4;NO <ENTER>
2 00 EX DE,HL;0 <ENTER>
210 RET <ENTER>
220 <ENTER>
23 0 ;MAIN ROUTINE <ENTER>
240 <ENTER>
2 50 MU2 EX DE,HL <ENTER>
2 60 ADD HL,DE <ENTER>
27 0 EX DE,HL <ENTER>
2 80 MU3 ADD HL,HL <ENTER>
290 RET C;OVERFLOW <ENTER>
3 00 MU4 RRA <ENTER>
310 JR NC,MU3 <ENTER>
320 OR A <ENTER>
33 0 JR NZ,MU2 <ENTER>
340 ADD HL,DE <ENTER>
350 RET <ENTER>
360 <EDIT>
Вышеприведенные команды создадут текст программы. Сохраним ее на ленте,
используя:
>P10,350,MULT <ENTER>
Помните, что вы должны включить свой магнитофон в режим записи перед
использованием команды "Р".
2-я стадия: отладка программы.
Сначала убедитесь в правильном ассемблировании исходного текста. Мы
будем использовать ключ 2, чтобы не производить листинг и объектный код.
>А2 <ENTER>
*HISOFT GENS4 ASSEMBLER*
COPYRIGHT HISOFT 1983,84,87
ALL RIGHT RESERVED
PASS1 ERROR:00
PASS2 ERROR:00
*WARNING* MV4 ABSENT TABLE USED: 74 FROM 161
>
Мы видим из этой трансляции, что сделали ошибку в строке 190, набрав MV4
вместо MU4, которая является меткой, на которую мы желаем перейти.
Редактируем строку 190:
>F190,190,MV4,MU4 <ENTER>
19 0 JR NZ, (сейчас используйте подкоманду "S")
Теперь ассемблируйте текст вновь. Он должен ассемблироваться без ошибок.
Мы должны написать некоторый текст для проверки подпрограммы:
> N3 00,10 <ENTER>
(перенумеруем для того, чтобы мы могли написать больше текста)
>I10,10 <ENTER>
10 ;SOME CODE TO TEST <ENTER>
2 0 ;THE MULT ROUTIME <ENTER>
30 <ENTER>
4 0 LD HL,5 0 <ENTER>
5 0 LD DE,2 0 <ENTER>
60 CALL MULT; MULTIPLY <ENTER>
7 0 LD A,H;O/P RESULT <ENTER>
80 CALL AOUT <ENTER>
9 0 LD A,L <ENTER>
100 CALL AOUT <ENTER>
110 RET; RETURN TO EDITOR <ENTER>
12 0 <ENTER>
13 0 ; ROUTINE TO O/P A IN HEX <ENTER>
140 <ENTER>
150 AOUT PUSH AF <ENTER>
160 RRCA <ENTER>
17 0 RRCA <ENTER>
180 RRCA <ENTER>
190 RECA <ENTER>
200 CALL NIBBLE <ENTER>
210 POP AF <ENTER>
22 0 NIBBLE AND %1111 <ENTER>
230 ADD A,#90 <ENTER>
240 DAA <ENTER>
250 ADC A,#40 <ENTER>
260 DAA <ENTER>
27 0 LD IY,5C3A;FOR ROM <ENTER>
2 80 RST #10;ROM CALL <ENTER>
290 RET <ENTER>
300 <ENTER>
>
Теперь ассемблируйте текстовую программу совместно программой MULT:
>А2 <ENTER>
*HISOFT GENS4 ASSEMBLER*
COPYRING HISOFT 1983,84,87
ALL RIGHT RESERVED
7EAC 19 0 RECA
*ERROR* 02 (нажмите любую клавишу для продолжения)
PASS 1 ERROR: 01
TABLE USED: 88 FROM 210
B нашей программе есть ошибка: вместо RECA в строке 190 должно быть RRCA.
Делаем:
>Е190
190 RECA
19 0 один пробел, C,R<ENTER>,<ENTER>
>
Теперь проассемблируйте вновь, используя ключи по умолчанию (только A
<ENTER>), и текст должен проассемблироваться правильно.
Мы уже в состоянии проверить работу нашей программы MULT,
следовательно, нам нужно сообщить редактору, откуда он может выполнить код.
Мы делаем это директивой "ENT":
>3 5 ENT S <ENTER>
Теперь вновь проассемблируем текст, и трансляция должна завершиться
правильно с сообщениями:
TABLE USED: 88 FROM 211
EXECUTES:32416
>
Или подобными этим. Теперь можно запустить наш код на выполнение,
используя команду редактора "R". Помножив 50 на 20 мы должны получить 1000,
что равно ЗЕ8 в шестнадцатиричном коде:
> R <ENTER>
0032>
Не работает! Почему не работает? Распечатайте строки с 380 по 500 (L380,500).
Вы увидите, что в строке 430 находится инструкция OR D, за которой следует RET
NZ. Все, что она делает
— это логическую операцию "или" между регистром D и аккумулятором А и
возвращает установленный флаг ошибки (с-флаг), если результат не равен 0.
Целью этого действия является возможность убедиться, что DE<256 и,
следовательно, что операция умножения не вызвала переполнения — это делается
проверкой того, что в регистре D находится 0. Но "или" будет работать правильно
только в том случае, когда в аккумуляторе изначально находится 0, а у нас нет
гарантий, что это будет так. Мы должны убедиться, что А = 0 перед выполнением
OR D, в противном случае мы получим переполнение со старшими разрядами в
качестве результата. Для проверки кода OR А в строке 380 можно изменить на XOR
А, которая установит флаг для SBC HL.DE инструкции и установит А = 0.
Следовательно:
>Е3 8 0 <ENTER>
380 MULT OR A <ENTER>
3 80^I (вход в режим вставки) X
<ENTER><ENTER>
>
Теперь вновь проассемблируйте и запустите код, используя R. Теперь ответ
должен быть правильным: ЗЕ8.
Мы можем проверять программу дальше, отредактировав строки 40 и 50, чтобы
перемножать различные числа. Ассемблируя и запуская вы увидите, что программа
работает. Теперь, закончив программу, мы можем сохранить ее на магнитной ленте
в формате "INCLUD":
>Т3 00,999, MULT <ENTER>
Не забудьте включить магнитофон в режим записи перед нажатием <ENTER>.
Если вы хотите сохранить программу на дискете, то не нужно использовать
программу "Т". Программа, сохраненная обычной командой "Р", может быть
запущена с дисковода.
Однажды запущенная подобным образом подпрограмма может быть вставлена
в программу как показано ниже:
500 RET
510
52 0 ; INCLUD THE MULT ROUTINE HERE
(включаем здесь MULT)
530
540 *F MULT
550
560 ;THE NEXT ROUTINE (следующая постпрограмма) _
Когда вышеприведенный текст будет транслироваться, ассемблер спросит вас
"START TAPE... " когда он доберется до строки 540 во время как первого, так и
второго проходов. Следовательно, вы должны направить MULT на вывод с ленты в
обоих случаях. Для этого обычно нужно будет перемотать ленту после первого
прохода. Вы можете записать два дубля программы MULT на ленту один за другим,
и один использовать во время первого прохода, а второй — во время второго. Когда
происходит ввод с дисковода, никаких сообщений не появляется, все работает
автоматически. Пожалуйста, изучите тщательно вышеприведенный пример и
постарайтесь выполнить его самостоятельно.