Команда JMP
•Команда JMP выполняет безусловный переход на метку, обычно внутри одной и той же процедуры.
•Синтаксис: JMP целевая_метка
•Логика: EIP ← целевая_метка
•Пример:
top:
.
.
jmp top
Переход на метку внешнюю метку осуществляется путем использования глобальных меток global label (см. 5.5.2.3).
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
61 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Команда LOOP
•Команда LOOP реализует цикл
•Синтаксис: LOOP метка_конца_цикла
•Логика:
•ECX ← ECX – 1
•если ECX != 0, переход на метка_конца_цикла
•Реализация:
•Ассемблер рассчитывает расстояние в байтах между смещением следующей инструкции и меткой конца цикла. Оно называется относительным смещением
(relative offset).
•Относительное смещение прибавляется к EIP.
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
62 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Пример использования LOOP
Следующий цикл вычисляет сумму
5 + 4 + 3 +2 + 1:
смещение |
машинный код |
исходный код |
|||
00000000 |
66 |
B8 |
0000 |
mov |
ax,0 |
00000004 |
B9 |
00000005 |
mov |
ecx,5 |
|
00000009 |
66 |
03 |
C1 |
L1: add |
ax,cx |
0000000C |
E2 |
FB |
|
loop |
L1 |
0000000E |
|
|
|
|
|
Когда командп LOOP ассемблируется, IP = 0000000E (смещение следующей команды). –5 (FBh) добавляется к IP, что приводит к переходу на команду со смещением 00000009:
00000009 ← 0000000E + FB
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
63 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Задача |
|
|
mov ax,6 |
Какое значение содержится в AX |
mov ecx,4 |
L1: |
|
после выполнения кода? |
inc ax |
loop L1 |
|
Сколько раз будет выполнен |
mov ecx,0 |
цикл? |
X2: |
inc ax |
|
|
loop X2 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
65 |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
Задача
Если относительное смещение представляет собой однобайтовое значение со знаком,
(a)какой минимально возможный переход?
(b)какой максимально возможный переход?
(a)−128
(b)+127
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
64 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Вложенный цикл
Вложение циклов производится путем сохранения значения счетчика внешнего цикла. В следующем примере, внешний цикл выполняется 100 раз, а внутренний 20 раз.
.data |
|
|
|
|
count DWORD ? |
|
|
|
|
.code |
; инициализация внешнего счетчика |
|||
mov ecx,100 |
||||
L1: |
; сохранение внешнего счетчика |
|
||
mov count,ecx |
|
|||
mov ecx,20 |
; установка внутреннего счетчика |
|||
L2: . |
|
|
|
|
. |
; повтор внутреннего цикла |
|
||
loop L2 |
|
|||
mov ecx,count |
; восстановление внешнего счетчика |
|||
loop L1 |
; повтор внешнего цикла |
|
||
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 |
http://ppl.yohng.com |
Web site Examples |
66 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
||||
|
|
|||
|
|
|
|
11
Суммирование элементов массива
Расчет суммы элементов массива 16-битных целых чисел
.data |
|
intarray WORD 100h,200h,300h,400h |
|
.code |
; address of intarray |
mov edi,OFFSET intarray |
|
mov ecx,LENGTHOF intarray |
; loop counter |
mov ax,0 |
; zero the accumulator |
L1: |
; add an integer |
add ax,[edi] |
|
add edi,TYPE intarray |
; point to next integer |
loop L1 |
; repeat until ECX = 0 |
Задача. Что необходимо изменить в программе, если в массиве хранятся двойные слова?
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
67 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
localloop:
neg |
val |
js |
short localloop |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
69 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Копирование строки
Копирование строки из источника в приемник:
.data |
BYTE |
"This is the source string",0 |
|
source |
хороший пример |
||
target |
BYTE |
SIZEOF source DUP(0) |
использования |
|
|
|
SIZEOF |
.code |
esi,0 |
; index register |
mov |
||
mov |
ecx,SIZEOF source |
; loop counter |
L1: |
al,source[esi] |
; get char from source |
mov |
||
mov |
target[esi],al |
; store it in the target |
inc |
esi |
; move to next character |
loop |
L1 |
; repeat for entire string |
Перепишите программу с использованием косвенной адресации
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
68 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
12