Язык ассемблера для процессоров
INTEL, 4-е издание
Кип Р. Ирвин
Глава 4: Пересылка данных,
адресация и арифметика
Слайды подготовил: Кип Р. Ирвин
Редакция: С.Б. Мусин
(c) Pearson Education, 2002. All rights reserved. You may modify and copy this slide show for your personal use, or for use in the classroom, as long as this copyright statement, the author's name, and the title are not changed.
Обзор главы
•Команды пересылки данных
•Сложение и вычитание
•Операторы и директивы для работы с данными
•Косвенная адресация
•Команды JMP и LOOP
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
2 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Команды пересылки данных
•Типы операндов
•Обозначение типов операндов
•Прямая адресация операндов в памяти
•Команда MOV
•Перемещение с расширением значения
•Команда XCHG
•Операнды с непосредственно заданным значением
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
3 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Типы операндов
•Основные типы операндов:
•непосредственный (immediate)
•целочисленная константа (8, 16, 32 бит), содержится в команде
•регистровый (register)
•ссылка на данные, содержащиеся в регистре;
•в команде указывается номер регистра
•в памяти (memory)
•данные содержатся в памяти, местоположение определяется эффективным адресом
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
4 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Условное обозначение типов операндов
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
5 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
||
|
|
|
Прямая адресация операндов в памяти
•задается смещение операнда в памяти относительно базового сегмента
•используется для доступа к глобальным переменным
.data |
ассемблер автоматически заменяет имена на |
|
||
var1 BYTE 1 |
смещения и формирует полный адрес операнда |
|
||
.code |
|
mov al, [00010400] |
|
|
|
; AL = 10h |
|
||
mov al,var1 |
|
|
||
mov al,[var1] |
|
; AL = 10h |
|
|
альтернативная |
|
|
|
|
форма записи |
|
|
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 |
http://ppl.yohng.com |
Web site Examples |
6 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
||||
|
|
|||
|
|
|
|
1
|
Команда MOV |
|
|
|
|
Задача |
|
|||
• |
Копирует данные из источника в приемник. |
|
|
Найдите ошибки: |
|
|
||||
Синтаксис: MOV приемник,источник |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|||
• |
Пересылка память-память запрещена |
|
|
.data |
BYTE |
100 |
|
|
||
• Регистры CS, EIP, IP не могут быть приемниками |
|
|
bVal |
|
|
|||||
• |
Нельзя перемещать непосредственно заданное |
|
|
bVal2 BYTE |
? |
|
|
|||
|
|
wVal |
WORD |
2 |
|
|
||||
|
значение в сегментный регистр |
|
|
|
dVal |
DWORD |
5 |
|
|
|
|
.data |
|
|
|
|
.code |
|
|
|
|
|
count BYTE 100 |
|
|
|
|
mov ds,45 |
|
|
|
|
|
|
|
|
|
mov esi,wVal |
|
|
|||
|
wVal WORD 2 |
|
|
|
|
|
|
|||
|
.code |
|
|
|
|
mov eip,dVal |
|
|
||
|
mov bl,count |
|
|
|
|
mov 25,bVal |
|
|
||
|
mov ax,wVal |
|
|
|
|
mov bVal2,bVal |
|
|
||
|
mov count,al |
|
|
|
|
|
|
|
|
|
|
mov al,wVal |
|
; error |
|
|
|
|
|
|
|
|
mov ax,count |
|
; error |
|
|
|
|
|
|
|
|
mov eax,count |
|
; error |
|
|
|
|
|
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site |
Examples |
7 |
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
8 |
|||
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
||||||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
Расширение значений без знака
Команда MOVZX перемещает значения без знака из меньших регистров и ячеек памяти в большие, обнуляя старшие биты
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov bl,10001111b |
|
|
|
|
|||||
movzx ax,bl |
|
|
; zero-extension |
|
|||||
Приемником может быть только регистр! |
|
||||||||
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 |
http://ppl.yohng.com |
Web site Examples |
9 |
||||||
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||||||||
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
Расширение со знаком
Команда MOVZX перемещает значения без знака из меньших регистров и ячеек памяти в большие, расширяя знаковый бит
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov bl,10001111b |
|
|
|
|
|||||
movsx ax,bl |
|
|
; sign extension |
|
|||||
Приемником может быть только регистр! |
|
||||||||
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 |
http://ppl.yohng.com |
Web site Examples |
10 |
||||||
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||||||||
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
Команда XCHG
XCHG используется для обмена значений операндов. Хотя бы один операнд должен быть регистром. Использование непосредственных значений запрещено.
.data
var1 WORD 1000h var2 WORD 2000h
.code
xchg ax,bx |
; exchange 16-bit regs |
|
xchg ah,al |
; exchange 8-bit regs |
|
xchg var1,bx |
; exchange |
mem, reg |
xchg eax,ebx |
; exchange |
32-bit regs |
xchg var1,var2 |
; error: two memory operands |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
11 |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
Прямая адресация с непосредственно заданным смещением (1 из 2)
•задается смещение относительно операнда в памяти
•используется для доступа к элементам массива
.data
arrayB BYTE 10h,20h,30h,40h
.code
mov |
al,arrayB+1 |
; |
AL = 20h |
mov |
al,[arrayB+1] |
; |
alternative notation |
Q: Почему arrayB+1 не 11h?
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
12 |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
2
Прямая адресация с непосредственно заданным смещением (2 из 2)
В ЯА нет автоматической проверки выхода за границу массива!
.data |
WORD 1000h,2000h,3000h |
|
arrayW |
||
arrayD |
DWORD 1,2,3,4 |
|
.code |
|
; AX = 2000h |
mov ax,[arrayW+2] |
||
mov ax,[arrayW+4] |
; AX = 3000h |
|
mov eax,[arrayD+4] |
; EAX = 00000002h |
|
; Ассемблируются ли следующие команды? |
||
mov ax,[arrayW-2] |
; ?? |
|
mov eax,[arrayD+16] |
; ?? |
Что получится в результате их выполнения?
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
13 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Задача 2
• Напишите программу которая складывает три байта:
.data
myBytes BYTE 80h,66h,0A5h
•Какой результат выполнения следующих команд? mov al,myBytes
add al,[myBytes+1] add al,[myBytes+2]
•Какой результат выполнения следующих команд? mov ax,myBytes
add ax,[myBytes+1] add ax,[myBytes+2]
•Какие еще есть варианты решения?
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
15 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Задача 1
Напишите программу которая меняет порядок элементов в массиве на обратный: 3, 1, 2.
.data
arrayD DWORD 1,2,3
•Шаг 1: скопировать первое значение в EAX и поменять это значение со вторым.
mov eax,arrayD
xchg eax,[arrayD+4]
•Шаг 2: Поменять значение в EAX с третьим элементом массива, затем переместить содержимое регистра на место первого элемента.
xchg eax,[arrayD+8] mov arrayD,eax
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
14 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Задача 2 (продолжение)
.data
myBytes BYTE 80h,66h,0A5h
• Есть ли ошибка в следующем решении?
movzx |
ax,myBytes |
|
mov |
bl,[myBytes+1] |
|
add |
ax,bx |
|
mov |
bl,[myBytes+2] |
; AX = sum |
add |
ax,bx |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
16 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
|
Сложение и вычитание |
|
|
|
INC and DEC Instructions |
|
|||
• Команды INC и DEC |
|
|
• |
+ 1, - 1 |
|
|
|||
• Команды ADD и SUB |
|
|
|
|
|||||
• |
Команда NEG |
|
|
|
|
• операнд – регистр или память |
|
||
|
|
|
• |
INC приемник |
|
|
|||
• |
Вычисление арифметических |
|
|
|
|
||||
|
|
|
• приемник ← приемник + 1 |
|
|||||
|
выражений |
|
|
|
|
|
|||
|
|
|
|
• |
DEC приемник |
|
|
||
• |
Устанавливаемые флаги |
|
|
|
|
||||
|
|
|
• приемник ← приемник – 1 |
|
|||||
|
• |
Zero |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
||
|
• |
Sign |
|
|
|
|
|
|
|
|
• |
Carry |
|
|
|
|
|
|
|
|
• |
Overflow |
|
|
|
|
|
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
17 |
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
18 |
|||
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||||||
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
3
Пример использования INC и DEC
.data |
|
myWord WORD 1000h |
|
myDword DWORD 10000000h |
|
.code |
; 1001h |
inc myWord |
|
dec myWord |
; 1000h |
inc myDword |
; 10000001h |
mov ax,00FFh |
; AX = 0100h |
inc ax |
|
mov ax,00FFh |
; AX = 0000h |
inc al |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
19 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Задача
Вычислите значение приемника после выполнения каждой команды:
.data |
|
myByte BYTE 0FFh, 0 |
|
.code |
; AL = |
mov al,myByte |
|
mov ah,[myByte+1] |
; AH = |
dec ah |
; AH = |
inc al |
; AL = |
dec ax |
; AX = |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
20 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Команды ADD и SUB |
|
Пример |
• ADD приемник, источник |
|
|
• приемник ← приемник + source |
.data |
|
• SUB приемник, источник |
var1 DWORD 10000h |
|
• приемник ← приемник – source |
var2 DWORD 20000h |
; ---EAX--- |
.code |
||
• Те же правила что и для команды MOV |
mov eax,var1 |
; 00010000h |
add eax,var2 |
; 00030000h |
|
|
add ax,0FFFFh |
; 0003FFFFh |
|
add eax,1 |
; 00040000h |
|
sub ax,1 |
; 0004FFFFh |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
21 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
22 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||||
|
|
|
|
Команда NEG
Изменяет знак операнда (регистр или память) на противоположный.
.data |
|
valB BYTE -1 |
|
valW WORD +32767 |
|
.code |
; AL = -1 |
mov al,valB |
|
neg al |
; AL = +1 |
neg valW |
; valW = -32767 |
Пусть в AX –32 768 и мы применяем NEG.
Каким будет результат?
Влияние команды NEG на флаги
ЦП реализует NEG следующим образом:
SUB 0,операнд
Любой ненулевой операнд приводит у установке CF
.data
valB BYTE 1,0 valC SBYTE -128
.code |
; CF = 1, OF = 0 |
|||
neg valB |
||||
neg [valB + 1] |
; CF |
= 0, |
OF = |
0 |
neg valC |
; CF |
= 1, |
OF = |
1 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
23 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
24 |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
4
Трансляция арифметических выражений
Компилятор языка высокого уровня транслирует арифметические выражения в машинный код.
Рассмотрим процесс трансляции в ЯА на примере
Rval = -Xval + (Yval – Zval)
Rval DWORD ?
Xval DWORD 26
Yval DWORD 30
Zval DWORD 40
.code |
|
|
|
mov eax,Xval |
; EAX = -26 |
|
|
neg eax |
|
||
mov ebx,Yval |
; EBX = -10 |
|
|
sub ebx,Zval |
|
||
add eax,ebx |
; -36 |
|
|
mov Rval,eax |
|
||
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
25 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Задача
Перевести следующее выражение на ЯА. Нельзя изменять значение Xval, Yval, Zval:
Rval = Xval - (-Yval + Zval)
Все значения двойные слова со знаком.
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
26 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Флаги, устанавливаемые арифметическими командами
•АЛУ оказывает влияние на флаги состояния при выполнении арифметических и битовых операций.
•флаг устанавливается в зависимости от результата выполнения команды, помещаемого в приемник
•Основные флаги:
•ZF (Zero flag) – результат нулевое значение
•SF (Sign flag) – результат отрицательное значение
•CF (Carry flag) – переполнение значения без знака
•OF (Overflow flag) – переполнение значения со знаком
•Команда MOV не оказывает влияния на флаги.
•Команды INC и DEC не устанавливают CF.
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
27 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Карта представлений
ЦП
является исполняет частью
executes АЛУ
Условные переходы
Арифметические и
битовые операции |
присоединены |
используются представляют |
|
|
влияют на
Флаги состояния Ветвящуюся
логику
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
28 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Флаг нуля (ZF)
Флаг ZF (Zero flag) устанавливается если приемник команды содержит нулевое значение.
mov cx,1 |
; CX = 0, ZF = 1 |
|||||
sub cx,1 |
||||||
mov ax,0FFFFh |
; AX |
= |
0, |
ZF |
= |
1 |
inc ax |
||||||
inc ax |
; AX |
= |
1, |
ZF |
= |
0 |
Запомните...
•Флаг установлен, если соответствующий бит равен 1.
•Флаг cсброшен если соответствующий бит равен 0.
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
29 |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
Флаг знака (SF)
Флаг SF (Sign flag) устанавливается если приемник команды содержит отрицательное значение, в противном случае флаг сбрасывается.
mov cx,0 |
; CX |
= |
-1, SF = 1 |
sub cx,1 |
|||
add cx,2 |
; CX |
= |
1, SF = 0 |
Флаг знака – копия старшего бита приемника:
mov al,0 |
; |
AL |
= 11111111b, SF |
= |
1 |
sub al,1 |
|||||
add al,2 |
; |
AL |
= 00000001b, SF |
= |
0 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
30 |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
5
Целые числа со знаком и без
сточки зрения аппаратуры
•Команды ЦП оперируют с числами со знаком и без знака одинаково
•ЦП не различает чисел со знаком и без знака
•Программист, самостоятельно определяет
использование правильного типа для каждой
команды
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
31 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Added Slide. Gerald Cahill, Antelope Valley College
Флаг переноса и переполнения
сточки зрения аппаратуры
•Команда ADD изменяет OFи CF следующим образом:
•OF = (перенос из MSB) XOR (перенос в MSB)
•CF = (перенос из MSB)
•Команда SUB изменяет OF и CF:
•NEG источника и ADD с приемником
•OF = (перенос из MSB) XOR (перенос в MSB)
•CF = ИНВЕРТИРОВАТЬ (перенос из MSB)
MSB = Most Significant Bit (старший бит)
XOR = eXclusive-OR (исключающее или)
NEG = Negate (SUB 0,operand )
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
32 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Added Slide. Gerald Cahill, Antelope Valley College
Флаг переноса (CF)
Флаг CF (Carry flag) устанавливается если в результате выполнения операции возник перенос и приемник содержит значение без знака.
mov al,0FFh |
; CF = |
1, AL = |
00 |
add al,1 |
|||
; Try to go below zero: |
|
|
|
mov al,0 |
; CF = |
1, AL = |
FF |
sub al,1 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
33 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Задача
Укажите содержимое приемника и установку SF, ZF и CF:
mov ax,00FFh |
; AX= |
SF= |
ZF= |
CF= |
add ax,1 |
||||
sub ax,1 |
; AX= |
SF= |
ZF= |
CF= |
add al,1 |
; AL= |
SF= |
ZF= |
CF= |
mov bh,6Ch |
; BH= |
SF= |
ZF= |
CF= |
add bh,95h |
||||
mov al,2 |
; AL= |
SF= |
ZF= |
CF= |
sub al,3 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
34 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Флаг переполнения (OF)
Флаг OF (Overflow flag) определяет выход знакового результата за границы диапазона, т.е. может ли результат быть правильно представлен с помощью заданного количества битов.
; Пример 1 |
|
|
mov al,+127 |
; OF = 1, |
AL = ?? |
add al,1 |
||
; Пример 2 |
; OF = 1, |
AL = 80h |
mov al,7Fh |
||
add al,1 |
|
|
Примеры идентичны, т.к. 7Fh = +127. Для определения содержимого приемника, обычно удобнее пользоваться шестнадцатеричным представлением числа.
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
35 |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
Правило применения
•При сложении двух целых чисел A и B помните, что флаг OF устанавливается если . . .
•A>0, B>0 и A+B<0
•A<0, B<0 и A+B>0
Задача: определите значение флага переполнения |
|
|||
mov al,80h |
|
; OF = |
|
|
add al,92h |
|
|
||
mov al,-2 |
|
; OF = |
|
|
add al,+127 |
|
|
||
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 |
http://ppl.yohng.com |
Web site Examples |
36 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
||||
|
|
6
|
Задача |
|
|
|
Операторы и директивы для работы с |
|
||||
|
|
|
|
|
данными |
|
||||
|
|
|
|
|
|
|
|
|
||
Определите значения флагов |
|
|
|
|
|
|
|
|
||
mov al,-128 |
|
|
|
|
|
|
• |
Оператор OFFSET |
|
|
|
; CF = |
OF = |
|
|
• |
Оператор PTR |
|
|
||
neg al |
|
|
|
|
|
|||||
mov ax,8000h |
|
|
|
|
|
• |
Оператор TYPE |
|
|
|
add ax,2 |
|
; CF = |
OF = |
|
|
• |
Оператор LENGTHOF |
|
||
mov ax,0 |
|
; CF = |
OF = |
|
|
• |
Оператор SIZEOF |
|
||
sub ax,2 |
|
|
|
• |
Директива LABEL |
|
|
|||
mov al,-5 |
|
; OF = |
|
|
|
|
|
|
|
|
sub al,+125 |
|
|
|
|
|
|
|
|
||
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 |
http://ppl.yohng.com |
|
Web site |
Examples |
37 |
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
38 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
||||||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
Оператор OFFSET
•OFFSET смещение переменной в байтах относительно начала сегмента
•Защищенный режим: 32 bits
•Реальный режим: 16 bits
При работе в защищенном режиме мы рассматриваем только один сегмент (flat memory model).
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
39 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Примеры использования OFFSET
Пусть сегмент данных начинается с адреса 00404000h:
.data
bVal BYTE ? wVal WORD ? dVal DWORD ? dVal2 DWORD ?
.code |
; ESI = 00404000 |
||
mov esi,OFFSET bVal |
|||
mov esi,OFFSET wVal |
; ESI = 00404001 |
||
mov esi,OFFSET dVal |
; ESI |
= |
00404003 |
mov esi,OFFSET dVal2 |
; ESI |
= |
00404007 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
40 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Связь с C/C++
Значение возвращаемое OFFSET - указатель. Сравните:
; C version:
char array[1000]; char *p = array;
.data |
|
|
|
|
array BYTE 1000 DUP(?) |
|
|
|
|
.code |
|
; ESI is p |
|
|
mov esi,OFFSET array |
|
|
||
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site |
Examples |
41 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
||||
|
|
|
||
|
|
|
|
Оператор PTR
Переопределяет размер метки (переменной). Предоставляет гибкий доступ к частям переменной.
.data |
|
myDouble DWORD 12345678h |
|
.code |
; ошибка – почему? |
mov ax,myDouble |
|
mov ax,WORD PTR myDouble |
; загружает 5678h |
mov WORD PTR myDouble,4321h |
; сохраняет 4321h |
Помните что при хранении данных в памяти используется прямой порядок little endian (гл. 3).
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
42 |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
7
Прямой порядок следования байтов
(Little Endian)
•ЦП Intel сохраняет данные в памяти в прямом порядке (Little Endian).
•Младший байт хранится по младшему адресу. (байты в слове хранятся в наоборот)
•Например, двойное слово 12345678h сохраняется:
|
byte |
offset |
|
|
|
|
|
|
78 |
0000 |
|
Когда данные загружаются в |
|
||
|
|
|
|
|
|||
|
56 |
0001 |
|
регистры порядок следования |
|
||
|
34 |
0002 |
|
байтов автоматически |
|
||
|
|
|
|||||
|
|
изменяется. |
|
||||
|
12 |
0003 |
|
|
|||
|
|
|
|||||
|
|
|
|
|
|||
|
|
|
|
|
|
43 |
|
|
|
|
|
|
|
||
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 |
http://ppl.yohng.com |
Web site Examples |
|||||
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||||||
|
|
Оператор PTR (продолжение)
PTR может также использоваться для объединения байтов в слова и двойные слова, слов в двойные слова...
ЦП автоматически меняет порядок следования байтов.
.data
myBytes BYTE 12h,34h,56h,78h
.code |
; AX |
= 3412h |
mov ax,WORD PTR [myBytes] |
||
mov ax,WORD PTR [myBytes+2] |
; AX |
= 7856h |
mov eax,DWORD PTR myBytes |
; EAX = 78563412h |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
45 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Пример использования PTR
.data
myDouble DWORD 12345678h
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov al,BYTE PTR |
myDouble |
; AL = 78h |
||||||||
mov al,BYTE PTR [myDouble+1] |
; AL = 56h |
|||||||||
mov al,BYTE PTR [myDouble+2] |
; AL = 34h |
|||||||||
mov ax,WORD |
PTR |
myDouble |
; AX |
= |
5678h |
|||||
mov ax,WORD |
PTR [myDouble+2] |
; AX |
= |
1234h |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
44 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Задача
Определите содержимое приемника:
.data
varB BYTE 65h,31h,02h,05h varW WORD 6543h,1202h varD DWORD 12345678h
.code |
; a. |
mov ax,WORD PTR [varB+2] |
|
mov bl,BYTE PTR varD |
; b. |
mov bl,BYTE PTR [varW+2] |
; c. |
mov ax,WORD PTR [varD+2] |
; d. |
mov eax,DWORD PTR varW |
; e. |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
46 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Оператор TYPE
Оператор TYPE возвращает размер в байтах переменной.
.data
var1 BYTE ? var2 WORD ? var3 DWORD ? var4 QWORD ?
.code |
; 1 |
|
mov eax,TYPE var1 |
||
mov eax,TYPE var2 |
; 2 |
|
mov eax,TYPE var3 |
; |
4 |
mov eax,TYPE var4 |
; |
8 |
Оператор LENGTHOF
Оператор LENGTHOF количество элементов в массиве.
.data |
BYTE 10,20,30 |
LENGTHOF |
byte1 |
; 3 |
|
array1 |
WORD 30 DUP(?),0,0 |
; 32 |
array2 |
WORD 5 DUP(3 DUP(?)) |
; 15 |
array3 DWORD 1,2,3,4 |
; 4 |
|
digitStr BYTE "12345678",0 |
; 9 |
|
.code |
|
; 32 |
mov ecx,LENGTHOF array1 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
47 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
48 |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
8
Оператор SIZEOF
SIZEOF = LENGTHOF × TYPE.
.data |
BYTE 10,20,30 |
SIZEOF |
byte1 |
; 3 |
|
array1 |
WORD 30 DUP(?),0,0 |
; 64 |
array2 |
WORD 5 DUP(3 DUP(?)) |
; 30 |
array3 DWORD 1,2,3,4 |
; 16 |
|
digitStr BYTE "12345678",0 |
; 9 |
|
.code |
|
; 64 |
mov ecx,SIZEOF array1 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
49 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Многострочное объявление данных (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. |
|||
|
|
Многострочное объявление данных (1 из 2)
Объявление данных может быть многострочным, если каждая строка (кроме последней) завершается запятой. Операторы LENGTHOF и SIZEOF учитывают многострочное объявление:
.data
array WORD 10,20, 30,40, 50,60
.code |
; |
6 |
mov eax,LENGTHOF array |
||
mov ebx,SIZEOF array |
; |
12 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
50 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
|||
|
|
Директива LABEL
•Определяет альтернативную метку для существующей переменной и позволяет изменить ее тип (размер)
•LABEL не выделяет память
•Позволяет избежать использования оператора PTR
.data
dwList |
LABEL |
DWORD |
|
|
|
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. |
|||||
|
|
||||
|
|
|
|
|
Косвенная адресация
•Косвенные операнды
•Пример: суммирование элементов массива
•Операнды с индексом
•Указатели
Косвенные операнды (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 |
53 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2006 http://ppl.yohng.com |
Web site Examples |
54 |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
Irvine, Kip R. Assembly Language for Intel-Based Computers, 2003. |
9
Косвенные операнды (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,2 |
; либо: add esi,TYPE arrayW |
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 |
0,1,2,3,4,5 |
|
|
|
|
arrayB BYTE |
|
|
|
||
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. |
10