Работа с данными и памятью Преобразование данных — презентация
logo
Работа с данными и памятью Преобразование данных
  • Работа с данными и памятью Преобразование данных
  • Если мы попытаемся использовать в инструкции два несовместимых по размеру операнда, то мы получим ошибку. Например:
  • Чтобы решить данную проблему, мы можем применять преобразование типов. Преобзование имеет следующую форму:
  • Например, изменим предыдущую программу, применив преобразование:
  • Подобным образом можно преобразовывать константы
  • Надо учитывать, что преобразования от типов с большим размеров в тип меньшего размера могут сопроваждаться потерей точности. Например:
  • Символы
  • Преобразование чисел в символы
  • Таблица символов ASCII
  • Работа с данными и памятью Преобразование данных
  • Использование символов в ассемблере
  • Для определения переменных, которые представляют символы ASCII, применяется тип byte:
  • Преобразование символов
  • Работа с данными и памятью Преобразование данных
  • Например, преобразуем символ в число:
  • Выполним обратный переход:
  • Подобным образом используя логического сложение с маской 20h можно получить из заглавной буквы строчную:
  • Используя логическое умножение на маску DFh или 11011111, можно перейти от строчной к заглавной букве:
  • Для той же цели можно прибавлять/вычитать 32 из кода символа:
  • Режим адресации
  • Режимы адресации. Косвенная адресация
  • Режим адресации регистров предоставляет доступ к регистрам общего назначения. Это стандартное обращение к регистрам процессора:
  • Адресация памяти относительно счетчика команд
  • Работа с данными и памятью Преобразование данных
  • Косвенная адресация регистров
  • Инструкция lea
  • Например, определим в секции данных переменную text и загрузим ее адрес в регистр rcx:
  • Загрузка и сохранение значения по адресу
  • Также можно наоборот - сохранять значение по определенному адресу. Например:
  • Установка смещения
  • Аналогично можно сохранять данные по адресу, используя смещение
  • Работа с данными и памятью Преобразование данных
1/32

Первый слайд презентации: Работа с данными и памятью Преобразование данных

Изображение слайда

Слайд 2: Если мы попытаемся использовать в инструкции два несовместимых по размеру операнда, то мы получим ошибку. Например:

В данном случае в 32-разрядный регистр EAX мы пытаемся поместить значение 8-разрядной переменной num. И в принципе то переменная num вполне может поместить в EAX, но ассемблер требует, чтобы оба операнда были одного размера. Соответственно программа не скомпилируется, и мы получим ошибку.

Изображение слайда

Слайд 3: Чтобы решить данную проблему, мы можем применять преобразование типов. Преобзование имеет следующую форму:

тип ptr значение Сначала указывается тип данных, в который мы преобразуем (byte, word, dword и т.д.). Далее идет оператор ptr, после которого указывается преобразуемое значение

Изображение слайда

Слайд 4: Например, изменим предыдущую программу, применив преобразование:

Выражение dword ptr num означает, что значение num преобразуется к типу dword.

Изображение слайда

Слайд 5: Подобным образом можно преобразовывать константы

Изображение слайда

Слайд 6: Надо учитывать, что преобразования от типов с большим размеров в тип меньшего размера могут сопроваждаться потерей точности. Например:

Здесь 16-разрядную переменную num (равная FFFEh или 65534 в десятичной системе) преобразуем в 8-разрядный тип byte для помещения в регистр AL. При преобразовании будет из 16 бит в 8 бит в num будет отброшен старший бит и останется число FEh или 254. Если же значение преобразуемой переменной укладывается в диапазон значений требуемого типа, тогда проблем с преобразованием никаких нет.

Изображение слайда

Слайд 7: Символы

символы - набор битов - единиц и нулей, упорядоченных определенным образом. Большинство компьютеров для представления одного символа используют 1 или 2 байта. Windows, macOS, FreeBSD и Linux используют для символов кодировку ASCII или Unicode.

Изображение слайда

Слайд 8: Преобразование чисел в символы

Таблица ASCII (American Standard Code for Information Interchange) - один из наиболее простых и популярных способов кодирования символов. ASCII - таблица кодировки символов, в которой каждому символу соответствует определенное число. Пример Латинской букве A соответствует число 65, а букве B - число 66. Более того цифровые символы имеет свои собственные числовые коды. Например, символу 0 соответствует число 48, символу 1 - число 49 и т.д. Каждый отдельный символ из таблицы ASCII представляет 1 байт.

Изображение слайда

Слайд 9: Таблица символов ASCII

Первые 31 символов - управляющие последовательности.

Изображение слайда

Слайд 10

Печатные символы

Изображение слайда

Слайд 11: Использование символов в ассемблере

Для определения символа или строки в ассемблере применяются кавычки. Можно использовать как одинарные кавычки, так и двойные:

Изображение слайда

Слайд 12: Для определения переменных, которые представляют символы ASCII, применяется тип byte:

Изображение слайда

Слайд 13: Преобразование символов

Если мы посмотрим на таблицу ASCII, то увидим, что данная кодировка упрощает в некоторых случаях манипуляции с данными. Так, строчные буквы отличаются от заглавным установленным 6-м битом: Соответственно, чтобы, например, перевести строчную букву в верхний регистр, достаточно снять шестой бит, а чтобы сделать заглавную букву строчной - наоборот, установить шестой бит. Для установки этого бита можно прибавить к числовому коду символа число 32, а для сброса этого бита - отнять от числового кода символа 32.

Изображение слайда

Слайд 14

Или например, из таблицы мы видим, что числовой код цифровых символов начинается с 48 (или с 30 в 16-й сиситеме). Поэтому для перехода от числа к его символьному представлению и обратно мы можем прибавлять/вычитать 48. Поскольку бинарный код чисел отличается от бинарного кода цифровых символов только старшим полубайтом, который у символов равен 3, то для перехода от символа к числу можно применить операцию AND, которая сбросит полубайт. А для перехода от числа к его символьному представлению можно установить полубайт с помощью операции OR.

Изображение слайда

Слайд 15: Например, преобразуем символ в число:

Здесь преобразуем в число символ 2. В бинарной форме он равен 00110010. То есть нам надо сбросить первый полубайт 0011. Для этого применяем логическое умножение на число 0Fh, что в двоичной форме равно 00001111. То есть получим: То есть получаем бинарное представление числа 2. Причем 0Fh - это маска, которая подходит для перехода от любого цифрового символа к числу для все числовых значений.

Изображение слайда

Слайд 16: Выполним обратный переход:

Здесь преобразуем число 2 в соответствующий символ. В бинарной форме число 2 равно 00000010. То есть нам надо установить старший полубайт в 0011. Для этого применяем логическое сложение с числом 30h, что в двоичной форме равно 00110000. То есть получим: То есть получаем число 50 - числовой код символа "2".

Изображение слайда

Слайд 17: Подобным образом используя логического сложение с маской 20h можно получить из заглавной буквы строчную:

Изображение слайда

Слайд 18: Используя логическое умножение на маску DFh или 11011111, можно перейти от строчной к заглавной букве:

Изображение слайда

Слайд 19: Для той же цели можно прибавлять/вычитать 32 из кода символа:

Изображение слайда

Слайд 20: Режим адресации

Режимы адресации в архитектуре x86-64 представляют собой способы указания на местоположение данных в памяти или в регистрах процессора. Косвенная адресация - это один из вариантов режима адресации, при котором адрес данных не указывается явно в инструкции, а вычисляется посредством ссылки на другой адрес или регистр.

Изображение слайда

Слайд 21: Режимы адресации. Косвенная адресация

Адресация регистров Адресация памяти относительно счетчика команд (PC-relative memory addressing) Косвенная адресация регистров ([reg64]). В этом случае адрес данных хранится в регистре, указанном в инструкции. Косвенная адресация регистров со смещением ([reg64 + offset]). Здесь к адресу, хранящемуся в регистре, добавляется фиксированное смещение. Косвенная адресация регистров со смещением и масштабированием ([reg64 + offset + reg64 * scale]). В этом случае к адресу добавляется смещение, а также умноженное на значение другого регистра, заданное масштабом.

Изображение слайда

Слайд 22: Режим адресации регистров предоставляет доступ к регистрам общего назначения. Это стандартное обращение к регистрам процессора:

mov rax, rdx Регистры представляют самый быстрый тип памяти компьютера. Инструкции, которые используют регистры, короче и быстрее, чем те, которые обращаются к памяти. Поскольку для большинства вычислений требуется по крайней мере один регистр, режим адресации регистров популярен в ассемблере x86-64. Единственное ограничение - оба операнда должны иметь одну и ту же разрядность.

Изображение слайда

Слайд 23: Адресация памяти относительно счетчика команд

Данный режим заключается в использовании имени переменной или константы, которая определена в одном из разделов -.data,.data?,.const,.code и т. д. Для вычисления адреса переменных/констант применяется регистр RIP (Instruction Pointer), он же счетчик команд (Program Counter), отсюда и соответствующее название.

Изображение слайда

Слайд 24

В данном случае, при выполнении инструкции mov eax, i32, ассемблер автоматически использует счетчик команд (RIP) для вычисления адреса переменной i32. Таким образом, RIP является внутренним регистром процессора, который указывает на текущую выполняемую инструкцию, и его значение используется для вычисления адреса переменных, определенных в разделе.data.

Изображение слайда

Слайд 25: Косвенная адресация регистров

Косвенная адресация регистров (register-indirect addressing mode) означает, что регистр содержит адрес некоторого объекта. Используя данный адрес, извлекается данный объект. Чтобы указать, что мы хотим взять не значение из регистра, а значения из адреса, который хранится в регистре, название регистра помещается в квадратные скобки: [reg64] Где reg64 - это один из 64-разрядных регистров общего назначения: RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8, R9, R10, R11, R12, R13, R14 и R15.

Изображение слайда

Слайд 26: Инструкция lea

Для загрузки адреса некоторого объекта может применяться инструкция lea (load effective address). Данная инструкция имеет следующий синтаксис: Первый операнд инструкции представляет 64-разрядный регистр общего назначения, куда загружается адрес переменной variable - второго операнда. Стоит отметить, что переменная variable может представлять любой размер, поскольку в регистр загружается именно ее адрес, а адрес в 64-разрядной архитектуре имеет длину 64 бита.

Изображение слайда

Слайд 27: Например, определим в секции данных переменную text и загрузим ее адрес в регистр rcx:

Стоит отметить, что в C/C++ это было бы аналогично следующему коду:

Изображение слайда

Слайд 28: Загрузка и сохранение значения по адресу

Загруженный адрес затем можно использовать для получения данных при косвенной адресации: Здесь в регистр RCX загружается адрес переменной i32. Затем в регистр EAX помещается значение, которое хранится по адресу из регистра RCX - то есть значение переменной i32.

Изображение слайда

Слайд 29: Также можно наоборот - сохранять значение по определенному адресу. Например:

Здесь в секции данных определена неинициализированная переменная i32. Сохраним в эту переменную число 12. Для этого загружаем адрес этой переменной в регистр RCX Сохраняемое число помещаем вначале в регистр RDX Далее помещаем данные из регистра RDX в участок памяти, адрес которой хранится в регистре RCX, то есть по сути адрес переменной i32:

Изображение слайда

Слайд 30: Установка смещения

Здесь в регистр RBX помещается адрес переменной n1. Эта переменная занимает 4 байта (тип dword), соответственно адрес следующей переменной - n2 равен [RBX + 4]. И если мы возьмем данные по этому адресу, то фактически мы получим значение переменной n2.

Изображение слайда

Слайд 31: Аналогично можно сохранять данные по адресу, используя смещение

При этом смещение также может быть отрицательным. В этом случае адрес сдвигается на указанное число байтов назад. Использование смещений очень удобно, когда речь идет об обращении к частям каких-то сложных данных, например, массивов.

Изображение слайда

Последний слайд презентации: Работа с данными и памятью Преобразование данных

Изображение слайда

Похожие презентации

Ничего не найдено