Исправление ошибок програмны TASM з.о
(С) Константин Макаров,
г.Чебоксары, 1995.
Ассемблер TASM 3.0, распространяемый ИНФОРКОМом, очень удобен в работе, имеет приличный набор функций, облегчающих написание программ. Но некоторыми функциями невозможно пользоваться из-за ошибок, не выявленных тестированием. Цель этой статьи - дать возможность пользователям сделать полностью работоспособную версию, не дожидаясь сей милости от автора программы.
Теперь об ошибках. Принципиальных - две: не работает команда "Merge" и некорректно обрабатывается длина объектного кода, когда встречается команда "INCBIN". Во втором случае нормально работает команда "Run", но "Object save" выгружает на диск сгенерированную программу не полностью.
Для внесения изменений пришлось пожертвовать фрагментами текстовых сообщений, так "Merging file:" превратилось в "Merging", a "Import TASM 2.0 source file:" в просто "TASM 2.0 f i4le: " .
Ошибка "Merge" возникала из-за того, что при вызове процедуры чтения файла регистр DE - указатель длины подгружаемого текста всегда содержал 65535, что приводило к перекрытию рабочего кода, после чего программа зависала. Процедура, реализующая это, приведена в листинге 1.
Листинг 1. Первоначальный текст программы.
55311 CALL 34122 ;Печать
;сообщения.
55314 DEFB 13
55315 DEFM "Merging file"
;Признак конца. ;Ввод имени ;файла.
;Поиск файла.
55328 DEFB 0
55329 CALL 38308
55332 LD C,10 55334 CALL 34137
Эту процедуру пришлось переписать и добавить туда чтение информации о файле, что необходимо для нормальной работы программы (листинг 2).
Листинг 2.
ЧИТАТЕЛЬ - ЧИТАТЕЛЮ
55337
BIT
7,С
;Проверка:
Листинг 3.
;есть/нет.
55339
LD
A, 1
Фрагмент программы.
реализую-
55341
LD
(23823) ,A
щий увеличение счетчиков на длину
55344
RET
NZ
;Возврат,
подгружаемого файла.
;если нет.
55345
LD
HL,39221
;Начало
50953
LD
HL,(49214)
;текста.
50956
LD
(23307),HL
55348
CALL
38361
;Поиск конца.
50959
LD
DE,(23784)
;B DE -
55351
PUSH
HL
;длина файла.
55352
LD
DE,65535
;Зачем -
50963
ADD
HL,DE
;- непонятно.
50964
LD
(49214),HL
55355
LD
A,3 ;При A=3 длина
50967
LD
HL,(49221)
55357
LD
С,14 ;загрузки в DE.
50970
ADD
HL,DE
55359
CALL
34137 ;Загрузка файла.
50971
LD
(49221),HL
55362
DP
38262
50974
LD
A,(49216)
Исправленный текст программы.
|
55311 |
CALL |
34122 | |
|
55314 |
DEFB |
13 ' | |
|
55315 |
DEFM |
"Merging " | |
|
55323 |
NOP |
NOP : |
NOP |
|
55326 |
CALL |
38308 | |
|
55329 |
LD |
C,10 | |
|
55331 |
CALL |
34137 | |
|
55334 |
BIT |
7,С | |
|
55336 |
RET |
NZ | |
|
55337 |
LD |
А,С ;B |
А -номер файла. |
|
55338 |
LD |
С, 8 | |
|
55340 |
CALL |
15635 ; |
Чтение. |
|
55343 |
LD |
A, 1 | |
|
55345 |
LD |
(23823) |
, A |
|
55348 |
LD |
HL,39221 | |
|
55351 |
CALL |
38361 | |
|
55354 |
PUSH |
HL | |
|
55355 |
LD |
A,255 ; |
При A=255 длина |
|
55357 |
LD |
С, 14 ; |
загрузки берет |
|
ся из каталога. | |||
|
55359 |
CALL |
34137 ; |
Загрузка -файла. |
|
55362 |
JP |
38262 | |
Ошибка "INCBIN" связана с тем, что при подкачке файлов во время трансляции длина генерируемого объектного кода, которая хранится в ячейках 38569/38570 не увеличивалась на длину подгружаемого файла (листинг 3).
Этот дефект исправляется написанием подпрограммы, реализующей эту операцию (листинг 4).
Листинг 4.
Подпрограмма увеличения переменной, отвечающей за длину выг-
|
рузки |
объектного кода. | |
|
50974 |
CALL |
38681 ; что эквива |
|
;лентно 55065 в не | ||
|
;развернутом файле | ||
|
55065 |
LD |
HL,(38569) |
|
55068 |
ADD |
HL,DE |
|
55069 |
LD |
(38569),HL |
|
55072 |
LD |
А,(49216) ;Команда, |
|
;ранее находящаяся | ||
|
;по адресу 50974. | ||
|
55075 |
RET | |
Для внесения изменений необходимо загрузить файл "ТА§М3.0-" CODE по адресу 49152. Это начальный адрес загрузки, после которой файл разворачивается в памяти. Но мы будем работать с неразвернутым кодом, для которого и приведены адреса в листингах.
После загрузки любым монитором (очень удобно использовать STS 2 6) следует внести исправления согласно листингу 5 (на следующей странице), -после чего выгрузить на диск файл с адреса 49152 длиной 10448 байт. Лучше не оставлять 'ему прежнее имя, а назвать его "TASM3. 1" .