Виконувані СОМ-файли, їхня відмінність від ЄХЕ-файлів, приклади

Асемблер – це мова програмування низького рівня і програма, написана на Асемблері, повинна пройти три етапи обробки на комп'ютері, як і програма, написана будь-якою іншою мовою програмування.

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.