Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...
Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
Топ:
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
Основы обеспечения единства измерений: Обеспечение единства измерений - деятельность метрологических служб, направленная на достижение...
Когда производится ограждение поезда, остановившегося на перегоне: Во всех случаях немедленно должно быть ограждено место препятствия для движения поездов на смежном пути двухпутного...
Интересное:
Наиболее распространенные виды рака: Раковая опухоль — это самостоятельное новообразование, которое может возникнуть и от повышенного давления...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Уполаживание и террасирование склонов: Если глубина оврага более 5 м необходимо устройство берм. Варианты использования оврагов для градостроительных целей...
Дисциплины:
2022-10-05 | 22 |
5.00
из
|
Заказать работу |
|
|
Редактор связей при компоновке модулей автоматически генерирует загрузочный модуль в 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. Напишите программу, выводящую в первую и вторую строки экрана по два символа «*» на красном фоне путем прямого обращения в видеобуфер. Для решения этой задачи определите в программе сегмент с базированием по абсолютному адресу видеобуфера.
|
|
Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!