230 likes | 478 Views
Основни групи инструкции в асемблер. Прехвърляне на данни и работа със стека Копиране на данни - mov. mov ax,10 ;AX <- 10 ; индиректно _ адресирана _ клетка <- 10 mov WORDPTR[bx] ,10 mov ax,bx ;AX <- BX
E N D
Основни групи инструкции в асемблер • Прехвърляне на данни и работа със стека • Копиране на данни - mov mov ax,10 ;AX <- 10 ; индиректно_адресирана_клетка<- 10 mov WORDPTR[bx],10 mov ax,bx ;AX <- BX mov ax,mem1 ;Задължителна двойка инструкцииmov mem2,ax ;за копиране от едно място на ;паметта (mem1) в друго (mem2) mov ax,ds ;Задължителна двойка инструкции mov es,ax ;за копиране от един сегментен ;регистър (DS) в друг (ES) Примери
Основни групи инструкции в асемблер • Прехвърляне на данни и работа със стека • Размяна на данни - xchg xchg ax,bx ;Размяна съдържанието на два регистъра xchg mem,ax ;Размяна съдържанието на ;регистър с памет xchg mem1,mem2 ;Грешка xchg ax,ds ;Грешка – сегментен регистър не може да ;бъде операнд
Основни групи инструкции в асемблер • Прехвърляне на данни и работа със стека • Операции със стек - push, pop push ax ;Стек <- AX push mem ;Стек <- клетка от паметта push WORDPTR[bx] ;Стек <- клетка, адресирана ;индиректно pop cx ;Стек -> CX pop mem ;Стек -> клетка от паметта pop DWORDPTR[si] ;Стек -> клетка, адресирана ;индиректно pusha ;Стек <- всички регистри popa ;Стек -> всички регистри
Основни групи инструкции в асемблер • Аритметични операции • Операндите трябва да бъдат с еднакъв размер. • Само единият операнд може да бъде клетка от паметта. • Събиране/Изваждане – add/sub, inc/dec • Операциите променят флаговите битове: OF, SF, ZF, AF, PF, CF.
Основни групи инструкции в асемблер • Аритметични операции 1. Събиране/Изваждане – add/sub, inc/dec Примери .DATA v1 WORD 10 v2 BYTE 30 .CODE mov al,20 ;AL <- 20 add al,v2 ;AL <- 50 sub al,BYTEPTR v1 ;AL <- 40 inc al ;AL <- 41 dec v1 ;v1 <- 9
Основни групи инструкции в асемблер • Аритметични операции • Умножение/Деление • mul/imul – умножение на числа без/със знак • Множимото се намира в: AL, AX или EAX • Резултатът остава в: AX, DX:AX или EDX:EAX • Ако AH, DX или EDX са с ненулев резултат в резултат на умножението, то флаговете OF и CF са в “1”. Примери v SWORD-3 mov al,20 ;AL <- множимо (20) mov bl,30 ;BL <- множител (30) mul bl ;Резултат=AL*BL,т.е. AX <- 600 ;OF и CF са “1” imul v ;Резултат=AX*v, т.е. AX <- -1800 ;и DX <- 0; OF и CF са “1”
Основни групи инструкции в асемблер • Аритметични операции • Умножение/Деление • div/idiv – деление на числа без/със знак Примери mov ax,500 ;AX <- делимо (500) mov bl,100 ;BL <- делител (100) div bl ;Резултат= AX/BL, ;AL <- 5 (частно) и AH <- 0 (остатък)
Основни групи инструкции в асемблер • Поразредни операции • Логически – and, or, xor, not, test • Операциите: and, or, xorменят флаговете: OF, SF, ZF. • Операцията test е както andбез да записва резултат. Примери mov ax,35h ;AX <- 0000000000110101 and ax,0FBh ;Маска = 11111011, Нулира бит 2, AX <- 31 test al,00100000 ;Ако бит 5 на AL=1, то ZF=0
Основни групи инструкции в асемблер • Поразредни операции • Преместване • Аритметично в ляво: shl, sal • Аритметично в дясно: shr, sar • Ротация в ляво: rol, rcl (през CF) • Ротация в дясно: ror, rcr(през CF) операция операнд, брояч регистър или памет
Основни групи инструкции в асемблер • Поразредни операции • Преместване • Операциите оказват влияние на флаговете: OF, SF, ZF, CF. • При операциите: shl, sal, shrизместеният бит от края се копира във флаг CF, а крайният (ляв или десен) се нулира. • При операцията sar най-десният се копира в CF, а най-левият запазва стойността си.
Основни групи инструкции в асемблер • Управление на изпълнението на програма • Промяна на флагове • За флаг пренос – установяване/нулиране: stc/clc • За флаг посока – установяване/нулиране: std/cld • За флаг прекъсване – установяване/нулиране: sti/cli • Безусловно предаване на управлението jmpоперанд етикет или адрес
Основни групи инструкции в асемблер • Управление на изпълнението на програма • Условно предаване на управлението • В зависимост от регистър СХ jxxxxетикет jcxzетикет премини към етикет, ако CX e нула
Основни групи инструкции в асемблер • Управление на изпълнението на програма • Условно предаване на управлението • В зависимост от флагове
Основни групи инструкции в асемблер • Управление на изпълнението на програма • Условно предаване на управлението • След сравняване на две стойности cmpoперанд1,операнд2
Основни групи инструкции в асемблер Организация на разклонения • Алтернатива с празен клон Общ вид IF условиеTHENпоследователност ; Ако променлива choice < 5, то тогава: 1)var+1; 2)choice=0 cmp choice,5 jnl l1 inc var mov choice,0 l1:. . .
Основни групи инструкции в асемблер Организация на разклонения • Алтернатива с два клона Общ вид IFусловиеTHENпоследователност1ElSEпоследователност2 ; Ако choice > 0 , то тогава good_choice+1, ; а в противен случай – bad_choice+1 cmp choice,0 jgl1 jmp l2 l1: inc good_choice jmp l3 l2: inc bad_choice l3: . . .
Основни групи инструкции в асемблер Организация на разклонения • Многозначно разклонение (SWITCH) ; Ако choice = 1, да се извика процедура display, при ; choice = 2 да се извика get_in, а при choice = 3 – sort cmp choice,1 jel1 cmp choice,2 jel2 cmp choice,3 jel3 jmp l4 l1: call display jmp l4 l2: call get_in jmp l4 l3: call sort l4: продължение
Основни групи инструкции в асемблер Организация на цикли • По подразбиране БРОЯЧЪТ на цикъл е регистъра СХ. • СХ автоматично се намалява с 1 при всяка стъпка на цикъла. loop етикет ; край на цикъл при СХ=0 loopne/loopnzетикет ; край на цикъл при ; СХ=0 или ZF=1 loope/loopzетикет ; край на цикъл при ; СХ=0 или ZF=0
Основни групи инструкции в асемблер Организация на цикли ; Цикъл за събиране на 100 числа, съхранявани като думи .DATA table WORD 100DUP(?) .CODE mov ax,0 ; В регистър АХ ще се натрупва сумата mov si,0 ; SI ще следи индекса на поредното число mov cx,LENGTH table ; В СХ се зареждат брой числа l1: add ax,table[si] ; Прибавяне на поредното число add si,TYPE table ; Увеличаване на индекса с 2 loop l1 ; Преход при СХ различно от нула
Основни групи инструкции в асемблер • Обработка на символни низове • Преди прилагане на инструкциите се извършва следната последователност от действия: • Установяване на флаг за посока на обработката • std (DF=1) -> За обработка на низа отдясно наляво • cld (DF=0) -> За обработка на низа отляво надясно • Зареждане на брой итерации в СХ • Зареждане на начален адрес на низ-източник в DS:SIи на низ-приемник – в ES:DI • Повторение на изпълнението на една инструкция за обработка на символен низ
Основни групи инструкции в асемблер • Обработка на символни низове • Повторение на изпълнението на една инструкция за обработка на символен низ: • rep– повтаря СХ пъти • repe/repz – повтаря най-много СХ пъти докато стойностите са равни • repne/repnz – повтаря най-много СХ пъти докато стойностите не са равни
Основни групи инструкции в асемблер • Обработка на символни низове • Инструкции
Основни групи инструкции в асемблер Пример • Обработка на символни низове ; Копиране на низ от едно място на паметта в друго .MODEL small .DATA sour BYTE 10 DUP(‘0123456789’); Низ източник: 100 байта dest BYTE 100 DUP(?) ; Низ приемник .CODE mov ax,@data ; Зареждане на сегментен адрес mov ds,ax ; в регистър DS mov es,ax ; и в регистър ES cld ; Посока отляво надясно mov cx,LENGTHOF sour ; CX <-100 mov si,OFFSET sour ; SI <- отместване на източник mov di,OFFSET dest ; DI <- отместване на приемник rep movsb ; Копиране на 100 байта . . .