- •Теоретичні відомості
- •1. Структура простої програми мовою асемблера. Формат кодування програми.
- •2. Основні директиви : segment , end, ends, proc, endp, assume.
- •3. Основні вимоги при створенні програми. Приклади простих програм мовою асемблера.
- •4. Трансляція програми. Опції компіляції та загальна характеристика.
- •6. Застосування програми налагодження для пошуку помилок.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи
- •Теоретичні відомості
- •1. Директиви визначення даних.
- •2. Директива повторення dup.
- •3. Сталі.
- •5. Представлення в пам’яті цілих чисел.
- •6. Команда пересилки даних mov.
- •7. Команди двійкового додавання та віднімання.
- •Команда зміни знаку операнда neg
- •8. Обчислення цілих арифметичних виразів.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Теоретичні відомості
- •1. Команда безумовного переходу jmp. Типи адресів переходу short,near та far.
- •2. Команди організації циклів ( loop,loopn,loopnz). Команда loop. Керування циклом за ecx/cx.
- •Керування циклом за ecx/cx із врахуванням ознаки zf
- •3. Команди умовних переходів.
- •5. Команда lea
- •Команда роботи зі стеком push та pop
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Логічні операції та операції зсувів.
- •2. Команди логічних операцій (and, test, or, xor, not).
- •3. Команди зсувів та циклічних зсувів.
- •Команди зсувів (sal, sar, shl,shr)
- •Команда зсуву логічного операнда вправо – shr
- •3.2 Команди циклічних зсувів (rol, ror ,rcl, rcr). Циклічний зсув операнда вліво - rol
- •Циклічний зсув операнда вправо ror
- •Циклічний зсув операнда вліво через ознаку переносу - rcl
- •Циклічний зсув операнда вправо через ознаку переносу – rcr
- •Бітові маски.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи
- •1. Множення цілих чисел
- •2. Ділення цілих чисел
- •3. Перетворення в регістрах
- •Алгоритм введення–виведення цілих чисел
- •Виведення цілих чисел.
- •Введення цілих чисел.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Теоретичні відомості
- •Особливості команд обробки рядків.
- •Ознака df. Команди зміни ознаки ( cld, std ).
- •Префікси повторення( rep, repe, repz, repne, repze ).
- •Команди обробки символьних рядків
5. Команда lea
Команда завантаження ефективної адреси – LEA.
Схема команди :LEA приймач, джерело
Призначення: одержання ефективної адреси (зсуву, зміщення) джерела.
Алгоритм роботи: алгоритм роботи команди залежить від діючого режиму адресації (use16 або use32):
якщо use16, то в регістр приймач завантажується 16-бітне значення зсуву операнда джерело;
якщо use32, то в регістр приймач завантажується 32-бітне значення зсуву операнда джерело.
Стан ознак після виконання команди: виконання команди не впливає на ознаки.
Дана команда є альтернативою оператору асемблера OFFSET. На відміну від OFFSET команда LEA допускає індексацію операнда, що дозволяє більш гнучко організувати адресацію операндів.
Команда роботи зі стеком push та pop
Команда розміщення операнда у стеку – PUSH.
Схема команди :PUSH джерело
Призначення: розміщення значення операнда джерело у стеку.
Алгоритм роботи:
зменшити значення покажчика стеку ESP/SP на 4/2 (у залежності від значення атрибута розміру адреси — use32 або use16);
записати джерело у вершину стеку.
Команда вилучення операнда зі стеку – POP.
Схема команди :POP приймач
Призначення: вилучення даних зі стеку в операнд приймач.
Алгоритм роботи:
завантажити в приймач вміст із вершини стеку( вершина адресується парою SS:ESP/SP);
збільшити вміст ESP/SP на 4/2 (відповідно для use32/use16)
Команда :PUSH використовується разом з командою POP для розміщення значень у стек і вилучення їх зі стека. Розмір значень, що записуються — слово або подвійне слово, в залежності від use32 або use16. Також до стека можна записувати безпосередні значення.
Зауваження. Вміст сегментного регістра CS в стек можна заносити, а зі стеку в це регістр записувати не можна.
Розв’язування задач за тематикою заняття
Задача 1. Задано цілі беззнакові числа a та b , цілі знакові c та d. Побудувати блок –схему та написати процедуру обчислення виразу :
де |
при а = 404 b =13 c = -34 d = 625 |
Блок-схема.
Data Segment para 'code'
a dw 657
b dw 265
c dw 738
d dw 273
f dw ?
Data Ends
Code Segment para 'code'
Main Proc far
ASSUME CS: Code,DS : Data
;.................... Основна програма.....................................
push DS
sub AX,AX
push AX
mov AX,Data
mov DS,AX
call CalcExpr
retf
Main Endp
CalcExpr Proc near ; Процедура обчислення виразу.
mov CX,c ; Записати в регістр СX число с.
cmp CX,d
jg m1
je m2
mov CX,d
inc CX
jmp m1
m2: mov CX,1
m1: mov AX,0
mov BX,a
add BX,b
jcxz m3
cmp CX,0
mov AX,BX
jg m4
m3: jmp me
m4: sub AX,CX
jle m5
jmp me
m5: cmp CX,a
jb m6
mov AX,c
add AX,d
jmp me
m6: mov AX,b
sub AX,CX
me: mov f,ax
ret ; Повернення з процедури.
CalcExpr Endp ; Директива кінця процедури.
Code Ends
End Main
Задача 2. Побудувати блок –схему та написати процедуру обчислення суми виразу
Розв’язування.
Блок-схема.
Data Segment para 'code'
S dw ?
n dw 8
Data Ends
Code Segment para 'code'
Main Proc far
ASSUME CS: Code,DS : Data
;.................... Основна програма.....................................
push DS
sub AX,AX
push AX
mov AX,Data
mov DS,AX
call CalcSumm
retf
Main Endp
CalcSumm Proc near ; Процедура обчислення виразу.
xor AX,AX ; AX =0 (S=0 , AX -> S).
mov CX,n ; CX -> n
mov BX,1 ; BX -> r
mov DI,2 ; DI -> q
mov SI,1 ; SI -> p : (-1)**(i+1) -1 1 -1 1 ... -1 1
mov BP,100 ; BP -> 100
m1: mov DX,BP
sub DX,BX ; 100-r
cmp SI,0 ; (-1)**(i+1)
jl m2
add AX,DX ; S=S+(100-r)
jmp m3
m2: sub AX,DX ; S=S-(100-r)
m3: add BX,DI ; q = q+2 (i*2)
neg SI ; 1 -1 1 -1
loop m1
mov S,AX
ret ; Повернення з процедури.
CalcSumm Endp ; Директива кінця процедури.
Code Ends
End Main
Задача 3. Задано два масиви X, Y розмірності n знакових та беззнакових цілих чисел. Написати програму впорядкування за зростанням елементів масивів.
Розв’язування.
Code Segment para 'code'
Assume cs:Code,ds:Code,es:Nothing
x db 83h,32h, 43h,34h,43h, 65h,93h, 48h,95h,37h
y db 5,8,-3,-6,-8,1,-1,0,7,-4
num =10
Main Proc far
push DS
sub AX,AX
push AX
mov AX,Code
mov DS,AX
lea SI,x ; Завантажити відносні адреси масивів X та
lea DI,y ; Y в індексні регістри SI та DI відповідно.
mov CX,num ; Кількість елементів масивів.
Enext: sub BX,BX ; Очистити регістр BX.
push CX ; Занести вміст регістра CX в стек.
mov AL, [SI] ; Гіпотеза. Нехай у регістрах AL і DL
mov DL, [DI] ; найменші елементи.
next: cmp AL,[BX+SI] ; Порівняння елемента масиву X з AL.
jb m1 ; перехід, якщо AL менше (для беззнакових)
xchg AL,[BX+SI] ; Обмін елементів регістр-пам’ять.
m1: cmp DL,[BX+DI] ; Порівняння елемента масиву Y з DL
jl m2 ; перехід, якщо DL менше (для знакових)
xchg DL,[BX+DI] ; Обмін елементів регістр-пам’ять.
m2: inc BX ;Збільшення вмісту регістра BX на 1,
;щоб вибирати наступні елементи масивів.
loop next ;Внутрішній цикл .
pop cx ; Віднови вміст регістра CX для
; зовнішнього циклу .
mov [SI],AL ; Записати найменші елементи під-масиву
mov [DI],DL ; на першу позицію.
inc SI ; Збільшення вміст регістрів SI і DI на 1, щоб
inc DI ; продовжити пошук елементів
; (розмірність підмасиву зменшується на 1).
loop Enext ; Зовнішній цикл .
retf
Endp
Code Ends
End Main