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