

Многострочное объявление данных (2 из 2)
Переменная ассоциирована только с первым
объявлением. Сравните значения возвращаемые
LENGTHOF и SIZEOF с рассмотренным ранее:
.data
array WORD 10,20 WORD 30,40 WORD 50,60
.code |
; |
2 |
mov eax,LENGTHOF array |
||
mov ebx,SIZEOF array |
; |
4 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
51 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|

Директива LABEL
•Определяет альтернативную метку для существующей
переменной и позволяет изменить ее тип (размер)
•LABEL не выделяет память
•Позволяет избежать использования оператора PTR
.data |
LABEL DWORD |
dwList |
|
wordList |
LABEL WORD |
intList |
BYTE 00h,10h,00h,20h |
.code |
; 20001000h |
|
mov eax,dwList |
||
mov cx,wordList |
; |
1000h |
mov dl,intList |
; |
00h |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
52 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|

Косвенная адресация
•Косвенные операнды
•Пример: суммирование элементов массива
•Операнды с индексом
•Указатели
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
53 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|

Косвенные операнды (1 из 2)
Косвенный операнд содержит адрес переменной, обычно массива или строки. Он может быть разыменован (как указатель).
.data |
|
val1 BYTE 10h,20h,30h |
|
.code |
|
mov esi,OFFSET val1 |
; разыменование ESI (AL=10h) |
mov al,[esi] |
|
inc esi |
; AL = 20h |
mov al,[esi] |
|
inc esi |
; AL = 30h |
mov al,[esi] |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
54 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|

Косвенные операнды (2 из 2)
Используйте PTR для явного указания размера операнда.
.data
myCount WORD 0
.code |
|
mov esi,OFFSET myCount |
; ошибка: двусмысленность |
inc [esi] |
|
inc WORD PTR [esi] |
; ok |
Необходимо ли использовать PTR ?
add [esi],20
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
55 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|

Пример: суммирование элементов массива
Косвенная адресация удобна для перебора элементов массива. Счетчик должен инкрементироваться на величину равную размеру элемента массива!
.data
arrayW WORD 1000h,2000h,3000h
.code |
|
mov esi,OFFSET arrayW |
|
mov ax,[esi] |
; либо: add esi,TYPE arrayW |
add esi,2 |
|
add ax,[esi] |
|
add esi,2 |
; AX = сумма элементов |
add ax,[esi] |
Задача: изменить пример для работы с двойными словами.
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
56 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|

Операнды с индексом
К косвенному операнду может добавляться смещение, которое будет учитываться при вычислении эффективного
адреса. Варианты описания:
[label + reg] |
label[reg] |
.data |
|
arrayW WORD 1000h,2000h,3000h |
|
.code |
|
mov esi,0 |
; AX = 1000h |
mov ax,[arrayW + esi] |
|
mov ax,arrayW[esi] |
; альтернативный формат |
add esi,2 |
|
add ax,[arrayW + esi] |
|
etc. |
|
Задача: изменить пример для работы с двойными словами.
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
57 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|

Масштабирование индекса
Косвенный операнд и операнд с индексом могут масштабироваться на величину соответствующую размеру
элемента массива. Для этого индекс умножается на TYPE
для массива:
.data
arrayB BYTE 0,1,2,3,4,5 arrayW WORD 0,1,2,3,4,5 arrayD DWORD 0,1,2,3,4,5
.code |
|
|
mov esi,4 |
; |
04 |
mov al,arrayB[esi*TYPE arrayB] |
||
mov bx,arrayW[esi*TYPE arrayW] |
; |
0004 |
mov edx,arrayD[esi*TYPE arrayD] |
; |
00000004 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
58 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|

Указатели
Переменная указатель содержит смещение относительно
начала сегмента другой переменной.
.data
arrayW WORD 1000h,2000h,3000h
ptrW DWORD arrayW |
|
.code |
|
mov esi,ptrW |
; AX = 1000h |
mov ax,[esi] |
Альтернативный формат:
ptrW DWORD OFFSET arrayW
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
59 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|

Команды JMP и LOOP
•Команда JMP
•Команда LOOP
•Пример использования LOOP
•Суммирование элементов массива
•Копирование строки
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
60 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|