Операторы masm32 для работы с данными 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Операторы masm32 для работы с данными



Макроассемблер masm32 содержит операторы и директивы, предназначенные для определения и адресации данных.

Оператор определения смещения

Оператор OFFSET возвращает смещение адреса переменной относительно начала сегмента. В защищённом режиме работы процессора смещения всегда выражаются 32-разрядными целыми числами без знака.

Пример 1.2.1. Следующая программа показывает различные способы определения смещения.

.386

.model flat, stdcall

option casemap: none

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\masm32.inc

include \masm32\include\debug.inc

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\masm32.lib

includelib \masm32\lib\debug.lib

.data

X word 1234h; объявление и инициализация переменной X

Y byte 6,7,8,9; объявление и инициализация массива Y

.code

start:

mov eax, offset X; загрузка в eax адреса переменной X (1 способ)

PrintHex eax, "-адрес, полученный ком-й mov eax, offset X"

lea ebx, X; загрузка в ebx адреса переменной X (2 способ)

PrintHex ebx, "- адрес, полученный командой lea ebx, X"

mov eax, offset Y

PrintHex eax, "- адрес первого элемента массива Y"

mov eax, offset Y+3

PrintHex eax, "- адрес последнего элемента массива Y"

ret

end start

Упражнение 1.2.1. Исследуйте возможность использования команды lea для получения адресов элементов массива.

Оператор изменения размера операнда

Оператор PTR позволяет получить доступ к части операнда, хранимого в памяти. При этом необходимо иметь в виду, что в процессорах фирмы Intel при хранении данных в ОЗУ используется прямой порядок следования байтов (little endian order).

Пример 1.2.2. Следующая программа демонстрирует доступ к элементам двойного слова, хранимого в ОЗУ.

.data

X dword 12345678h; инициализация переменной X

.code

start:

DbgDump offset X,4

mov eax, X; eax = 12345678h

PrintHex eax, "- переменная X"

mov ax, word ptr X; eax = 5678h

PrintHex ax, "- младшее слово переменной X"

mov ax, word ptr X+2; eax = 1234h

PrintHex ax, "- старшее слово переменной X"

mov ah, byte ptr X; eax = 78h

PrintHex ah, "- младший байт переменной X"

mov ah, byte ptr X+1; eax = 56h

PrintHex ah, "- байт №1 переменной X"

mov ah, byte ptr X+2; eax = 34h

PrintHex ah, "- байт №2 переменной X"

mov ah, byte ptr X+3; eax = 12h

PrintHex ah, "- байт №3 переменной X"

ret

end start

Упражнение 1.2.2. Разработайте программу сложения всех четырёх байтов двойного слова X, объявленного в примере 1.2.2. Подсказка: для сложения двух байтов, сумма которых превосходит размер байта необходимо вначале поместить слагаемые в двухбайтовые регистры, а потом производить сложение, например, так:

mov ax,0; подготовка ax для занесения первого слагаемого

mov bx,0; подготовка bx для занесения второго слагаемого

mov al, byte ptr X; копирование первого слагаемого

mov bl, byte ptr X+1; копирование второго слагаемого

add ax,bx; сложение двух байтов в двухбайтовых регистрах

Существует и обратная возможность: несколько коротких переменных можно загрузить в один длинный регистр. В приведённом ниже примере первое слово загружается в в младшие 16 битов регистра eax, а второе слово – в старшие 16 битов этого регистра.

.data

X word 1234h, 5678h

.code

mov eax, DWORD PTR X; eax = 56781234h

Оператор определения размера операнда

Оператор TYPE возвращает размер в байтах элементов массива или переменную. Например, значение TYPE для переменной типа байт равно 1, слово – 2, двойное слово – 4, и учетверённое слово – 8.

Пример 1.2.3. Следующая программа загружает в регистры общего назначения первые четыре элемента массива:

.data

X word 1234h,5678h

Y byte 88h

Z dword 0AABBCCDDh

.code

start:

mov eax, TYPE X; eax = 2

mov eax, TYPE Y; eax = 1

mov eax, TYPE Z; eax = 4

mov eax, TYPE X + TYPE Y + TYPE Z; eax = 7

ret

end start

Оператор определения количества элементов в массиве

Оператор LENGTHOF позволяет определить количество элементов в массиве. Массив при этом может представляться не только числами, но и символами.

Пример 1.2.4. Ниже представлены различные варианты применения этого оператора:

.data

X byte 10, 20, 30

Y byte 1, 2, 3, 4

byte 5, 6, 7, 8

Z byte 1, 2, 3, 4,

5, 6, 7, 8

Q word 30 DUP (41h), 42h, 43h

W byte 5 DUP (3 DUP (61h), 77, 88, 99)

R dword 12345678h, 0, 0

T byte “12345678”, 0, 0

A byte ‘12345678’, 0, 0

.code

start:

mov eax, LENGTHOF X; eax = 3

mov eax, LENGTHOF Y; eax = 4, но не 8!!!

mov eax, LENGTHOF Z; eax = 8

mov eax, LENGTHOF Q; eax = 32

mov eax, LENGTHOF W; eax = 30 (5*(3+3))

mov eax, LENGTHOF R; eax = 3

mov eax, LENGTHOF T; eax = 10, но не 3!!!

mov eax, LENGTHOF A; eax = 10, но не 3!!!

ret

end start

Обратите внимание, что строки можно задавать последовательностью байтов, заключённой в кавычки или апострофы. При этом в памяти компьютера будут записаны ASCII-коды символов.

Упражнение 1.2.3. Распечатайте в окне отладки дамп памяти переменой T, объявленной в примере 1.2.4. Найдите ASCII-коды цифр.

Оператор определения размера массива

Оператор SIZEOF возвращает значение, равное произведению значений, возвращаемых операторами LENGTHOF и TYPE.

Указатели

Переменная, содержащая адрес другой переменной называется переменной-указателем (pointer variable) или просто указателем. Указатели широко используются при обработке массивов и структур данных. В защищённом режиме 32-разрядного процессора используются ближние и дальние указатели. Ближние указатели представляют собой 32-разрядное смещение относительно начала сегмента данных. Дальние указатели – 48-разрядный адрес, заданный в форме “сегмент:смещение”. Ближние указатели задаются переменной размером два слова, содержащей смещение другой переменной:

.data

X byte 10, 20, 30; переменная X

Y word 1234; переменная Y

ptrX dword X; указатель на переменную X

ptrY dword Y; указатель на переменную Y



Поделиться:


Последнее изменение этой страницы: 2016-06-29; просмотров: 1298; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.160.156 (0.012 с.)