Консультация № 67902
20.12.2006, 21:59
0.00 руб.
0 2 2
Здравствуйте ! У меня есть два com файла скомпилированные (без ключей) в TASM. Я хочу написать программу , которая склеивает два файла. Тоесть получается файл размером в два предыдущих. Сначала выполняется первый com файл, а за ним сразу второй. Возможно ли это осуществить ? Я пробовал просто дописать код второго файла в конец первого, но при запуске выполняется только первый файл.

Обсуждение

давно
Советник
419
1011
20.12.2006, 22:37
общий
это ответ
Здравствуйте, Whiteman!

Смещения нужно учитывать. И или ассемблировать вторую программу так, что размер первой программы учитывается, или ассемблировать так вторую, что смещения универсальные или относительные.
Неизвестный
22.12.2006, 02:24
общий
это ответ
Здравствуйте, Whiteman!
В принципе возможно, но:
1. В одной программе может быть несколько точек выхода, т.е. передаёте управление первому файлу, а он выполняет int 20h /fn 00h int21h /fn 4ch int 21h /sp=0fffeh ret
Решение:перехватывать соответствующие прерывания.
2. Смещения в .com рассчитываются исходя из того, что адрес загрузки-CS:100h
Решение:после выполнения перевой программы записать поверх неё вторую и передать ей управление.
Предлагаю сразу после первой программы поместить вторую, просле второй-наш код. А первые байты первой программы(естественно, предварительно сохранив их) заменяем на jmp на наш код. Там перехватываем прерывания, восстанавливаем байты и jmp на код первой проги. Когда она завершится управление перейдёт к нашему обработчику(его также помещаем в конце, после двух программ), он копирует код второй программы на место первой(CS:100h), восстанавливает векторы прерываний и передает управление на CS:100h.
Не забывайте про суммарный размер-64kb, а также про стек, что рестет снизу, и может затереть наш код.
Как видете, не всё так просто, как кажется на первый взгляд.
План действий я наметил, дальше, надеюсь, справитесь.
С уважением, IceW0|f.
Форма ответа