Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи № 4
з курсу „ Системне програмування ”
Тема: *.EXE - файли та
програмування мовою assembler для ІBM PC.
Виконав:
студент групи КІ-3
Львів – 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 PC XT.
2.5. Визначення конфігурації IBM PC AT.
Завдання на лабораторну роботу
Використовуючи довідкову інформацію про технічні характеристики ПЕОМ, визначити адресу або область ПЗП, ОЗУ або КМОП-пам'яті, що містять дані, необхідні для виконання вказаного викладачем варіанту завдання.
Створити програму типу .EXE, що реалізує вказане завдання.
Вміст .asm-файлу
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
ProcMsg db 10,13,'Type of microprocessor: $'
P1Msg db '8086.$'
P2Msg db '80286.$'
P3Msg db '80386 or later.$'
PCMsg db 10,13,'Type of computer: $'
ATMsg db 'AT.',10,13, '$'
nonATMsg db 'non - AT.',10,13, '$'
AcumOKMsg db 'Acumulator is charged and working properly.',10,13,10,13,'$'
AcumBadMsg db 'Acumulator is not working properly!',10,13,10,13,'$'
.CODE
start: push ds
sub ax,ax
push ax ;initialize stack segment
mov ax,@data
mov ds,ax ;initialize data segment
;-----Detection of microprocessor type
mov dx,OFFSET ProcMsg ;DS:DX points to the ProcMsg
mov ah,09 ;DOS string print function
int 21h ;print the ProcMsg
mov ax,0000
push ax
popf
pushf
mov ax,0000
pop ax
CMP ax,0F000h
JZ i8086
JMP else1
i8086: mov dx,OFFSET P1Msg
else1: mov ax,0F000h
push ax
popf
pushf
mov ax,0000
pop ax
CMP ax,0000
JZ i80286
mov dx,OFFSET P3Msg
JMP print1
i80286: mov dx,OFFSET P2Msg
print1: mov ah,09
int 21h
;-----Detection of PC type
mov dx,OFFSET PCMsg
mov ah,09
int 21h
MOV ax,0F000h
MOV ds,ax ;set DS to point to F000h
MOV bx,0FFFEh
MOV dl,[bx]
mov ax,@data
mov ds,ax
CMP dl,0FCh ;Checking if PC is AT ( [F000:FFFE]=FCh ? )
JZ isAT
mov dx,OFFSET nonATMsg
JMP print2
isAT: mov dx,OFFSET ATMsg
print2: mov ah,09
int 21h
;-----Acumulator check
mov al,0Eh
OUT 70h,al
nop
IN al,71h
nop
AND al,80h
CMP al,80h
JZ Bad
mov dx,OFFSET AcumOKMsg
JMP print3
Bad: mov dx,OFFSET AcumBadMsg
print3: mov ah,09
int 21h
;-----EXIT
mov ah,4Ch ;DOS terminate program function
int 21h ;terminate the program
END start
Результат виконання програми
Type of microprocessor: 80386 or later.
Type of computer: AT.
Acumulator is charged and working properly.
Висновок: Виконуючи дану лабораторну роботу, я оволодів навичками створення *.EXE-файлів та визначення конфігурації ПЕОМ та її модулів.