Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи № 3
з курсу „ Системне програмування ”
Тема: *.COM - файли та
програмування мовою assembler для IBM PC.
Львів – 2004
Мета роботи: оволодіння навичками створення *.COM - файлів.
Короткі теоретичні відомості
Програма типу .COM вміщує лише один сегмент, де розташовані усі компоненти програми: префікс програмного сегмента, програмний код, дані, стек.
Структура типової програми має вигляд:
tіtle Програма типу .COM
text segment 'code'
assume CS:text, DS:text, ES:text, SS:text
org 100h
myproc proc
... ; текст прграми
myproc endp
... ; означення даних
text ends
end myproc
Програма містить лише один сегмент text з класом 'CODE'. Оператор ASSUME затверджує, що усі чотири сегментні регістри вказують на цей єдиний сегмент. Оператор ORG 100h резервує 256 байтів для PSP (префікса програмного сегмента). Наповнювати PSP буде система. У програмі нема потреби ініціалізувати регістр DS, бо його, як всі інші сегментні регістри, ініціалізує система. Система у випадку .COM - файлу завжди задає ІP=100h. Через це негайно за оператором ORG 100h повинен знаходитись перший виконуваний рядок програми. Якщо власні дані бажано розмістити на початку програми, тоді першою командою програми має бути jmp через ці дані.
Образ пам'яті програми типу .COM наведено на рис.
-------------------
CS,DS,ES,SS -> | PSP (256 байтів) | менші адреси
| ---------------- | <-- ІP
| Програма та |
| дані |
| -----------------| більші адреси
| Стек |
------------------ <-- SP= FFFEh
До покажчика стека автоматично записується число FFFEh. Незалежно від реального розміру програми їй надається 64 K адресного простору, тобто один і тільки один сегмент. Стек зростає в напрямку зменшення адрес та за умови поганого планування програмістом може "наїхати (тобто затерти)" на власні дані та програму.
Розрізняють два стилі оформлення ( запису ) асемблерних програм - із стандартними та спрощеними сегментними директивами. Наступний приклад ілюструє застосування стандартних сегментних директив.
CODE SEGMENT WORD 'CODE'
ORG 100h
ASSUME cs:CODE, ds:CODE, ss:CODE, es:CODE
ProgramStart:
Jmp cont
HelloMessage db 'Hello, world', 13, 10, '$'
cont:
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
Нижче наведено приклад із спрощеними сегментними директивами.
.MODEL TІNY
.CODE
org 100h
start:
jmp prog ;власні дані, що потребують перестрибування
HelloMessage DB 'Hello, world', 13, 10, '$'
prog:
mov ah,09 ;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 start
Система Turbo-Assembler виробляє .COM-файл в наступний спосіб:
C:\> tasm fіlename.asm <Enter>
Результат - файл fіlename.obj. Необов'язкові параметри /l або /la призводять до додаткової генерації файлу fіlename.lst, що міститть лістинг асемблювання програми.
C:\> tlіnk/t fіlename.obj <Enter> Результат - файл fіlename.com, що вже можна запускати.
Завдання на лабораторну роботу
Варіант 9.
0B1D:0100 B101 MOV CL,01
0B1D:0102 B80300 MOV AX,0003
0B1D:0105 D3E8 SHR AX,CL
0B1D:0107 A800 TEST AL,00
0B1D:0109 D0C8 ROR AL,1
Вміст .asm-файлу
CODE SEGMENT WORD 'CODE'
ORG 100h
ASSUME cs:CODE, ds:CODE, ss:CODE, es:CODE
begin:
Jmp progbody
MyMsg db '▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒',13,10
db '▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓████████▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██▀███▀███▀████▓▓▓▓▓▓▓▒',13,10
db '▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓███ ███▓▓▓▓▓▓████████▓▓██ ▄▀▄ ███ ████▓▓▓▓▓▓▓▒',13,10
db '▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██ ███▓▓▓▓███ ███▓██▄███▄█▄█▄█▄██▓▓▓▓▓▓▓▒',13,10
db '▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██▀ ▄ ███▓▓▓▓███ ███▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█████▒',13,10
db '▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██ ▄██ ███▓▓▓▓██████████▓▓▓▓▓▓▓▓▓▓▓▓▓█████▓▒▓▒',13,10
db '▒▓█████████▓▓▓▓▓▓▓▓██ ████ ███▓▓▓▓███ ███▓▓▓▓▓▓▓▓▓█████▓▒▓███▒',13,10
db '▒███ ▀████▓▓▓▓▓▓██ █████ ███▓▓▓▓███ ███▓▓▓▓▓█████▓▒▓█████░▒',13,10
db '▒██ ▀████▓▓▓██ ██████ ███▓▓▓▓███ ███▓█████▓▒▓█████░░░░▒',13,10
db '▒███ █▄▄ ▀██████ ███████ ███▓▓▓▓███ █████▓▒▓█████░░░░░░░▒',13,10
db '▒▓███ ████▄ ▀▀▀ ▄████████ ███▓▓▓▓███ █████████░░░░░░░░░░▒',13,10
db '▒▓▓███ ██████▄ ▄██████████ ███▓▓▓████ ███░░░░░░░░░░░░░░░▒',13,10
db '▒▓▓▓███ ██████████████████████ ██████████ ███░░░░░░░░░░░░░░▒',13,10
db '▒▓▓▓▓███ ██████████████████████ ▄████▓▒▓████ ███░░░░░░░░░░░░░▒',13,10
db '▒▓▓▓▓▓███ █████████████████████████▓▒▓████████ ███░░░░░░░█████▒',13,10
db '▒▓▓▓▓▓▓███ █████████████████████▓▒▓█████░░░░███ ███░░░█████▓▒▓▒',13,10
db '▒▓▓▓▓▓▓▓███ █████████████████▓▒▓█████░░░░░░░░███ ███████▓▒▓███▒',13,10
db '▒▓▓▓▓▓▓▓▓███ █████████████▓▒▓█████░░░░░░░░░░░░███ ▄████▓▒▓█████▓▒',13,10
db '▒▓▓▓▓▓▓▓▓▓███ █████████▓▒▓█████░░░░░░░░░░░░░░░░██████▓▒▓█████▓▓▓▓▒',13,10
db '▒▓▓▓▓▓▓▓▓▓▓███ ▄██████▓▒▓█████░░░░░░░░░░░░░░░░░█████▓▒▓█████▓▓▓▓▓▓▓▒',13,10
db '▒▓▓▓▓▓▓▓▓▓▓▓████████▓▒▓█████░░░░░░░░░░░░░░░░░░░███▓▒▓█████▓▓▓▓▓▓▓▓▓▓▒',13,10
db '▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒',13,10,'$'
progbody:
mov dx,OFFSET MyMsg
mov ah,09
int 21h
mov ah,4Ch
int 21h
CODE ENDS
END begin
Висновок: Виконуючи дану лабораторну роботу, я оволодів навичками створення *.COM-файлів на прикладі простої програми, що виводить мої ініціали символами псевдографіки.