Указания за лабораторна работа (Основи на асемблерния език), Асемблер
Ръководството съдържа материал за извършване на първата лабораторна работа по работа с асемблер
Следват извадки от ръководствата.
1. Асемблер за микропроцесори Intel 8086/8088
1.1. Формат на операторите на асемблер
Изявленията на компютърния език за асемблиране имат следния формат:
Програмата може да бъде написана както с главни, така и с малки букви. Етикет с произволна дължина трябва да бъде написан от началото на реда и отделен от кода на операцията с двоеточие, което може да бъде последвано от произволен брой интервали (до края на реда).
Операционният код трябва да бъде отделен от списъка с операнди с поне един интервал. Операндите са разделени един от друг със запетая.
1.2. Дефиниране на полета за памет за разполагане на данни
Следните изрази се използват за дефиниране на данни в основната памет и полета за резервна памет за данни, поставени в основната памет по време на изпълнение на програмата:
DB - дефиниране на еднобайтово поле, DW - дефиниране на дума (двубайтово поле), DD - дефиниране на двойна дума (четири-байтово поле).
Формат на командата: DB [ ] DW [ DUP (]< >[ )] DD ?
където е броят на полетата за памет с посочената дължина, който се определя от тази команда (показва се, ако е дефинирано повече от едно поле за памет); ? - използва се при резервиране на памет.
Ето няколко примера
- Запишете десетичното число 23 в байта от паметта и присвоете името a на този байт: a db 23.
- Резервирайте 1 байт памет: db ?
- Запишете шестнадесетичното число 1234 в думата от паметта: dw 1234H.
- Определете 31 байта памет, като повторите последователността 1, 2, 3, 4, 5, 1, 2, 3, 4. : db 31 dup (1,2,3,4,5)
1.3. Операнди на инструкции на асемблер
Операндите на инструкции на асемблер могат да бъдат дефинирани директно в инструкцията, разположена в регистри или в основната памет,
Данните, записани директно в команда, се наричат литерал. И така, в командатаmov ah, 33 е литерал.
Ако операндите на инструкциите на асемблера са в регистри, тогава имената на регистрите са посочени в съответните инструкции (освен ако използваните регистри не са специално посочени за тази инструкция. Например в горния пример ah е името на акумулиращия регистър.
включително OPND
Тук OPND е символното име на полето за памет, дефинирано от оператора на асемблера
OPND dw?
Ето два примера:[a + bx] и[bp]+[si] +6.
Дължината на операнда може да бъде определена от:
- а) команден код - в случай, че използваната команда обработва данни с определена дължина, която е специално уговорена;
- б) обемът на регистрите, използвани за съхраняване на операнди (1 или 2 байта);
- в) специални указатели байт ptr (1 байт) и дума ptr (2 байта), които се използват в случаите, когато дължината на операнда не може да бъде зададена по друг начин. Напримерmov byte ptr x, 255t. д. Операндът се изпраща към полето с име "x" и има дължина I байта.
1.4. Команди за прехвърляне на данни / преобразуване
1. Команда за прехвърляне на данни
използва се за прехвърляне на данни с дължина I или 2 байта от регистър към регистър, от регистър към основна памет, от основна памет към регистър и за запис на данни, директно записани в инструкция, в регистър или основна памет. Всички възможни трансфери са показани на фиг. 6.
Ето няколко примера
2. Комуникационна команда
ХCHG ,
организира обмена на съдържанието на два регистъра (с изключение на сегментните) или регистър и поле от основната памет. Например:
xchg bx, cx - обмен на съдържанието на регистрите bx и cx.
4. Команди за зареждане на указател
5. Инструкция за стек
6. Възстановяване на инструкция от стека
7. Команди за добавяне
задайте флагове за паритет, знак за резултат, наличие на пренасяне, наличие на препълване.
На фиг. 7 показва възможните начини за поставяне на термините, където a - операнди - думи, b - операнди - байтове.
Ето пример за събиране на две 32-битови числа:
mov ax, value1 add value2, ax mov ax, value1+2 adc value2+2, ax
8. Команди за изваждане
задаване на флагове за паритет, знак за резултат, наличие на заем, наличие на препълване.
При извършване на операция с командата SUB кредитът не се отчита, но с командата SBB се отчита. Ограниченията за местоположението на операндите са същите като за инструкцията за добавяне.
9. Команда за промяна на подписа
NEGЗнакът на операнда е обърнат.
10. Команда за добавяне на модул
INCСтойността на операнда се увеличава с единица.
11. Команда за изваждане на единица
DECСтойността на операнда се намалява с единица.
12. Команда за сравнение
CMP ,операцията за изваждане се извършва без запис на резултата и знаците се задават в регистъра на флаговете.
13. Команди за умножение
задайте флаговете за пренасяне или препълване.
По командата MUL числата се умножават без да се вземат предвид, а по командата - IMUL, като се вземе предвид знакът (в допълнителния код).
На фиг. 8(където a - операнди - думи, b - операнди - байтове) са дадени възможните начини за поставяне на факторите и резултата (един от факторите винаги се намира в акумулаторния регистър.
Помислете за пример:imul word ptr c
14. Дивизионно командване
С командата DIV операцията деление се извършва без отчитане, а с командата IDIV с отчитане на знака (в кода на комплемента на двойката).
На фиг. 9 показва възможните начини за поставяне на дивидент, делител и резултат (а - операнди - думи, b - операнди - байтове).
15. Команда за преобразуване на байт в дума и дума в двойна дума
При командата CBW числото от al се пренаписва в ax (добавянето се извършва чрез битове за знаци). По същия начин, с командата CWD, числото от ax се пренаписва в два регистъра dx и ax (dx:ax).
1.5. Команди за прехвърляне на контрол
1. Безусловна команда за скок
- a) : нито ( нито е командата "без операция");
- б) надпис близо (за вътрешносегментни преходи);
- в) етикет far (за преходи извън сегмента).
2. Команди за условен скок
Мнемоника на команда за условно разклоняване:
- JZ - скочи до "нула";
- JE - скок на "равно";
- JNZ - преход с "не нула";
- JNE - скок на "не е равно";
- JL - преминаване към "по-малко от";
- JNG,JLE - преминаване към "по-малко или равно на";
- JG - прескочи до "по-голямо от";
- JNL,JGE - прескачане с "по-голямо или равно на";
- JA - прескачане на "горе" (беззнаково по-голямо от);
- JNA,JBE - прескачане на "не по-високо" (без знак повече);
- JB - прескочи до "долу" (без знак по-малко от);
- JNB,JAE -скок на "не по-долу" (без знак не по-малко от).
3. Команди за организиране на циклична обработка
Съдържанието на регистърcx се използва като брояч на цикъл във всички инструкции за обработка на цикъл.
1) Екип за организация на цикъла
Забележка. Ако 0 се зареди в регистър cx преди началото на цикъла, тогава цикълът се изпълнява 35536 пъти.
2) Команда за скок при занулен брояч
JCXZ
3) Команди за организиране на цикъл с условие
mov cx, loop_count; брояч на зареждане jcxz end_of_loop; проверка на брояча begin_loop: ; . тяло на примка. cmp al, 100; проверка на съдържанието al loopne begin_loop ; връщане към цикъла, ако cx0 и al100 end_of_loop: .
4. Инструкции за извикване на подпрограми
1) Команда за извикване на процедура
call near ptr p - извикване на подпрограма "p". Текстът на процедурата трябва да бъде във формата: proc . процедурно тяло. край
2) Команда за връщане
1.6. Команди за обработка на низове
Задаването на необходимата стойност на флага за посока се извършва чрез специални команди:
STD - настройка на флага за посока на единица,CLD - нулиране на флага за посока на нула.
1) LODS команда за зареждане на низ
LODSB (байт за зареждане)
LODSW (зареждане на думи).
2) STOS команда за запис на линия
STOSB (запис на байт),STOSW (запис на дума)
3) Команда за преместване MOVS
4) SCAS команда за сканиране на линия
SCASB (търсене в байтове),SCASW (търсене по думи).
5) CMPS команда за сравнение на низове
CMPSB (сравнение на байтове),CMPSW (сравнение на думи)
6) Команда за повторение с префикс
ПРЕДСТАВИТЕЛ
ви позволява да организирате повторението на зададената команда CX пъти. Например:
rep stosb
7) Префикс команди "повтаряне до равенство" и "повтаряне докато не е равно"
РЕПЕ РЕПНЕ
Командите с префикс се използват заедно с командите CMPS и SCAS. Префиксът REPE означава да се повтаря, докато съдържанието на регистъра CX не е нула и стойността на флага за нула е единица, а REPNE означава да се повтаря, докато съдържанието на регистъра CX не е равно на нула и стойността на флага за нула е нула.
1.7. Инструкции за манипулиране на битове
1. Логически команди
- НЕ - логично НЕ;
- И, - логическо И;
- ИЛИ , - логическо ИЛИ;
- XOR, - изключително ИЛИ;
- ТЕСТ , - И без запис на резултата.
Операндите са байтове или думи.
Пример. Извлечете първия бит от числото в AL: и al, 10000000B
2. Команди за смяна
, Броячът се записва в регистъра CL. Ако броячът е 1, тогава той може да бъде записан в командата.
Кодове на команди за преместване
- SAL - аритметично ляво изместване;
- SHL - логическо изместване наляво;
- SAR - аритметично изместване надясно;
- SHR - логическо изместване надясно;
- ROL - ляво смяна циклично;
- ROR - дясно превключване циклично;
- RCL - циклично ляво изместване с флаг за пренасяне;
- RCR - циклично изместване надясно с флаг за пренасяне.
Пример. Умножете числото в AX по 10:
mov bx, ax shl ax, 1 shl ax, 1 добавяне на ax, bx shl ax, 1
1.8. I/O команди
Обменът на данни с външната среда се осъществява чрез следните команди:
- IN , (входот пристанище до регистрация),
- IN , DX (въвеждане от порта, чийто номер е посочен в DX регистъра към регистъра);
- OUT , (извежда съдържанието на регистъра към порта),
- OUT DX, (извежда съдържанието на регистъра към порта, чийто номер е посочен в регистъра DX).
Като регистър можете да посочите AL или AX (съответно ще бъдат обработени байт или два байта). Портът се идентифицира с някакво външно устройство (0.255).
Въпреки това, когато организирате I / O, в допълнение към самата операция, е необходимо да извършите редица допълнителни действия, например проверка на готовността на устройството. В тази връзка са разработени стандартни програми за организиране на вход-изход за типични устройства, които се извикват чрез командата за прекъсване int 21h.
Таблица 1 изброява основните функции, изпълнявани от входно-изходните подпрограми и техните кодове. Функционалният код трябва да бъде предаден на подпрограмата в регистър AH.
Задача за лабораторна работа №3
По-долу е примерен текст на програмата, която на асемблер в даден масив определя елемента с максимална стойност.
SGSTACK СЕГМЕНТ PARA STACK 'STACK' DB 32 DUP(?) SGSTACK ЗАВЪРШВА
СЕГМЕНТ ОТ ДАННИ PARA ПУБЛИЧНИ „ДАННИ“ MAX DW? МАСИВ DW 10H, 20H, 30H, 0D0H,0A0H КРАИ НА ДАННИТЕ
КОД СЕГМЕНТ PARA ПУБЛИЧЕН „КОД“ ПРЕДПОЛАГА CS:CODE, DS:DATA, SS:SGSTACK
ЦИКЪЛ: ДОБАВЯНЕ BX, 2; преминете към следващия елемент от масива CMP [BX], AX ; сравнете две стойности JBE BE ; скок, ако е равен или по-нисък от MOV AX, [BX] ; съхранява по-голяма стойност BE: LOOP CYCLE ; тест за излизане от цикъл (--CX при CX=0) MOV MAX, AX; съхраняване на максималната стойност
ИЗХОД: XOR AL, AL ; изход към OS MOV AH, 4CH INT 21H CODE ENDS END START
Работен ред
За да завършите лабораторията, трябва: