Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
asm.doc
Скачиваний:
6
Добавлен:
09.11.2019
Размер:
913.41 Кб
Скачать

5. Команда lea

Команда завантаження ефективної адреси – LEA.

Схема команди :LEA приймач, джерело

Призначення: одержання ефективної адреси (зсуву, зміщення) джерела.

Алгоритм роботи: алгоритм роботи команди залежить від діючого режиму адресації (use16 або use32):

  • якщо use16, то в регістр приймач завантажується 16-бітне значення зсуву операнда джерело;

  • якщо use32, то в регістр приймач завантажується 32-бітне значення зсуву операнда джерело.

Стан ознак після виконання команди: виконання команди не впливає на ознаки.

Дана команда є альтернативою оператору асемблера OFFSET. На відміну від OFFSET команда LEA допускає індексацію операнда, що дозволяє більш гнучко організувати адресацію операндів.

  1. Команда роботи зі стеком 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]