Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТОДИЧНІ ВКАЗІВКИ.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
409 Кб
Скачать
☆
  1. Приклад програми для роботи з масивами

Пошук максимального числа масиву. Результат роботи програми: BX – максимальне число з масиву.

.286

.model tiny

.code

org 100h

start:

Array db 0,1,2,3,4,5,6,7,8,9

; value=0 ; інший опис масиву

;LABEL Array Word ;

;REPT 10

; dw value ;

; value = value+1

;ENDM

mov CX, 8

mov DI,0

cykl: mov AX, offset [Array+DI] ;ES:[DI]

inc DI

cmp AX, offset[Array+DI]

jb next

mov BX, AX

next: loop cykl

mov Ah,2h

mov DX,BX

int 21h ;вивід на екран

end start

  1. Варіанти завдань до виконання лабораторної роботи №6

  1. На мові асемблер скласти програму сортування масиву цілих чисел в порядку зростання.

  2. На мові асемблер скласти програму,що шукає максимальне число в масиві цілих чисел.

  3. Посортувати масив з 10 елементів, кожним елементом якого є стрічка, в алфавітному порядку.

  4. На мові асемблер скласти програму сортування масиву цілих чисел в порядку спадання.

  5. На мові асемблер скласти програму, яка б шукала мінімальне число в масиві цілих чисел.

  6. На мові асемблер скласти програму яка генерує масив випадкових цілих чисел з 10 елементів.

  7. На мові асемблер скласти програму, яка створює масив цілих чисел, елементи якого – послідовний запис елементів з масиву mas1[10] і mas2[5].

  8. На мові асемблер скласти програму, яка створює масив цілих чисел, елементи якого – спільні елементи з масивів mas1[10] і mas2[10].

  9. На мові асемблер скласти програму, яка створює масив цілих чисел, елементи якого – відмінні елементи масивів mas1[5] і mas2[10].

  10. На мові асемблер скласти програму, яка створює масив з 10 цілих чисел елементи якого – максимальні елементи масивів mas1[5] і mas2[10].

  11. На мові асемблер скласти програму, яка створює масив з 10 цілих чисел елементи якого – мінімальні елементи масивів mas1[5] і mas2[10].

  12. На мові асемблер скласти програму, яка створює масив цілих чисел елементи якого – сума відповідних елементів масивів mas1[10] і mas2[10].

Лабораторна робота №5

Тема. Робота зі стрічками.

Мета: Засвоїти основи роботи зі стрічками на мові асемблер, вивчити основні команди для роботи з ними.

  1. Команди для роботи зі стрічками

Команди для роботи з стрічками компактний та потужний інструмент для обробки всіх типів даних, а не тільки символьних стрічок. Пам’ятайте, що стрічки в моаі асемблер це послідовність байтів, якиі можуть представляти, чи неможуть представляти ASCII- символи. Стрічкові команди поділяються на три групи:

  • Команди пересилки стрічок (lods(lodsb, lodsw), movs(movsb, movsw), stos(stosb, stosw))

LODSB

Синтаксис:lodsb FL: без змін

Семантика. Загрузка в регістр AL байта з комірки пам’яті за адресою DS:SI

якщо DF=0, то збільшується SI на 1;

якщо DF=1, то зменшується SI на 1;

Приклад.

lds SI, [dword ptr Ref]

lodsb ; неявне завантаження байту

LODSW

Синтаксис:lodsw FL: без змін

Семантика. Загрузка в регістр AL слова з комірки пам’яті за адресою DS:SI

якщо DF=0, то збільшується SI на 2;

якщо DF=1, то зменшується SI на 2;

Приклад.

lds SI, [dword ptr Ref]

lodsw ; неявне завантаження слова

MOVSB

Синтаксис:movsb FL: без змін

Семантика. Пересилання байта з комірки пам’яті за адресою DS:SI в комірку пам’ятті за адресою ES:DI.

якщо DF=0, то збільшується SI і DI на 1;

якщо DF=1, то зменшується SI і DI на 1;

Приклад.

lds SI, [dword ptr ScrRef]

les DI, [dword ptr DstRef]

cld

movsb ; пересилання трьох

movsb ; послідовних байтів

movsb ; вперед

MOVSW

Синтаксис:movsw FL: без змін

Семантика. Пересилання слова з комірки пам’яті за адресою DS:SI в комірку пам’ятті за адресою ES:DI.

якщо DF=0, то збільшується SI і DI на 2;

якщо DF=1, то зменшується SI і DI на 2;

Приклад.

lds SI, [dword ptr ScrRef]

les DI, [dword ptr DstRef]

std

movsw ; пересилання трьох

movsw ; послідовних слів

movsw ; назад

STOSB

Синтаксис:stosb FL: без змін

Семантика. Передача в комірку пам’яті за адресою ES:DI байта з регістра AL.

якщо DF=0, то збільшується DI на 1;

якщо DF=1, то зменшується DI на 1;

Приклад.

les DI, [dword ptr Ref]

mov AL,[byte ptr Fix]

std ; d=1

stosb ; неявне запам’ятовування

stosb ; двох байтів

STOSW

Синтаксис:stosw FL: без змін

Семантика. Передача в комірку пам’яті за адресою ES:DI слова з регістра AX.

якщо DF=0, то збільшується DI на 2;

якщо DF=1, то зменшується DI на 2;

Приклад.

les DI, [dword ptr Ref]

mov AX,[byte ptr Fix]

std ; d=1

stosw ; неявне запам’ятовування

stosw ; двох слів

  • Команди провірки стрічок (cmps(cmpsb, cmpsw), scas(scasb, scasw))

CMPSB

Синтаксис:cmpsb FL: a c o p s z

Семантика. Порівняння байтів по критерію різниці: [byte ptr DS:SI]-[byte ptr ES:DI]

а потім

якщо DF=0, то збільшується SI і DI на 1;

якщо DF=1, то зменшується SI і DI на 1;

Приклад.

mov AX,DS

mov ES,AX

mov DI, OFFSET Trg

mov SI,DI

cmps

je lab ;буде виконуватися передача управління

CMPSW

Синтаксис:cmpsw FL: a c o p s z

Семантика. Порівняння слів по критерію різниці: [word ptr DS:SI]-[ word ptr ES:DI]

а потім

якщо DF=0, то збільшується SI і DI на 2;

якщо DF=1, то зменшується SI і DI на 2;

Приклад.

mov AX,DS

mov ES,AX

mov DI, OFFSET Trg

mov SI,DI

cmpw

jz lab ;буде виконуватися передача управління

SCACB

Синтаксис:scacb FL: a c o p s z

Семантика. Порівняння байта, який міститься в AL, з байтом комірки пам’яті за адресою ES:DI з ціллю визначення різниці: AL-[byte ptr ES:DI]

а потім

якщо DF=0, то збільшується DI на 1;

якщо DF=1, то зменшується DI на 1;

Приклад.

mov CX,200

les DI, [dword ptr Ref]

std ; d=1

xor AL,AL

repe scasb ; виконувати поки z=1 або CX¹0

je Fail

inc DI

inc DI ; адрес першого нуля зліва

SCACW

Синтаксис:scacw FL: a c o p s z

Семантика. Порівняння слова, який міститься в AX, з словом комірки пам’яті за адресою ES:DI з ціллю визначення різниці: AX-[byte ptr ES:DI]

а потім

якщо DF=0, то збільшується DI на 2;

якщо DF=1, то зменшується DI на 2;

Приклад.

mov CX,100

les DI, [dword ptr Ref]

cld ; d=0

xor AL,AL

repe scasw ; виконувати поки z¹0 або CX¹0

je Fail

sub DI,2 ; ES:DI адрес слова з нульовим значенням

  • Команди повторення (rep(repe/ repz ,repne/ repnz))

REP

Синтаксис:rep FL: без змін

Семантика. Багатократне виконання команди, яка розташована після rep. Число повторень визначається вмістимим регістра CX. Після кожного виконання команди, розташованої після rep, виконується наступна операція CX:=CX-1. Якщо в момент виконання команди rep CX=0, то ніякого повторення не буде.

Приклад.

lds SI, [dword ptr ScrRef]

les DI, [dword ptr DstRef]

cld ; d=0

mov CX,20

rep movsb ; пересилка 20 байтів

Дозволяє командам працювати з стрічками довільної довжини

Команди пересилки стрічок пересилають байти чи слова з пам’яті в регістр, з регістра в пам’ять чи безпосередньо з пам’яті в пам’ять. Команди провірки стрічок дозволяють порівняти чи знайти байти чи слова. Команди повторення можуть додаватися до інших стрічкових команд6 створюючи команди, які повторюють стричкову операцію певне число разів до виконання заданої умови. Ці команди дозволяють швидко заповнювати заченнями тисячі байтів, копіювати стрічки з одного місця в інше і шукати необхидне значення в великих блоках пам’яті.

Всі стрічкові команди для виконання своїх функцій використовують певні регістри. Стрічкові команди завжди працюють з такими комбінаціями регістрів – ds:si , es:di. П’ять стрічкових команд загружають, записують, пересилають, порівнюють і виконують пошук байтів чи слів. Виконуючи це, кожна команда також збільшує чи зменшує значення в використаних нею регістрах. При операції з байтами виконується віднімання чи додавання 1 до регістру si чи di (чи обидвам), при операціях з словами віднімається чи додаєтьчя 2.

Прапорець df визначає чи повинна стрічкова команда приводити до збільшення чи зменшення si чи di. Якщо df=1, то індекси зменшуються в бік менших адресів. І навпаки при df=0. Для очистки прапорця df і автоматичному збільшені si чи di в бік високих адресів використовують команду cld. Використання std призводить до встановлення прапорця df і автоматичному зменшенню si чи di в бік менших адресів.

Команда lods завантажує дані, адресовані ds:si чи es:di в регістр al для байтових операцій і в ax дл операцій з словами. Після цього в залежності від того яке значення має df, збільшується чи зменшуєтьсязначення si. При операціях з байтами si змінюється на 1, при операціях з словами на 2. З допомогою цих команд можна скласти невеликий цикл для знаходження певного значення байту:

сld ;автозбільшення si

repeat:

lods [byte ptr ds:si] ; в al заноситься вмістиме ds:si і збільшується si на 1

or al,al ; перевіряється чи в al є 0

jne repeat ; якщо ні то цикл повторюється

Завантаження першого байту в al стрічки s1:

DATASEG

String db ‘This is string’,0

CODESEG

mov si, offset string; присвоїти si адрес стрічки

lods [string] ; отримати перший байт стрічки

Turbo Assembler перетворює команду lods в команду lodsb, з умовою, що ви загрузили в si зміщення string.

Команда stos записує байт з регістра al чи слово з регістра ax в пам’ять по адресу es:di. Так як і lods, в залежності від df і того, складаються дані з слів чи байтів, stos збільшує чи зменшує на 1 чи 2 значення в регістрі dі. Використання в циклі команд lods, stos дозволяє перемістити стрічку з одного місця пам’яті в інше:

cld ; автозбільшення si і di

repeat:

lodsw ; в ax вмістиме за адресою [si:di] і si збільшується на 2

cmp ax, 0fffh

je exit ; перехід якщо ax=0fffh

stosw ; в [si:di] записується вмістиме ax і di збільшується на 2

jmp repeat

exit:

Для пересилки байтів і слів між областями пам’яті використовується команда movs. Ця команда не потребує проміжкових регістрів для переміщення даних в пам’яті.

Movsb пересилає 1 байт з області за адресою ds:si чи es:si, по адресу es:di, збільшуються або зменшуються на 1 обидва індексні регістри. Movsw пересилає слово між двома областями пам’яті, збільшуються або зменшуються на 2 обидва індексні регістри. Цикл для пересилки:

cld ; автозбільшення si і di

mov cx, 100 ; cx в якості лічильника

rep movsb ; переслати 100 байт

Команда stos забезпечує простий спосіб заповнення пам’яті значеннями байтів чи словами. Наступний фрагмент забезпечує запис нулевих байтів в 512- байтовий блок пам’яті, що починається з мітки Buffer:

mov ax, SEG Buffer ; пересилка адреси сегмента Buffer

mov es, ax ; в сегментний регістр es

mov di, OFFSET Buffer ; пересилка зміщення в di

xor al,al ; визначення значення для запису в пам’ять

mov cx, 512 ; cx в якості лічильника

cld ; автозбільшення di

rep stosb ; обнулити 512 байт

Для пошуку в стрічках певних значень використовується команда scas. При кожному повторенні scas порівнює значення байта в al чи значення слова в ax з даними, які розташованні по адресу es:di. Потім регістр di збільшуються або зменшуються на 2.наступна проста послідовність операторів забезпечує пошук 0 серед 256 байт:

cld ; автозбільшення di

mov di, OFFSET Start ;початкова точка пошуку за адресою es:di

mov cx, 256 ; cx в якості лічильника

xor al,al ; al=0

repne scasb ; знайти в пам’яті значення рівне al

je MatchFound ; перехід якщо по адресу es:di –1 було знайдено 0

Коли нуль означає нуль? Якщо cx=0, тоді стрічкові команди, які повторюються виконаються 65536 раз. Але якщо ви хочете щоб нуль означав виконати операцію нуль раз, ви повинні до початку повторяючої операції провірити чи cx=0. Це можна зробити так:

or cx, cx ; cx=0?

jz Skip ; якщо так, то перехід

rep stosb ; тоді повторяти stosb

Skip:

Для цього є спеціальна команда умовного переходу:

jcxz Skip ; перехід якщо cx=0

rep stosb ; тоді повторяти stosb

Для порівняння двох стрічок використовується оператор cmp. Команда порівнює два байти чи два слова в es:di і ds:si чи es:si. Після порівняння два регістри збільшуються чи зменшуються на 1 при порівнянні байтів чи на 2 при порівнянні слів.

cld ; автозбільшення si і di

mov si, OFFSET S1 ; ds:si вказує на першу стрічку

mov di, OFFSET S2 ; es:di вказує на другу стрічку

mov cx, strlength ; в cx довжина стрічки

reps cmpsb ; порівняння двох стрічок

jb Less ; перехід, при S1>S2

ja Greater ; перехід, при S1<S2

je Equal ; перехід, при S1=S2

При натисненні на клавіатуру виробляється scan-код клавіші. Кожна клавіша має свій scan-код – це число в 1 байт. Працюючи з вводом з клавіатури ми використовуєм буфер клавіатури. Буфер клавіатури розміщається за адресою 41Ah—41Ch. Перед його використанням потрібно буфер очистити.

Очистка буфера..

Середній рівень.

mov AH,0Ch

mov AL,1

int 21h

Низькій рівень.

cli ;заборона переривання

sub AX,AX

mov ES,AX

mov AL,ES:[41Ah]

mov ES:[41Ch],AL

sti ;дозвіл переривання

Перевірка на наявність символів в буфері клавіатури.

Середній рівень

mov AH, 0Bh

int 21h

cmp AL, 0FFh

je …… ; якщо буфер не поржній

Низький рівень.

Порівнюємо вказівники буфера

mov AX,0

mov ES, AX ;на початок пам’яті

mov AL, ES:[41Ah] ;беремо перший вказівник

mov AH, ES:[41Ch] ;беремо другий вказівник

cmp AH,AL

jne ….. ;якщо не рівні, то до процедури виводу

Очікування вводу символу без виводу його на екран.

Середній рівень.

mov AH,7 ; номер функції

int 21h ; очікування вводу символа

cmp AL, 0 ; перевірка на розширений код

je COD ; якщо так, то на спеціальну процедуру

; інакше код символу в AL

; процедура опрацювання розширених кодів

COD: int 21h ; беремо другий байт коду

cmp AL, 75 ; первірка на стрілку

jne CR ; якщо ні, то наступна перевірка

jmp CUR ; якщо так, то спеціальна процедура

CR:cmp AL, … ; порівнюємо дані

Очікування натискування клавіші і вивід з ехом на екран.

Середній рівень.

mov AH,6 ; номер функції

mov DL,0FFh ; запит вводу з клавіатури

int 21h ; очікування вводу символа

jz …. ; перехід якщо немає символа

cmp AL, 0 ; перевірка на розширений код

je COD ; якщо так, то на спеціальну процедуру