Смекни!
smekni.com

Програмування на мові Асемблер (стр. 2 из 2)

- команди пересилки рядків

- команди перевірки рядків

- команди префікса повтору.

Команди обробки рядків 8086.

Команди пересилки рядків:

lods джерело - загрузка рядка байтів або рядка слів

lodsb - загрузка рядка байтів

lodsw - загрузка рядка слів

movs призи, джерело - пересилка рядка байтів або рядка слів

movsb - пересилка рядка байтів

movsw - пересилка рядка слів

stos призначення - запис рядка байтів або рядка слів

stosb - запис байта в рядок

stosw - запис слова в рядок

Команди перевірки рядків.

cmps призначення, джерело - порівняння рядків по байтах або словах

cmpsb - пересилка рядків по байтах

cmpsw - пересилка рядків по словах

scas призначення - пошук байта або слова в рядку

scasb - пошук байта в рядку

scasw - пошук слова в рядку

Команди префікса повторень

rep - повторення

repe/repz - повторення, поки =0

repne/repnz - повторення, поки не =0

Команди перевірення рядків пересилають байти або слова з пам’яті в регістр, з регістра в пам’ять або безпосередньо з пам’яті в пам’ять.

Команди перевірки рядків дозволяють порівнювати або знаходити байти або слова.

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

Насправді існує 5 рядкових команд: (хоч мнемонічних назв значно більше).bods, stos, movs, scas, cmps. Решта назв не вимагають оперантів, тому більш прості для використання.

Аналогічно, існує 2 префіксса повтору: команда rep ідентична командам repe i repz. Команди repne i rehnz також представляють одинаковий префікс.

2.Рядкові індексні регістри.

Рядкові команди працюють завжди з одними і тими же комбінаціями регістрів - dsisi i csidi - з індексними регістрами рядка-джерела і рядка призначення, які визнаяають зміщення в даних і сегментах.

АРЕФМЕТИЧНІ КОМАНДИ

Математичні команди в мові Ас. обмежуються додаванням, множенням, діленням, і відніманням знакових і безнакових цілих двійкових чисел.

КОМАНДИ ДОДАВАННЯ.

Є 5 команд додавання

add i adc сумують два байта або слова .

inc (інкремент) - команда швидкого додавання 1 до регістра або значення в пам’яті.

aaa i daa виконують корекцію значень представлених

в двійковому -10 форматі

1) Щоб додати 8- бітове значення в ah з 8-бітового значення в ah можна записати:

add ah, bh ; ah ¬ ah+bh

Команда сумує два значення і записує результат в

задане місце, замінюючи початкове значення.

2) Команда adc працює акалогічно, але додає до результату прапор переносу cf:

adc ah, bh ; ah ¬ ah+bh+cf

Якщо cf=1 то результат одержуємо такий же, як при додаванні 1 до суми ah i bh. Прапор cf встановлюється в 1, якщо в попередньому додаванні виникло переповнення . Тому adc частіше виконується після add, яке додає багатобайтові значення, повідомляючи про переноси , які виникають при додаванні окремих байтів.

3) Для сумування в регістрі ах окремих байтів 16-бітового значення записуємо по адресу sum, можна використовувати слідуючі команди які подвоюють слово sum:

mov ax, [wordsum] ;переслати в ax знач.[sum]

add al, [byte snm] ;додати молодший байт

adc ah [byte sum+1] ; додати старший байт з мож-

ливим переносом

mov [wordsum] , ax ;переслати одержане значення

назад в пам’ять

Пам’ятаєм, що в слові байти зберігаються в зворотньому порядку 1.к. загружає значення слова в ах;

2.к.задає один з другим молодші значущі байти, записуючи в al, і вип.переп. виснаження переносу встановлює cf в1; 3.к. додає цей можливий перенос до суми старших знач.байтів.4.к.записує кінцевий результат назад в пам’ять

Оскільки 8086 може безпосередьо працювати з словами ,то ці ж дії можна виконати двома командами:

mov ax, [word sum] ;переслати в ах значення

[sum]

add [word sum] ,ax ; додати [sum] до самого

себе

add не може додавати два значення , записані в пам’яті , тому потрібно визначити хоч один регістр

в який і заслати [sum].

В цих випадках оператори byte i word інформують асемблер про тип даних, які адресує[sum]. В деяких

випадках їх можна не використовувати, проте вони не зашкодять.

4) add i adc можуть додавати до регістра і значення в пам’яті безпосередні (літеральні) значення:

add bx,5 ;bx ¬bx+5

5) Щоб швидше додати 1 до деякого значення замість add використаємо inc, яка вимагає лише одного операнда.

inc ax ; ax¬ax+1

inc bx ; bx¬bx+1

inc cx ; cx¬cx+1

inc dx ; dx ¬dx+1

Ці команди збільшують на 1 значення 4-х регістрів загального призначення (16-бітові)

Можна на 1 збльшити 8-бітовий регістр:

inc dh ; dh¬dh+1

КОМАНДИ ВІДНІМАННЯ

По своїй формі віднімання в Ас.схоже з додаванням

Команда sum віднімає значення байтів або слів.

Команда sbb діє аналогічно, проте враховує можливу

помилку при попередньому відніманні багатобайтових

значень.

1) sub ax , bx ax¬ax-bx

2) Можна віднімати два регістри також можна віднімати безпосередні значення:

sub cx,5 ;cx¬cx-5

sub dx,[score] ; dx¬dx-[score]

sub [answer],3 ;[answer]¬[answer]-3

sub ax,1 ; ax¬ax-1

3) Останню команду можна замінити командою dec,

яка віднімає 1 з регістра або значення в пам’яті

На 1 можна зменшити також значення представлені байтом або словом.

dec ax ;ax¬ax-1

dec dl ;dl¬dl-1

dec si ;si¬si-1

ДИВНІ ВІДНІМАННЯ

Чому команди Neg (змінює знак двійкового значення) і Cmp (порівнює дві величини) стоять разом з командами віднімання ?

1) В випадку з neg CPU 8086 віднімає відповідні значення з 0.Це значення може бути записане в регістрі або пам’яті. При відніманні значень з 0 одержується значення в додатковому коді , або інакше двійкове доповнення цього значення, що

еквівалентне заміні всіх 0 на 1, а 1на 0 додаємо 1 Простіше скористатися командою neg:

neg ax ; одержання двійкового доповнення ах

neg [value] ;одер. Двійкового доповнення [value]

2) Більшість процесорів цифрових виконують порівняння шляхом віднімання одного значення з другого, а потім порівнюють результат. При цьому встановлюють біти різних прапорів описуючи тим самим результат наприклад, є він 0, від’ємним або додатнім. Cmp виконує віднімання аналогічно ком. Sub, проте зберігає при цьому тільки значення прапорів, які можуть перевірятись іншими командами,

МНОЖЕННЯ І ДІЛЕННЯ БЕЗНАКОВИХ ЗНАЧЕНЬ.

МНОЖЕННЯ І ДІЛЕННЯ ЗНАКОВИХ ЗНАЧЕНЬ.

Для правильного виконання множення і ділення вимагається бути уважним. Потрібно слідкувати за тим, щоб помістити значення в потрібні регістри. Після виконання операції потрібно уважно одержувати результат.

За роботою команд mul, imul, div, i idiv прослідкуємо на прикладі програми MULTDIV.ASM

Команди знакового множення (imul) і ділення (idiv)

працюють аналогічно mul div і використають ті ж регістри.(Буква «i» в символічному імені використовується для цілих чисел, показуючи, що допускаються як додатні так і від’ємні значення)

Різні допустимі діапазони значень.

Знаковий байт змінюється від -128 до +127

Знакове слово змінюється -32768 до 32767

в програмі, в якій використовується imul i idiv потрібно пам’ятати що:

1) від’ємний результат представляється в двійковому додатньому коді,

2) Будь-який залишок має той же знак, щой частка

3) Якщо попробувати виконати ділення на 0, і якщо результат від ділення не буде поміщатись в заданий операнд призначення, то буде генеруватись переривання ділення на 0, яке зупинить програму.

ПЕРЕТВОРЕННЯ БАЙТІВ , СЛІВ І ПОДВІЙНИХ СЛІВ

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

cbw-перетворити байт в слово

cwb-перетворити слово в двійкове слово

Команда cbw розширює 8- бітове значення до 16-бітового

Команда cwb розширює 16-бітове значення до 32-бітового двійкового слова.

Ці команди виконують однакові дії,за винятком кількості опрацьованих бітів.

Потрібно пам’ятати про обмеження:

Початкове значення для cbw повинно знаходитись в регістрі al 16-бітовий результат завжди поміщається в ах.

Початкове значення для cwd повинно зберігатись регістр ах 32-бітовий результат завжди поміщається в dx i ax.Як правило cbw i cwd використовуються разом з командами imul i idiv при необхідності ділення та множення байтової величини на слово.

Проте ці команди можна використовувати і в інших цілях.