![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Операторы masm32 для работы с даннымиСодержание книги
Поиск на нашем сайте
Макроассемблер masm32 содержит операторы и директивы, предназначенные для определения и адресации данных. Оператор определения смещения Оператор OFFSET возвращает смещение адреса переменной относительно начала сегмента. В защищённом режиме работы процессора смещения всегда выражаются 32-разрядными целыми числами без знака. Пример 1.2.1. Следующая программа показывает различные способы определения смещения.
.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
.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; просмотров: 1379; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.189.180.234 (0.009 с.) |