Виконувані СОМ-файли, їхня відмінність від ЄХЕ-файлів, приклади
Асемблер – це мова програмування низького рівня і програма, написана на Асемблері, повинна пройти три етапи обробки на комп'ютері, як і програма, написана будь-якою іншою мовою програмування.
I етап - перетворення вихідного модуля на об'єктний – асемблювання. Вихідні модулі можуть бути 1 або кілька.
ІІІ етап – виконання програми.
Існує два типи виконуваних модулів (файлів, що виконуються): exe-файл (.exe) і com-файл (.com). В результаті виконання другого етапу виходить виконуваний exe-файл, щоб отримати com-файл, необхідно виконати ще один етап обробки - перетворення exe-файлу в com-файл.
Якщо порівнювати EXE і COM-файли для однієї й тієї програми, то другі файли менше як мінімум на 512 байт. Але з іншого боку, перші файли можуть займати довільну кількість сегментів на відміну від других. Таким чином, рекомендуються невеликі програми писати під COM виконавчі файли.
Відмінності exe-файлу від com-файлу :
У com-файлах немає блоку початкового завантаження і отже він займає менше місця, ніж exe-файл.
exe-файл може займати довільний обсяг ОП. com-файл може займати лише один сегмент пам'яті.
Стек створюється автоматично ОС, тому користувача немає необхідності виділяти йому місце. Дані розміщуються там, де і програма.
Приклад створення com-файлу.
TITLE Prog_Сom-файл
Page 60, 85
СSeg Segment Para 'Сode'
ASSUME SS:CSeg, DS:CSeg, CS:CSeg
Org 100h
Start: JMP Main
St1 DB ‘String1’, 13, 10, ‘$’
St2 DB ‘String2’, ‘$’
Main Proc
MOV AH, 9
LEA DX, St1
Int21h
LEA DX, St2
Int 21h
MOV AH, 4CH
Int 21h
Main endp
CSeg ends
End Start
Model tiny
Code
JMP Met
St1 DB ‘String1’, ‘$’
Met: MOV AH, 09h
LEA DX, St1
Int 21h
MOV AH, 4Ch
Int 21h
End Met
Beg Proc
MOV AH, 9
LEA DX, St1
Int 21h
MOV AH, 4Ch
Int 21h
Beg endp
St1 DB ‘String1’, ‘$’
End beg
• Не кожен вихідний файл відповідає вимогам com-файлу.
• Невеликі за обсягом програми рекомендується оформляти як файли com.
• Вихідний файл, написаний як com-файл, не може бути виконаний як exe-файл.
19) Команди двійкової арифметики: додавання, віднімання, множення та поділ
Додавання (віднімання) беззнакових чисел виконується за правилами аналогічними до складання (віднімання) за модулем 2 k прийнятим у математиці. В інформатиці, якщо в результаті більше k розрядів, то +1-й пересилається в CF.
X + Y = (X + Y) mod 2 k = X + Y і CF = 0, якщо X + Y k
X + Y = (X + Y) mod 2 k = X + Y -2 k і CF = 1, якщо X + Y = 2 k
Приклад, працюючи з байтами (k=8), отримаємо:
250 + 10 = (250 + 10) mod 2 8 = 260 mod 256 = 4
260 = 1 0000 01002, CF = 1, результат - 0000 01002 = 4
X - Y = (X - Y) mod 2 k = X - Y і CF = 0, якщо X = Y
X - Y = (X - Y) mod 2 k = X + 2 k -Y і CF = 1, якщо X 8 + 1 - 2 = 257 - 2 = 255, CF = 1
Додавання (віднімання) знакових чисел зводиться до складання (віднімання) з використаннямдодатковий код.
X = 10 n - X
В байті: -1 = 256 - 1 = 255 = 111111112
-3 = 256 - 3 = 253 = 111111012
3 + (-1) = (3 + (-1)) mod 256 = (3+255) mod 256 = 2
1 + (-3) = (1 + (-3)) mod 256 = 254 = 1 11111102
Відповідь отримали в додатковому коді, отже результат отримуємо в байті за формулоюX = 10 n - X, тобто.
х = 256 - 254 = 2 і знак мінус. Відповідь -2.
Переповнення відбувається, якщо є перенесення зі старшого цифрового до знакового, а зі знакового немає і навпаки, тоді OF = 1. Програміст сам вирішує який прапорець аналізувати OF або CF, знаючи з якими даними він працює.
Арифметичні операції змінюють значення прапорців
OF, CF, SF, ZF, AF, PF.
В асемблері команда '+'
ADD OP1, OP2 ; (OP1) + (OP2) ® OP1
ADC OP1, OP2 ; (OP1) + (OP2) + (CF) ® OP1
XADD OP1, OP2 ; i486 та >
(OP1) « (OP2) (змінює місцями), (OP1) + (OP2) ® OP1
INC OP1 ; (OP1) + 1 ® OP1
В асемблері команда '-'
SUB OP1, OP2 ; (OP1) – (OP2) ® OP1
SBB OP1, OP2 ; (OP1) – (OP2) – (CF) ® OP1
DEC OP1 ; (OP1) – 1 ® OP1.
X = 1234AB12h, Y = 5678CD34h, X + Y =
MOV AX, 1234h
MOV BX, 0AB12h
MOV CX, 5678h
MOV DX, 0CD34h
ADD BX, DX
ADC AX, CX
X - Y =SUB BX, DX
SBB AX, CX
ADD AX, mas[SI]; пряма з індексуванням
95h + 82h = 117h 95 = 100101012 82 = 100000102
100101012 + 100000102 = 1 0001 01112, 10010101
CF = 1, OF = 1, SF = 0, ZF = 0, AF = 0, PF = 1. 10000010
Приклад2: 1 00010111
MOV AL, 9h
SUB AL, 5h
9h - 5h = 4h 5 = 00000101 -5 = 11111011 9 = 00001001
9 + (-5) = 11111011 + 00001001 = 1 0000 0100
CF = 1, OF = 0, SF = 0, ZF = 0, AF = 1, PF = 0.