Структура и инициализация COM-программ — КиберПедия 

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Структура и инициализация COM-программ

2022-10-05 21
Структура и инициализация COM-программ 0.00 из 5.00 0 оценок
Заказать работу

Редактор связей при компоновке модулей автоматически генерирует загрузочный модуль в EXE-формате, в котором присутствует специальный начальный блок размером не менее 512 байт. EXE-программа может быть преобразована в COM-файл с помощью специальной утилиты EXE2BIN.

Несмотря на то, что EXE2BIN преобразует EXE-файл в COM-файл, существуют определенные различия, которые нужно учитывать при написании COM-программ:

· Размер программы. Программа в формате EXE может иметь любой размер, в то время как COM-программа ограничена размером одного сегмента, не превышающего 64 Кбайт. В COM-файле отсутствует 512-байтовый заголовок, который есть в EXE-файле.

· Сегмент стека. В EXE-программе должен быть определен сегмент стека, в то время как для COM-программы DOS автоматически генерирует стек и устанавливает одинаковый общий сегментный адрес во всех четырех сегментных регистрах. Таким образом, при создании ассемблерной программы, которая будет преобразована в COM-файл, стек должен быть опущен.

· Сегмент данных. В COM-программе все данные должны быть определены в сегменте кода.

· Инициализация. В EXE-программе выполняются запись нулевого слова в стек и инициализация регистра DS. Так как в COM-программе стек и сегмент данных не определены, то эти шаги отсутствуют. Когда COM-программа начинает работать, все сегментные регистры содержат адрес PSP, который резервируется системой DOS непосредственно перед загрузочным модулем в памяти. Так как адресация начинается со смещения 100h от начала PSP, то в программе после оператора segment должна быть закодирована директива org 100h.

CDSG segment para 'Code'
     assume  CS:CDSG,DS:CDSG,SS:CDSG,ES:CDSG
     org 100h;относительный адрес начала программы
START: jmp MAIN;обходим данные в программе
;--------определение данных-------------------
X    dw 250
Y    dw 125
Z    dw?
;-----------------------------------------------------
MAIN proc near
             .
             .
             .
              ret
MAIN endp
CDSG ends
              end START

3.6. Задания для самостоятельной работы

1. Наберите, откомпилируйте, скомпонуйте и выполните следующую программу (листинг 3.3). При компоновке выдайте план загрузочного модуля (файл с расширением MAP).

Листинг 3.3

ds0 segment para public 'data0'
scr0 db    'Первый сегмент ','$'
ds0 ends
;---------------------------------------
ss0 segment para stack 'stack'
   db 50 dup(?)
ss0 ends
;---------------------------------------
ds1 segment para public 'data1'
scrA db 'Привет         ','$'
scr1 db 'Второй сегмент ','$'
ds1 ends
;---------------------------------------
cs0 segment para 'code'
main proc far
   assume cs:cs0,ds:ds0,ss:ss0
   push ds
   sub ax,ax
   push ax
   mov ax,ds0
   mov ds,ax
;=========================
   mov ah,09h
   lea dx,scr0
   int 21h
;==========================
   ret
main endp
cs0 ends
   end main

 

Что делает данная программа? Определите по плану загрузочного модуля, как размещены в загрузочном модуле сегменты ds0 и ds1?

Поменяйте класс сегмента ds1 на 'data0'. Как изменился план загрузочного модуля?

Поменяйте теперь имя сегмента ds1 на ds0. Как изменилось размещение сегментов?

2. Следующая программа работает неверно (листинг 3.4). Исправьте ошибку, изменив лишь три символа в программе.

Листинг 3.4

ds0 segment para public 'data0'
scr0 db 'Первый сегмент ','$'
fin db 'Конец работы','$'
ds0 ends
;---------------------------------------
ss0 segment para stack 'stack'
   db 50 dup(?)
ss0 ends
;---------------------------------------
ds1 segment para public 'data1'
scrA db 'Ошибочная работа','$'
scr1 db 'Второй сегмент ','$'
ds1 ends
;---------------------------------------
cs0 segment para 'code'
main proc far
   assume cs:cs0,ds:ds0,ss:ss0
   push ds
   sub ax,ax
   push ax
   mov ax,ds0
   mov ds,ax
;==========Вывод строки scr0======
   mov ah,09h
   lea dx,scr0
   int 21h
;==========Вывод строки scr1======
   mov ah,09h
   lea dx,scr1
   int 21h
   ret
main endp
cs0 ends
   end main

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

3. Программу из предыдущего задания (листинг 3.4) измените таким образом, чтобы на экран была выведена строка scr0, затем - scr1, а затем - fin. Изменения можно вносить только в сегмент кода.

4. Имеется программа, состоящая из двух модулей. Исходные тексты модулей находятся в разных файлах (листинг 3.5). Что будет выведено на экран в результате работы этой программы, почему?

Листинг 3.5

;======МОДУЛЬ 1=================
dtcm segment para public 'data'
s1 db 'Out string ','$'
dtcm ends
sgst segment para stack 'stack'
   db 50 dup(?)
sgst ends
cdsg segment para public 'code'
main proc far
   assume cs:cdsg,ds:dtcm,ss:sgst
   extrn repl:far
   push ds
   sub ax,ax
   push ax
   mov ax,dtcm
   mov ds,ax
  ;---------------
   mov ah,09h
   lea dx,s1
   int 21h
  ;---------------
   call repl
  ;---------------
   mov ah,09h
   lea dx,s1
   int 21h
   ret
main endp
cdsg ends
   end main

;======МОДУЛЬ 2=================
dtcm segment para common 'data'
sa db 50 dup(?)
dtcm ends
cds2 segment para public 'code2'
   assume cs:cds2,ds:dtcm
repl proc far
   public repl
   push ds
   mov ax,dtcm
   mov ds,ax
     ;---------------
   mov sa,'X'
   mov sa+1,'Y'
   mov sa+2,'Z'
  ;---------------
   pop ds
   ret
repl endp
cds2 ends
   end

 

5. Напишите программу, выводящую в первую и вторую строки экрана по два символа «*» на красном фоне путем прямого обращения в видеобуфер. Для решения этой задачи определите в программе сегмент с базированием по абсолютному адресу видеобуфера.


Поделиться с друзьями:

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

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.007 с.