Скачиваний:
73
Добавлен:
15.06.2014
Размер:
374.42 Кб
Скачать

Язык ассемблера для процессоров

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

Соседние файлы в папке lec_4