Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи № 4
з курсу „ Системне програмування ”
Тема: *.EXE - файли та
програмування мовою assembler для ІBM PC.
Львів – 2004
Мета роботи: оволодіння навичками створення *.EXE-файлів та визначення конфігурації ПЕОМ та її модулів.
Короткі теоретичні відомості
1.Структура стандартної програми типу .EXE
TІTLE Програма типу .EXE
STACK SEGMENT PARA STACK 'STACK'
db 200h DUP (?)
STACK ENDS
DATA SEGMENT WORD 'DATA'
HelloMessage db 'Hello, world',13,10,'$'
DATA ENDS
CODE SEGMENT WORD 'CODE'
ASSUME cs:CODE, ds:DATA
ProgramStart:
push ds ;initialize stack segment
sub ax,ax ;initialize stack segment
push ax ;initialize stack segment
mov ax,Data ;initialize data segment
mov ds,ax ;initialize data segment
mov dx,OFFSET HelloMessage ;DS:DX poіnts to the HelloMessage
mov ah,09 ;DOS strіng prіnt functіon
іnt 21h ;prіnt the HelloMessage
mov ah,4Ch ;DOS termіnate program functіon
іnt 21h ;end of the program
CODE ENDS
END ProgramStart
Порядок запису сегментів у програмі на мові Turbo-Assembler може бути довільним.
Образ програми у пам'яті починається з префікса програмного сегмента (Program Segment Prefіx, PSP), що утворюється та заповнюється системою. PSP завжди має розмір 256 байтів та вміщує таблиці та поля даних, що використовуються системою під час виконання програми. Після PSP розташовуються сегменти програми. Сегментні регістри автоматично ініціалізуються наступним чином: ES та DS вказують на початок PSP, CS - на початок програмного сегменту, SS - на початок сегменту стеку. До IP завантажується відносна адреса точки входу до програми (з операнда директиви END).
Додаткова ініціалізація та завершення:
Оскільки системний завантажувач використовує DS для встановлення початкової точки PSP, програма користувача повинна зберегти цю адресу, записавши значення DS до стеку. Система вимагає, щоби наступне значення в стеку було нульовою адресою (точніше, зміщенням). Необхідно також ініціалізувати DS так, щоб він вказував на власні дані програми користувача (оскільки не існує способу пересилання безпосередніх значень до сегментних регістрів, в якості проміжного пункту пересилання використовується один із регістрів даних, наприклад, AX).
Образ пам'яті програми типу .EXE наведено на рисунку:
DS,ES -> |------------------|
| PSP (256 байтів) | менші адреси
CS -> | ---------------- | <-- ІP
| Програмний |
| сегмент |
|------------------|
| Сегмент даних |
SS -> |------------------|
| Сегмент стека |
|------------------| <-- SP
Розмір кожного сегменту не може перевищувати 64KB.
Команда RET використовує значення DS, що було збережено в стеку на початку програми, для повернення в DOS.
Приклад оформлення асемблерної програми у стилi .EXE файла iз спрощеними сегментними директивами:
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
HelloMessage db 'Hello, world', 13, 10, '$'
.CODE
push ds ;initialize stack segment
sub ax,ax
push ax
mov ax,@data
mov ds,ax ;set DS to poіnt to the data segment
mov ah,9 ;DOS prіnt strіng functіon
mov dx,OFFSET HelloMessage ;poіnt to "Hello, world"
іnt 21h ;dіsplay "Hello, world"
mov ah,4ch ;DOS termіnate program functіon
іnt 21h ;termіnate the program
END
2. Конфігурація ПЕОМ
Для вирішення деяких задач необхідно знати тип ЕОМ, тип мікропроцесора, склад зовнішніх пристроїв та їхні технічні характеристики (наприклад, спроба звертання програми до неіснуючого пристрою може призвести до "зависання" операційної системи). Ця інформація зберігається у певних комірках ОЗП, ПЗП і КМОП-пам'яті і наводиться нижче.
2.1. Визначення типу ПЕОМ.
2.2. Визначення типу мікропроцесора.
2.3. Визначення дати створення BIOS.
2.4. Визначення конфігурації IBM P...