Ассемблер
Булевы операции и команда сравнения
Флаги состояния процессора
Команда AND
Команда AND
Пример: сброс четырех старших бита 8 -разрядного двоичного числа
Команда OR
Команда OR
Команда OR
Флаги команды OR
Команда XOR
Команда XOR
Флаги команды XOR
Флаги команды XOR
Флаги команды XOR
Команда TEST
Флаги команды TEST
Команда CMP
Флаги команды CMP
Примеры. Три фрагмента кода, в которых продемонстрировано влияние команды СМР на флаги состояния процессора
Пример. В исходном байте DataByte биты 0…3 содержат двоичный код, который обозначим как А, биты 4…5 - код, который обозначим
ввести число, используя битовую маску, сохранить только последние 4 бита, значение которых и вывести в консоль:
Пример с RGBA
Задание
1.27M
Categories: programmingprogramming informaticsinformatics

Ассемблер.логические команды языка Ассемблер

1. Ассемблер

ЛОГИЧЕСКИЕ КОМАНДЫ ЯЗЫКА АССЕМБЛЕР

2. Булевы операции и команда сравнения

Методики условных вычислений на самом нижнем (двоичном) уровне основаны на
четырех основных операциях двоичной алгебры: И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ и
НЕ. Эти операции положены в основу работы логических схем компьютера, а также
его программного обеспечения.
Команда
Описание
AND
Выполняет операцию логического И между двумя операндами
OR
Выполняет операцию логического ИЛИ между двумя операндами
XOR
Выполняет операцию исключающего ИЛИ между двумя операндами
NOT
Выполняет операцию логического отрицание (НЕ) единственного операнда
TEST
Выполняет операцию логического И между двумя операндами, устанавливает
соответствующие флаги состояния процессора, но результат операции не записывается вместо
операнда получателя данных

3. Флаги состояния процессора

• Каждая логическая команда влияет на состояние флагов процессора.
• Флаг нуля (Zero flag, или ZF) устанавливается, если при выполнении
арифметической или логической операции получается число, равное нулю (т.е. все
биты результата равны 0).
Флаг переноса (Carry flag, или CF) устанавливается в случае, если при
выполнении беззнаковой арифметической операции получается число, разрядность
которого превышает разрядность выделенного для него поля результата.
Флаг знака (Sign flag, или SF) устанавливается, если при выполнении
арифметической или логической операции получается отрицательное число (т.е.
старший бит результата равен 1).
Флаг переполнения (Overflow flag, или OF) устанавливается в случае, если при
выполнении арифметической операции со знаком получается число, разрядность
которого превышает разрядность выделенного для него поля результата.
Флаг четности (Parity flag, или PF) устанавливается в случае, если в результате
выполнения арифметической или логической операции получается число,
содержащее четное количество единичных битов.

4. Команда AND

• Команда AND выполняет операцию логического И между соответствующими парами битов
операндов команды и помещает результат на место операнда получателя данных:
• AND получатель, источник
• Команда AND может работать с 8-, 16- или 32-разрядными операндами, причем длина у
обоих операндов должна быть одинаковой. При выполнении операции поразрядного
логического И значение результата будет равно 1 только в том случае, если оба бита пары
равны 1. Непосредственно заданное imm. https://sites.google.com/site/sistprogr/lekcii1/lek6
варианты команды AND
AND reg, reg
AND reg, imm
AND reg, mem
AND mem, reg
AND mem, imm

5. Команда AND

Команда AND обычно используется для сброса отдельных битов
двоичного числа (например, флагов состояния процессора) по
заданной маске. Если бит маски равен 1, значение
соответствующего разряда числа не изменяется (в этом случае
говорят, что разряд замаскирован), а если равен 0 — то
сбрасывается.
X
Y
X^Y
0
0
1
1
0
1
0
1
0
0
0
1

6. Пример: сброс четырех старших бита 8 -разрядного двоичного числа

mov al, 00111011b
and al, 00001111b
Флаги. Команда AND всегда сбрасывает флаги переполнения
(OF) и переноса (CF). Кроме того, она устанавливает значения
флагов знака (SF), нуля (ZF) и четности (PF) в соответствии со
значением результата

7. Команда OR

• Команда OR выполняет операцию логического ИЛИ между соответствующими
парами битов операндов команды и помещает результат на место операнда
получателя данных: OR получатель, источник
типы операндов команды OR
OR reg, reg
OR mem, reg
OR reg, mem
OR mem, imm
OR reg, imm
• Команда OR может работать с 8-, 16- или 32-разрядными операндами, причем
длина у обоих операндов должна быть одинаковой. При выполнении
операции поразрядного логического ИЛИ значение результата будет равно 1,
если хотя бы один из битов пары операндов равен 1.

8. Команда OR

Команда OR обычно используется для установки в единицу
отдельных битов двоичного числа (например, флагов состояния
процессора) по заданной маске. Если бит маски равен 0, значение
соответствующего разряда числа не изменяется, а если равен 1 — то
устанавливается в 1.
Пример: установка четырех младших бита 8-разрядного двоичного
числа, маска число 0Fh. Значение старших битов числа при это не
меняется

9. Команда OR

С помощью команды OR можно преобразовать двоичное число,
значение которого находится в диапазоне от 0 до 9 в ASCIIстроке. Для этого нужно установить в единицу биты 4 и 5.
Например, если в регистре AL находится число 05h, то чтобы
преобразовать его в соответствующий ASCII-код, нужно
выполнить операцию OR регистра AL с числом 30h. В результате
получится число 35h, которое соответствует ASCII-коду цифры 5
mov dl, 5 ; Двоичное число
or dl, 30h ; Преобразуем в ASCII-код

10. Флаги команды OR

• Команда OR всегда сбрасывает флаги переполнения (OF) и переноса (CF).
Кроме того, она устанавливает значения флагов знака (SF), нуля (ZF) и
четности (PF) в соответствии со значением результата.
• С помощью команды OR можно определить, какое значение находится в
регистре (отрицательное, положительное или нуль). Для этого вначале нужно
выполнить команду OR, указав в качестве операндов один и тот же регистр,
например:
• or al, al
Флаг нуля (ZF)
Флаг знака (SF)
Значение числа
0
0
Больше нуля
1
0
Равно нулю
0
1
Меньше нуля

11. Команда XOR

Команда XOR выполняет операцию ИСКЛЮЧАЮЩЕГО ИЛИ
между соответствующими парами битов операндов команды и
помещает результат на место операнда получателя данных:
XOR получатель, источник
В команде XOR используются аналогичные
командам AND и OR типы операндов
XOR reg, reg
XOR reg, mem
XOR reg, imm
XOR mem, reg
XOR mem, imm

12. Команда XOR

Команда XOR может работать с 8-, 16- или 32-разрядными
операндами, причем длина у обоих операндов должна быть
одинаковой. При выполнении операции поразрядного
ИСКЛЮЧАЮЩЕГО ИЛИ значение результата будет равно 1, если
значения битов пары операндов различны, и 0 — если значения
битов равны.
X
0
0
1
1
Y
0
1
0
1
X ⊕Y
0
1
1
0

13. Флаги команды XOR

Команда XOR всегда сбрасывает флаги переполнения (OF) и переноса (CF).
Кроме того, она устанавливает значения флагов знака (SF), нуля (ZF) и
четности (PF) в соответствии со значением результата.
Проверка флага четности (PF). Флаг четности позволяет узнать, какое
количество единичных битов (четное или нечетное) содержится в
младшем байте результата выполнения логической или арифметической
команды. Если этот флаг установлен, значит, в результате получилось
четное количество единичных битов, а если сброшен, то нечетное.
Количество единичных битов можно проверить, не меняя значения
результата. Для этого сначала нужно выполнить команду XOR с нулевым
значением (т.е. с числом, все биты которого равны нулю), а затем
проверить флаг четности.

14. Флаги команды XOR

mov al, 10110101b ; Число содержит нечетное (5) количество единиц битов
xor al, 0
; Поэтому флаг четности (PF) не устанавливается (PO)
mov al, 11001100b ; Число содержит четное (4) количество единиц битов
xor al, 0
; Поэтому флаг четности (PF) устанавливается (PE)
• В отладчиках часто для обозначения четного количества единиц в
полученном результате используется аббревиатура РЕ (т.е. Parity
Even), а для нечетного — РО (т.е. Parity Odd).

15. Флаги команды XOR

• Четность в 16-разрядных словах. Флаг четности PF устанавливается в зависимости от
количества единиц, содержащихся в младших восьми разрядах результата. Для
выполнения контроля по четности 16-разрядных операндов, нужно выполнить команду
XOR между старшим и младшим байтами этого числа:
mov ax, 64C1h ; 0110 0100 1100 0001
xor ah, al ; Флаг четности (PF) устанавливается (PF)
Таким образом, 16-разрядный операнд разбивается на 2 группы по 8 битов. При
выполнении команды XOR единичные биты, находящиеся в соответствующих позициях
двух 8-разрядных операндов, не будут учитываться, поскольку соответствующий бит
результата равен нулю. Эта команда удаляет из результата любые пересекающиеся
единичные биты двух 8-разрядных операндов и добавляет в результат
непересекающиеся единичные биты. Следовательно, четность полученного нами 8разрядного операнда будет такой же, как и четность исходного 16-разрядного числа.
Если нужно оценить четность 32-разрядного числа? Тогда, пронумеровав его байты,
соответственно, В0, В1, В2 и В3, четность можно определить по следующей формуле: В0
XOR В1, XOR B2 XOR В3.

16. Команда TEST

Команда TEST выполняет операцию поразрядного логического И
между соответствующими парами битов операндов и, в зависимости от
полученного результата, устанавливает флаги состояния процессора. При
этом, в отличие от команды AND, значение операнда получателя
данных не изменяется. В команде TEST используются аналогичные
команде AND типы операндов. Обычно команда TEST применяется для
анализа значения отдельных битов числа по маске.
Пример: тестирование нескольких битов. С помощью команды TEST
можно определить состояние сразу нескольких битов числа.
Предположим, мы хотим узнать, установлен ли нулевой и третий биты
регистра AL. Для этого можно воспользоваться такой командой:
test al,00001001b ; Тестируем биты 0 и 3

17. Флаги команды TEST

флаг нуля ZF будет установлен только в том случае, если все тестируемые
биты сброшены:
0 0 1 0 0 1 0 1 <- Исходное значение
0 0 0 0 1 0 0 1 <- Маска
0 0 0 0 0 0 0 1 <- Результат: ZF = 0
0 0 1 0 0 1 0 0 <- Исходное значение
0 0 0 0 1 0 0 1 <- Маска
0 0 0 0 0 0 0 0 <- Результат: ZF = 1
Команда TEST всегда сбрасывает флаги переполнения (OF) и переноса
(CF). Кроме того, она устанавливает значения флагов знака (SF), нуля
(ZF) и четности (PF) в соответствии со значением результата выполнения
операции логического И (как и команда AND)

18. Команда CMP

Команда СМР вычитает исходный операнд из
операнда получателя данных и, в зависимости от
полученного результата, устанавливает флаги
состояния процессора. При этом, в отличие от
команды SUB, значение операнда получателя данных
не изменяется.
СМР получатель, источник
В команде СМР используются аналогичные команде
AND типы операндов.

19. Флаги команды CMP

Команда СМР изменяет состояние следующих флагов: CF (флаг переноса),
ZF (флаг нуля), SF (флаг знака), OF (флаг переполнения),
AF (флаг служебного переноса), PF (флаг четности). Они устанавливаются в
зависимости от значения, которое было бы получено в результате применения
команды SUB.
Например, после выполнения команды СМР, по состоянию флагов нуля (ZF)
и переноса (CF) можно судить о величинах сравниваемых между собой
беззнаковых операндов.
Значение операндов
получатель < источник
получатель > источник
получатель = источник
ZF
0
0
1
CF
1
0
0

20. Примеры. Три фрагмента кода, в которых продемонстрировано влияние команды СМР на флаги состояния процессора

• При сравнении числа 5, находящегося в регистре ЕАХ, с числом 10,
устанавливается флаг переноса CF, поскольку при вычитании числа 10
из 5 происходит заем единицы:
mov eax, 5
cmp eax, 10
; CF = 1
• При сравнении содержимого регистров еах и есх, в которых содержатся
одинаковые числа 1000, устанавливается флаг нуля (ZF), так как в
результате вычитания этих чисел получается нулевое значение:
mov eax, 1000
mov ecx, 1000
cmp ecx, eax
; ZF = 0 и CF = 0

21. Пример. В исходном байте DataByte биты 0…3 содержат двоичный код, который обозначим как А, биты 4…5 - код, который обозначим

как В, биты 6…7 - код, который обозначим как С. Вычислить
А+2*В+2*С. Тест: ввод - 51h, вывод - 9.
#include <tchar.h>
#include <stdio.h>
#include <iostream.h>
#include <iomanip.h>
int _tmain(int argc, _TCHAR* argv[])
{ unsigned char x = 0x51;
unsigned char a, b, c;
unsigned int y;
_asm {
mov al, x
and al, 00000111b
mov a, al
mov al, x
and al, 00110000b
shr al, 3
mov b, al
mov al, x
and al, 11000000b
shr al, 5
mov c, al
}
y = (int) a + 2 * (int) b + 2 * (int) c;
cout << "y = " << y;
getchar();
return 0;
}

22.

23. ввести число, используя битовую маску, сохранить только последние 4 бита, значение которых и вывести в консоль:

int main()
{
const unsigned int lowMask = 0xF; // битовая маска для хранения последних 4
битов (шестнадцатеричный литерал для 0000 0000 0000 1111)
std::cout << "Enter an integer: ";
int num;
std::cin >> num;
num &= lowMask; // стираем первые биты, чтобы оставить последние
std::cout << "The 4 low bits have value: " << num << '\n';
return 0;
}
Написать программу на ассемблере

24. Пример с RGBA

Цветные дисплейные устройства, такие как телевизоры и мониторы, состоят из миллионов
пикселей, каждый из которых может отображать точку цвета. Точка цвета состоит из трех
пучков: один красный, один зеленый и один синий (red, green, blue = RGB). Изменяя их
интенсивность, можно воссоздать любой цвет. Количество цветов R, G и В в одном пикселе
представлено 8-битным целым числом unsigned. Например, красный цвет имеет R = 255, G =
0, B = 0. Фиолетовый: R = 255, G = 0, B = 255. Серый: R = 127, G = 127, B = 127.
Используется еще 4-ое значение, которое называется А. «А» означает «альфа» и отвечает за
прозрачность. Если А = 0, то цвет полностью прозрачный. Если А = 255, то цвет
непрозрачный.
В совокупности R, G, В и А – это одно 32-битное целое число, с 8 битами для каждого
компонента:

25.

Следующая программа просит пользователя ввести 32-битное шестнадцатеричное значение, а затем
извлекает 8-битные цветовые значения R, G, B и A:
#include <iostream>
int main()
{
const unsigned int redBits = 0xFF000000;
const unsigned int greenBits = 0x00FF0000;
const unsigned int blueBits = 0x0000FF00;
const unsigned int alphaBits = 0x000000FF;
std::cout << "Enter a 32-bit RGBA color value in hexadecimal (e.g. FF7F3300): ";
unsigned int pixel;
std::cin >> std::hex >> pixel; // std::hex позволяет вводить шестнадцатеричные значения
// используем побитовое И для изоляции red pixels, затем сдвигаем значение вправо в диапазон 0-255
unsigned char red = (pixel & redBits) >> 24;
unsigned char green = (pixel & greenBits) >> 16;
unsigned char blue = (pixel & blueBits) >> 8;
unsigned char alpha = pixel & alphaBits;
std::cout << "Your color contains:\n";
std::cout << static_cast<int>(red) << " of 255 red\n";
std::cout << static_cast<int>(green) << " of 255 green\n";
std::cout << static_cast<int>(blue) << " of 255 blue\n";
std::cout << static_cast<int>(alpha) << " of 255 alpha\n";
return 0;
}
Напишите программу на ассемблере

26. Задание

Объявите переменную x как int с каким-то значением.
Инвертируйте 7-й, 15-й и 31-й бит. Обнулите младший байт
переменной. Присвойте единичное значение битам 11-14 и 28-30.
Результат сохраните в переменной y типа int. Инвертируйте
значение x.
Ввести число, подсчитать количество единиц в каждом байте.
http://asmworld.ru/uchebnyj-kurs/016-uslovnye-i-bezuslovnyeperexody/

27.

е сть ма сси в б а й тов. Ра зм ер ма сси ва х ра н и т ся в б а й те без зн а ка . Требует ся в ка ждом
б а й т е с б р о с и т ь 1 - й и 5 - й б и т ы , у с т а н о в и т ь 0 - й и 3 - й б и т ы , и н в е р т и р о в а т ь 7 - й б и т. А
затем ещё инвертировать целиком последний байт массива.
http://asmworld.ru/uchebnyj-kurs/016-uslovnye-i-bezuslovnye-perexody/
English     Русский Rules