Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
M1_5spPm.doc
Скачиваний:
1
Добавлен:
18.09.2019
Размер:
176.13 Кб
Скачать
  1. Перевірки умов та відношень порядку ключів на мові асемблера

Для створення на мові Асемблера програмних модулів, сумісних з будь-якою заданою мовою високого рівня важливо додержуватись угод про зв’язки, прийнятих при реалізації цієї мови для конкретної цільової мови або конкретного режиму заданого цільового процесора. Угоди про зв’язки включають складний комплекс правил, що стосуються прологів та епілогів процедур і функцій та послідовностей виклику функцій:

- стандарту розміщення іменованих констант і змінних, в тому числі глобальних, локальних, та інших, у пам’яті;

- стандарту використання регістрів і пам’яті цільового процесора реалізації мови;

- стандарту передачі аргументів та результатів процедур і функцій;

- стандарту передачі управління при звертанні до функцій і процедур та поверненні з них.

Прологи та епілоги функцій визначаються режимами процесорів, режимами виконання програм (налагодження або заключний продукт) та механізмами передачі даних та управління. Звичайно розрізнюють два стилі передачі аргументів в підпрограми: стиль мови Pascal, в якому аргументи записуються до стеку в послідовності, вказаній у виклику, та стиль мови С, в якому аргументи записуються до стеку в зворотній послідовності. Таким чином, в режимі "Disassembly" для стилю мови Pascal та мови С ми можемо побачити поряд з викликом функцій послідовності команд push в різному порядку, а після повернення для стилю мови С - команду add sp,n, де n – кількість байтів у частині стека, що звільнюється. За базовими угодами про зв’язки будуються прологи та епілоги функцій. Прологи забезпечують доступ до аргументів і локальних даних, а епілоги – доступ до результатів процедур і функцій. Команда ret n разом з виходом з підпрограми звільняє стек від аргументів.

int cmpKey(struct recrd* el, struct keyStr kArg)

{ int i=cmpStr((unsigned char*)el->key.str,

(unsigned char*)kArg.str);

if(i)return i;

return el->key.nMod - kArg.nMod;

}

Системні програми в процесі свого виконання використовують власну вбудовану інформаційну базу (IБ), а також будують ІБ задачі про текст на заданій вхідній мові. В більшості випадків при обробці ІБ необхідно порівнювати клю­чо­ві поля елементів таблиць. В системних програмах найчастіше вико­рис­товують поодинокі ключові поля, що зберігають числа або рядки символів. Таким чином, функції порівняння складають основу роботи з ключовими полями таблиць.

При вставках на мові Асемблера текст коду включається в блоки вигляду:

// порівняння за відношенням порядку

char cmpKys(struct keyStr *k0, struct keyStr *kArg)

{_asm{

push esi

push edi

push ecx

xor eax,eax ; очистка акумулятора

xor ecx,ecx ; завантаження n=0

mov edi,kArg ;

mov edi,[edi]; завантаження покажчика на 1-й рядок

mov esi,k0

mov esi,[esi]; завантаження покажчика на 2-й рядок

lb:lodsb ; завантаження чергового байта 1-го рядка

scasb ; порівняння чергових байтів рядків

jne lf ; на вихід з підпрограми

cmp eax,0; порівняння з ознакою закінчення 1-го рядка

je lf ; на вихід з підпрограми

loop lb ; на продовження порівняння

lf:sub al,[edi-1]; формування відношення порядку

pop ecx

pop edi

pop esi

}

}

Команди перевірки закінчення циклів можуть бути поєднані з суміжними командами переходів, наприклад, команди je lf та loop lb в попередній програмі можуть бути замінені на loopne lb. ….

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]