Приложение 2.
Резервирование слов, мнемоника и т.д.
Список резервных инструкций внутри GENS4. Эти символы не
могут использоваться как метки, хотя они могут быть частью меток.
Все резервные инструкции состоят из заглавных букв:
А ИС DY Н L I R S
AF AF" ВС DE HL IX
IY SP NC Z NZ М
Р РЕ РО
Ниже приводится список мнемоники Z80, директив ассемблера
и его команд. Они также должны состоять из заглавных букв.
ADC |
ADD |
AND |
BIT |
CALL |
CCF |
CP |
CPD |
CPDR |
SPI |
CPIR |
CPL |
DAA |
DEC |
DI |
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 |
RLC A |
RLD |
RR |
RLA |
RRC |
RRCA |
RRD |
RST |
SBC |
SCF |
SET |
SLA |
SRA |
SRL |
DEFB |
DEFM |
DEFS |
DEFW |
ELSE |
END |
ENT |
EQU |
IF |
ORG |
MAC |
ENDM |
|
|
*D |
*E |
*H |
*L |
*S |
*c |
*F |
*M |
|
|
Приложение 3.
Рабочий пример
Ниже приводится пример типичного сеанса работы с использо-
ванием GENS4. Если вы новичок по части использования ассемблер-
ных программ или вы немного не уверены в том, как использовать
ассемблер/редактор GENS4, то мы настоятельно советуем вам тща-
тельно проработать этот пример. Лишний раз заметим, что <ENTER>
означает, что вы должны нажать клавишу "ENTER" на клавиатуре.
Цель примера:
Написать и проверить программу целочисленного умножения,
текст которой должен быть сохранен на магнитной ленте, используя
команду редактора "Т" так, чтобы легко было включать ее в состав
будущих программ с магнитной ленты.
Последовательность работы:
1 - напишите программу умножения как подпрограмму и запи-
шите ее на ленту, используя команду редактора "Р", чтобы ее можно
было легко восстановить во время сеанса при наличии ошибок.
2 - отладьте подпрограмму умножения, редактируя ее, если это
необходимо.
3 - запишите отлаженную программу на ленту, используя ко-
манду "Т" так, чтобы эта подпрограмма могла быть помещена с ленты
в другие программы.
Перед стартом мы должны загрузить GENS4 в компьютер
- делайте так:
LOAD "" CODE 26000 <ENTER>
Чтобы загрузить ассемблер с адреса 26000. Затем введите:
RANDOMIZE USR 26000 <ENTER>
Сейчас вы находитесь в режиме редактирования, т.е. компьютер
готов для создания программ на ассемблере.
1-я стадия: запись программы целочисленного умножения.
Мы используем команду редактора I, чтобы ввести текст, ис-
пользуя <—> > (символ табуляции) для получения табулированного
листинга.
Ниже мы не указываем, где используется табуляция. Но вы
можете предположить, что табуляция используется между мнемони-
кой команды и между мнемоникой и операндом. Заметим, что адреса,
показанные в ассемблерном листинге примера, который следует, мо-
гут не соответствовать полученным в вашем компьютере, они служат
только для иллюстрации:
>110, 10 <ENTER>
10 ;А FAST INTEGER MULTIPLY <ENTER>
20 ;POUTINEMULTIPLIES HL <ENTER>
30 ;BY DE. RETURN THE RESULT <ENTER>
40 ;IN HL. С FLAG SET ON AN <ENTER>
50 ;OVERFLOW. <ENTER>
60 ;<ENTER>
70 ORG #7F00 <ENTER>
80 <ENTER>
90 MULT OR A <ENTER>
100 SBC HL, DE;HLDE? <ENTER>
110 ADD HL, DE <ENTER>
120 JRNC, MU1;YES <ENTER>
130 EXDE, HL <ENTER>
140 MU1 ORD <ENTER>
150 SCF;OVERFLOW IT <ENTER>
160 RET NZ; DE>255 <ENTER>
170 OR E;TIMES 0? <ENTER>
180 LD E, D <ENTER>
190 JRNZ, MV4;NO <ENTER>
200 EX DE, HL;0 <ENTER>
210 RET <ENTER>
220 <ENTER>
230 ; MAIN ROUTINE <ENTER>
240 <ENTER>
250 MU2 EX DE, HL <ENTER>
260 ADD HL, DE <ENTER>
270 EX DE, HL <ENTER>
280 MU3 ADD HL, HL <ENTER>
290 RET C; OVERFLOW <ENTER>
300 MU4 RRA <ENTER>
310 JR NC, MU3 <ENTER>
320 OR A <ENTER>
330 JR NZ, MU2 <ENTER>
340 ADD HL, DE <ENTER>
350 RET <ENTER>
360 <EDIT>
Вышеприведенные команды создадут текст программы. Сохра-
ним ее на ленте, используя:
Р10, 350, MULT <ENTER>
Помните, что вы должны включить свой магнитофон в режим
записи перед использованием команды "Р".
2-я стадия: Отладка программы.
Сначала убедитесь в правильном ассемблировании исходного
текста. Мы будем использовать ключ 2, чтобы не производить лис-
тинг и объектный код.
>А2 <ENTER>
♦HISOFT GENS4 ASSEMBLER*
COPYRIGHT HISOFT 1983, 84, 87
ALL RIGHT RESERVED
PASS1 ERROR :00
PASS2 ERROR:(X)
♦VWARNING* MV4 ABSENT TABLE USED:74 FROM 161
>
Мы видим из этой трансляции, что сделали ошибку в строке 190,
набрав MV4 вместо MU4, которая является меткой, на которую мы
желаем перейти. Редактируем строку 190:
>F190, 190, MV4, MU4 <ENTER>
190 JR NZ, (сейчас используйте подкоманду "S")
Теперь ассемблируйте текст вновь. Он должен ассемблировать-
ся бс$ ошибок. Мы должны написать некоторый текст для проверки
подпрограммы:
"" >N300, 10 <ENTER> (перенумеруем для того, чтобы мы могли
написать больше текста)
>110,10 <ENTER>
10 ;SOME CODE ТО TEST <ENTER>
20 ;THE MULT ROUTINE <ENTER>
30 <ENTER>
40 LD HL, 50 <ENTER>
50 LDDE, 20 <ENTER>
60 CALL MULT;MULTIPLY <ENTER>
70 LD A, H; O/P RESULT <ENTER>
80 CALL AOUT <ENTER>
90 LD A, L <ENTER>
100 CALL AOUT<ENTER>
110 RET; RETURN TO EDITOR <ENTER>
120 <ENTER>
130 ;ROUTINE TO O/P A IN HEX <ENTER>
140 <ENTER>
150 AOUT PUSH AF <ENTER>
160 RRCA <ENTER>
170 RRCA <ENTER>
180 RRCA <ENTER>
190 RECA<ENTER>
200 CALL NIBBLE <ENTER>
210 POP AF <ENTER>
220 NIBBLE AND % 1111 <ENTER>
230 ADD A, #90 <ENTER>
240 DAA <ENTER>
250 ADC A, #40 <ENTER>
260 DAA <ENTER>
270 LD IY, 5C3A;FOR ROM <ENTER>
280 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 190 RECA
*ERROR* 02 (нажмите любую клавишу для продолжения)
PASS 1 ERROR: 01
TABLE USED: 88 FROM 210
В нашей программе есть ошибка: вместо RECA в строке 19 дол-
жно быть RRCA. Делаем:
>Е190
190RECA
190 ->, один пробел, С, R <ENTER», <ENTER>
>
Теперь проассемблируйте вновь, используя ключи по умолча-
нию (только A <ENTER>), и текст должен проассемблироваться пра-
вильно.
Мы уже в состоянии проверить работу нашей программы MULT,
следовательно, нам нужно сообщить редактору, откуда он может
выполнить код. Мы делаем это директивой "ENT": 35 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. Все, что она делает - это логиче-
скую операцию "ИЛИ" между регистром и аккумулятором А и воз-
вращает установленный флаг ошибки (С-флаг), если результат не
равен 0. Целью этого действия является возможность убедиться, что
DE<256 и, следовательно, что операция умножения не вызвала пере-
полнения - это делается проверкой того, что в регистре D находится
0. Но "ИЛИ" будет работать правильно только в том случае, когда в
аккумуляторе изначально находится 0, а у нас нет гарантий, что это
будет так.
Мы должны убедиться, что А=0 перед выполнением OR D, в
противном случае мы получим переполнение со старшими разрядами
в качестве результата. Для проверки кода OR а в строке 380 можно
изменить на XOR А, которая установит флаг для SBC HL, DE инст-
рукции и установит А=0. Следовательно:
>Е380 <ENTER>
380 MULT OR A <ENTER>
380 -> I (вход в режим вставки) X <ENTER><ENTER>
>
Теперь вновь проассемблируйте и запустите код, используя R.
Теперь ответ должен быть правильным: ЗЕ8. Мы можем проверять
программу дальше, отредактировав строки 40 и 50, чтобы перемно-
жать различные числа. Ассемблируя и запуская, вы увидите, что
программа работает. Теперь, закончив программу, мы можем сохра-
нить ее на магнитной ленте в формате "INCLUD":
>Т300, 999, MULT <ENTER>
Не забудьте включить магнитофон в режим записи перед нажа-
тием <ENTER>.
Если вы хотите сохранить программу на дискете, то не нужно
использовать программу "Т". Программа, сохраненная обычной ко-
мандой "Р", может быть запущена с дисковода.
Однажды запущенная подобным образом подпрограмма может
быть вставлена в программу как показано ниже:
500 RET
510
520 ; INCLUD THE MULT ROUTINE HERE
(включаем здесь MULT)
530
540 *F MULT
550
560 ; THE NEXT ROUTINE (следующая подпрограмма)
Когда вышеприведенный текст будет транслироваться, ассемб-
лер спросит вас "START ТАРЕ..." Когда он доберется до строки 540
во время как первого, так и второго проходов. Следовательно, вы
должны направить MULT на вывод с ленты в обоих случаях. Для
этого обычно нужно будет перемотать ленту после первого прохода.
Вы можете записать два дубля программы MULT на ленту один за
другим, и один использовать во время первого прохода, а второй - во
время второго.
Когда происходит ввод с дисковода, никаких сообщений не по-
является, все работает автоматически.
Пожалуйста, изучите тщательно вышеприведенный пример и
постарайтесь выполнить его самостоятельно.
Следовательно, вы должны направить MULT на вывод с ленты
в обоих случаях.