Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
11 / 11 / 0
Регистрация: 11.10.2017
Сообщений: 47

Создать оверлейный модуль

23.04.2020, 15:34. Показов 3496. Ответов 3

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!! Помогите пожалуйста разобраться. Сделал программу (.exe), который поочередно подготавливает место и вызывает оверлейные модули с помощью строки, в которой находится путь к ним. По условию "Оверлейный сегмент не является загрузочным модулем типов ".com" или ".exe". Он представляет собой кодовые сегмент, который оформляется в ассемблере как функция с точкой входа по адресу 0 и возврат осуществляется командой retf. Это необходимо сделать, потому что возврат управления должен быть осуществлен в программу, выполняющую оверлейный сегмент. Если использовать функции выхода 4Ch прерывания int 21h, то программа закончит свою работу."
Объясните пожалуйста какое расширение они должны иметь, и как тогда их компилировать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2020, 15:34
Ответы с готовыми решениями:

Создать модуль и создать программу, которая будет использовать этот же модуль
Требуется создать модуль и создать программу,которая будет использовать этот же модуль. При работе с программой проблема с переменной...

Создать модуль DLL-модуль с классом, позволяющим запускать внешнюю программу
Как же все таки создать модуль DLL-модуль с классом, позволяющим запускать внешнюю программу. На многих форумах да и здесь находил код: ...

Создать модуль, и программу которая присоед-ет модуль и выдает подпрограммы раз за разом
unit leoro; interface Type A=array of integer; var i,j,k:integer; x,y,z:A; p:real; ...

3
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
24.04.2020, 01:14
Думаю, что оверлеи похожи на com, только org 0
По сути - оверлей - всего лишь подгружаемый сегмент с кодами процедур.

Добавлено через 16 минут
Ещё, у меня возникало ощущение, что "оверлей" - скорее идея, чем законченный механизм средствами операционной системы.
Фирма Borland предлагала собственный монитор оверлеев с собственной структурой файлов ovr.
Clipper - свою реализацию для *.pgm.

То, что предлагает DOS - просто "голый" сегмент кода, загружаемый по запросу программы.

Добавлено через 6 минут
Компилировать - как бинарный файл, как файл драйвера sys, как загрузочный сектор
Для masm
Windows Batch file
1
ml -Fesample.ovr sample.asm
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
24.04.2020, 22:21
В книге
Р.Данкан. Профессиональная работа в MS-DOS
Ray Duncan. Advanced MS-DOS Programming
в главе 12
Использование EXEC для загрузки оверлеев

Загрузка с помощью функции EXEC оверлеев оказывается гораздо более простой операцией, чем использование EXEC для запуска другой программы. Оверлей можно оформить либо в виде образа памяти (.СОМ), либо в виде перемещаемого файла (.EXE). причем типы оверлея и загружающей его программы могут различаться. Для загрузки и запуска оверлея основная программа, называемая корневым сегментом, должна выполнить следующие шаги:
  1. Обеспечить наличие свободного блока памяти для получения оверлея. Программа, вызывающая функцию EXEC, должна иметь в своем распоряжении блок памяти для оверлея.
  2. Заполнить блок параметров оверлея для передачи функции EXEC. Этот блок содержит сегментный адрес блока памяти, предназначенного для получения оверлея, а также сегментную константу перемещения для содержимого оверлейного файла (если это файл .EXE). Обычно ни величины совпадают.
  3. Вызвать функцию MS-DOS EXEC для загрузки оверлея, для чего выполнить Int 21H, подготовив регистры следующим образом:
    АН = 4BH
    AL = 03H (подфункция EXEC для загрузки оверлеев)
    DS:DX = сегмент:относительный_адрес пути к оверлейному файлу
    ES:BX = сегмент:относительный_адрес блока параметров оверлея
    При возврате из функции EXEC, если оверлей найден и загружен, флаг переноса сбрасывается. Если файл не найден или встретилась другая ошибка, флаг переноса устанавливается.
  4. Выполнить программные строки оверлея, передав на них управление с помощью дальнего вызова. Оверлей следует составлять таким образом, чтобы в начале загруженного модуля располагались либо точка входа, либо указатель на точку входа. Этот прием позволит вам работать над корневым модулем и модулем оверлея независимо, так как корневой модуль в этом случае не обладает "магическими" сведениями об адресах внутри сегмента оверлея.
    Для того чтобы пользователь случайно не запустил оверлей непосредственно с командной строки, файлу оверлея следует назначить расширение, отличающееся от .СОМ и .EXE. Удобнее всего соотнести оверлеи с их корневым сегментом, назначив им то же имя файла, но другое расширение, например .OVL или .OV1, .OV2 и т.д.

На рис. 12.6 показано использование функции EXEC для запуска и выполнения оверлея.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
          .
          .
          .
                                  ; allocate memory for overlay
          mov     bx,1000h        ; get 64 KB (4096 paragraphs)
          mov     ah,48h          ; function 48h = allocate block
          int     21h             ; transfer to MS-DOS
          jc      error           ; jump if allocation failed
 
          mov     pars,ax         ; set load address for overlay
          mov     pars+2,ax       ; set relocation segment for overlay
 
                                  ; set segment of entry point
          mov     word ptr entry+2,ax
 
          mov     stkseg,ss       ; save root's stack pointer
          mov     stkptr,sp
 
          mov     ax,ds           ; set ES = DS
          mov     es,ax
 
          mov     dx,offset oname ; DS:DX = overlay pathname
          mov     bx,offset pars  ; ES:BX = parameter block
          mov     ax,4b03h        ; function 4bh, subfunction 03h
          int     21h             ; transfer to MS-DOS
 
          mov     ax,_DATA        ; make our data segment
          mov     ds,ax           ; addressable again
          mov     es,ax
 
          cli                     ; (for bug in some early 8088s)
          mov     ss,stkseg       ; restore stack pointer
          mov     sp,stkptr
          sti                     ; (for bug in some early 8088s)
 
          jc      error           ; jump if EXEC failed
 
                                  ; otherwise EXEC succeeded...
          push    ds              ; save our data segment
          call    dword ptr entry ; now call the overlay
          pop     ds              ; restore our data segment
          .
          .
          .
 
  oname   db      'OVERLAY.OVL',0 ; pathname of overlay file
 
  pars    dw      0               ; load address (segment) for file
          dw      0               ; relocation (segment) for file
 
  entry   dd      0               ; entry point for overlay
 
  stkseg  dw      0               ; save SS register
  stkptr  dw      0               ; save SP register
Рис. 12.6. Структура программы, осуществляющей загрузку и выполнение оверлея с помощью функции EXEC. Файл оверлея может быть как в формате .СОМ, так и в формате .EXE.
1
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
26.04.2020, 23:42
Пример рабочей минимальной тестовой программы для демонстрации вызова оверлея.
Программа типа DOS exe, оверлей типа DOS com, компилятор TASM

Структура основной программы
1. освободить память, которая вся занята текущей программой
2. распределить память для оверлея
3. загрузить оверлей
4. выполнить оверлей
5. освободить память, выделенную оверлею

При использовании TASM не получается простыми средствами получить образ программы со смещением от 0, а не 100h. Поэтому при обращении к данным вычитал значение этого смещения 100h.
Возможно, будет работоспособен вариант компиляции оверлея в exe и преобразование в бинарный образ утилитой exe2bin.

Применение компиляторов masm, fasm или nasm позволяет обойтись без лишних трюков в коде.

За основу программы взят пример 12.6 из Р.Данкан. Профессиональная работа в MS-DOS.
Изменения:
- добавлено освобождение памяти в начале программы
- добавлено освобождение памяти, выделенной под оверлей
- добавлены диагностические сообщения при ошибках

main.asm
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
.model  small
 
.stack  200h
 
ExecOverlayRec  struc
        wStartSeg       dw      ?
        wReloFactor     dw      ?
ExecOverlayRec  ends
 
.data
        msgPressAnyKey  db      0Dh, 0Ah, 'Press any key to exit...', '$'
        ;диагностические сообщения
        asErrResizeMem  db      "Resize memory block error", '$'
        asErrReleaseMem db      "Release memory block error", '$'
        asErrAllocMem   db      "Allocate memory block error", '$'
        asErrExec       db      "Exec failed", '$'
        ;имя оверлейного файла
        oname           db      'OVERLAY.OVL',0 ; pathname of overlay file
.data?
        pars            ExecOverlayRec  <?>
        entry           dd      ?               ; entry point for overlay
        stkseg          dw      ?               ; save SS register
        stkptr          dw      ?               ; save SP register
.code
 
main    proc
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     @data
        mov     ds,     ax
 
        ;освобождаем память
        ;когда процесс получает управление через функцию 4bH EXEC,
        ;вся доступная память уже распределена ему, поэтому освобождаем её часть сразу
        ;при запуске программы es и ds указывают на начало PSP
        mov     ax,     es
        mov     bx,     seg zseg ;по файлу .map видно что zseg начинается в самом конце
        sub     bx,     ax
        mov     ah,     4ah
        int     21h
        jnc     @@ResizeMemOk
                mov     ah,     09h
                lea     dx,     [asErrResizeMem]
                int     21h
                jmp     @@Exit
        @@ResizeMemOk:
                                ; allocate memory for overlay
        mov     bx,1000h        ; get 64 KB (4096 paragraphs)
        mov     ah,48h          ; function 48h = allocate block
        int     21h             ; transfer to MS-DOS
        jnc     @@AllocOk       ; jump if allocation failed
                mov     ah,     09h
                lea     dx,     [asErrAllocMem]
                int     21h
                jmp     @@Exit
        @@AllocOk:
 
        mov     [pars].wStartSeg,ax     ; set load address for overlay
        mov     [pars].wReloFactor,ax   ; set relocation segment for overlay
 
                                ; set segment of entry point
        mov     word ptr [entry+2],ax
        mov     word ptr [entry], 0
 
        mov     [stkseg],ss     ; save root's stack pointer
        mov     [stkptr],sp
 
        mov     ax,ds           ; set ES = DS
        mov     es,ax
 
        mov     dx,offset oname ; DS:DX = overlay pathname
        mov     bx,offset pars  ; ES:BX = parameter block
        mov     ax,4b03h        ; function 4bh, subfunction 03h
        int     21h             ; transfer to MS-DOS
 
        mov     ax,_DATA        ; make our data segment
        mov     ds,ax           ; addressable again
        mov     es,ax
 
        cli                     ; (for bug in some early 8088s)
        mov     ss,[stkseg]     ; restore stack pointer
        mov     sp,[stkptr]
        sti                     ; (for bug in some early 8088s)
 
        jnc     @@ExecOk        ; jump if EXEC failed
                mov     ah,     09h
                lea     dx,     [asErrExec]
                int     21h
                jmp     @@ReleaseMem
        @@ExecOk:
                                ; otherwise EXEC succeeded...
        push    ds              ; save our data segment
        call    dword ptr[entry]; now call the overlay
        pop     ds              ; restore our data segment
 
@@ReleaseMem:
        mov     ah,     49h
        mov     bx,     [pars].wStartSeg
        mov     es,     bx
        int     21h
@@Exit:
        ;ожидание нажатия любой клавиши
        mov     ah,     09h
        lea     dx,     [msgPressAnyKey]
        int     21h
        mov     ah,     00h
        int     16h
        ;завершение программы
        mov     ax,     4C00h
        int     21h
main    endp
 
;сегмент для определения размеров программы
zseg    segment para use16
zseg    ends
 
end     main


Программа оверлей. При вызове выводит приветствие и возвращает управление вызвавшему родительскому коду.
Из-за особенностей компоновщика TLINK, не позволяющего получить бинарный образ программы со смещением отличным от 100h, приходится использовать трюки в коде - вычитать смещение 100h из адреса переменной.
overlay.asm
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.model tiny
 
.code
 
        org     100h
main    proc
 
        jmp     start
 
        ;Данные
        Hello           db      'Hello!', '$'
        CrLf            db      0Dh, 0Ah, '$'
 
start:
        ;программа
        push    ds
        push    cs
        pop     ds
 
        mov     ah,     09h
        lea     dx,     [Hello-100h]
        int     21h
 
        pop     ds
        ;завершение программы
        retf
main    endp
 
end     main


Пакетный файл для компиляции проекта - вызывающей программы и оверлея.
Для предотвращения самостоятельного запуска оверлея, он переименовывается - расширение com заменяется на ovl.

overlay.bat
Кликните здесь для просмотра всего текста
Windows Batch file
1
2
3
4
5
6
tasm main.asm
tlink main.obj
 
tasm overlay.asm
tlink /Tdc overlay.obj
rename overlay.com overlay.ovl
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.04.2020, 23:42
Помогаю со студенческими работами здесь

Создать модуль и программу, которая будет тестировать модуль
Модуль должен состоять из процедур и функций которые надам я Процедура: извините что в формате рисунка програмы не осталось,остался...

Создать личный модуль, содержащий указанные подпрограммы. Написать программу, которая подключает созданный модуль и использует его подпрограммы
Создать личный модуль, содержащий указанные подпрограммы. Написать программу, которая подключает созданный модуль и использует его...

Создать модуль
Создать модуль, содержащий процедуры решения задачи: uses crt; var b:array of real; max:real; d,n:integer; begin ...

Создать модуль
Создайте модуль MODUL10.TPU, в котором описаны функция F10, вычисляющая сумму квадратных корней элементов массива A of real и процедура...

Создать модуль
Подскажите!Выдает ошибку :PROGRAM_UNIT1_EXAMPLE.pas(22) : Ошибка времени выполнения: Попытка считывания за концом текстового файла. uses ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 05.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru