Слайд 2
Логические операции
Логические операции в языке C:
&& – логическое «И»
|| – логическое «ИЛИ»
!
– логическое «НЕ»
Слайд 3
Поразрядные (побитовые) операции
Поразрядные операции в языке C:
& – побитовое «И»
| – побитовое
«ИЛИ»
~ – побитовое «НЕ»
^ – исключающее «Или»
<< – побитовый сдвиг влево
>> – побитовый сдвиг вправо
Другие поразрядные операции:
Стрелка Пирса (НЕ-ИЛИ)
Штрих Шеффера (НЕ-И)
Слайд 4
Поразрядные (побитовые) операции
Стрелка Пирса и штрих Шеффера:
Слайд 5
Поразрядные (побитовые) операции
Арифметические сдвиги:
A <<= B == A * 2B
A >>= B
== A / 2B
Примеры арифметического сдвига:
(3 <<= 7) == (3 * 27) == 384
(3072 >>= 10) == (3072 / 210) == 3
(365 >>= 6) == (365/26) == 5
Слайд 6
Различия между логическими и поразрядными операциями в языке C
Логические операции:
15 && 10
== 1
31 || 128 == 1
63 || 0 == 1
!209 == 0
Поразрядные операции:
15 & 10 == 10
31 | 128 == 159
63 | 0 == 63
~209 == 46 (для беззнаковых однобайтных чисел!)
202 ^ 75 == 129
Слайд 7
Работа с отдельными битами числа
Задание: Инвертировать пятый и шестой биты младшего байта
числа X.
1 способ
srand(time(NULL));
int X = rand();
int X_56 = X << 26 >> 30; // А сдвиги можно было бы заменить на умножения в цикле
X -= (X_56 << 5); // И эти сдвиги тоже
switch (X_56) {
case 0: X_56 = 3;
break;
case 1: X_56 = 2;
break;
case 2: X_56 = 1;
break;
default: X_56 = 0;
break;
}
X += X_56;
Слайд 8
Работа с отдельными битами числа
Задание: Инвертировать пятый и шестой биты младшего байта
числа X.
2 способ
srand(time(NULL));
int X = rand();
int X_56 = ~X << 26 >> 30;
X -= (X & 96); // 9610 = 011000002
X_56 <<= 5;
X += X_56;
Слайд 9
Работа с отдельными битами числа
Задание: Инвертировать пятый и шестой биты младшего байта
числа X.
3 способ
srand(time(NULL));
int X = rand();
X ^= 96; //9610 = 011000002
Слайд 10
Работа с отдельными битами числа
Задание: выполнить циклический сдвиг числа x вправо на
2.
1 способ
srand(time(NULL));
int x = rand(), y = 0;
for (int i = 0; i < 2; ++i)
{
y = x % 2;
x = (x / 2) + (y * 2* 1024 * 1024 * 1024);
}
Слайд 11
Работа с отдельными битами числа
Задание: выполнить циклический сдвиг числа x вправо на
2.
2 способ
srand(time(NULL));
int x = rand(), y = 0;
for (int i = 0; i < 2; ++i)
{
y = x & 1; //110 = 000000012
x = (x >> 1) + (y << 31);
}
Слайд 12
Работа с отдельными битами числа
Задание: выполнить циклический сдвиг числа x вправо на
2.
3 способ
srand(time(NULL));
int x = rand();
int y = x % 4; // А лучше так: y = x & 3;
y <<= 30;
x >>= 2;
x += y;
Слайд 13
Задание 1
Задача:
Напишите программу на языке C, которая инвертирует второй по старшинству байт
случайного числа X типа int.
Слайд 14
Задание 2
Задача:
Напишите программу на языке C, которая меняет местами нулевой и третий,
а также первый и второй байты случайного числа X типа int.
Слайд 15
Задание 3
Задача:
Напишите программу на языке C, которая обнуляет биты случайного числа X
типа int с номерами 0, 5, 12 и 14.
Слайд 16
Задание 4
Задача:
Напишите программу на языке C, которая заносит в биты случайного числа
X типа int с номерами 3, 8 и 10 значение 1.
Слайд 17
Задание 5
Задача:
Напишите программу на языке C, которая выполняет циклический сдвиг влево на
3 первого байта случайного числа X типа int (нумерация байтов начинается с нуля!).
Слайд 18
Задание 6
Задача:
Напишите программу на языке C, которая выполняет проверку значения седьмого бита
случайного числа X типа int (нумерация битов начинается с нуля!). Если этот бит равен 0, инвертировать значение 12-го бита.
Слайд 19
Задание 7
Задача:
Напишите программу на языке C, которая получает случайное число X типа
int. В этом числе седьмой бит переместить в одиннадцатый, а третий и шестой поменять местами. Нумерация битов начинается с нуля.
Слайд 21
Установка NASM
Установка NASM:
Проверка наличия NASM в ОС: nasm –h (или просто nasm)
1
способ установки NASM:
Терминал -> apt install nasm
Ввод пароля!
Слайд 22
Установка NASM
Установка NASM:
2 способ установки NASM:
Загрузка архива, содержащего NASM
Разархивировать (например, в
папку nasm_cat), открыть файл INSTALL
Слайд 23
Установка NASM
Установка NASM:
.
.
Терминал -> cd ./nasm_cat
sh autogen.sh (может не понадобиться)
sh configure
make
Или: make
everything (более полное построение)
Или: make strip (игнорирование необязательных данных)
Переход в root (команда su или sudo)
Переход обратно в папку с nasm
make install
NASM установлен!
Слайд 25
Написание программ NASM
Написание программ:
Любой текстовый редактор (стандартный или любой другой)
Расширение (суффикс) файла
- *.asm
Слайд 26
Компиляция NASM
Компиляция:
Проходит в 2 этапа:
Ассемблирование
На выходе – объектный файл file.o
Сборка (компановка)
Компановка выполняется
из одного или нескольких объектных модулей. На выходе – исполняемый файл программы (например, prog). В Linux часто используется стандартный компановщик ld.
Слайд 27
Ассемблирование
Ассемблирование:
nasm -f <имя_файла.asm> [-o <объектный_файл>]
Формат выходных файлов:
elf
bin
obj
coff
… (их много)
Часто используется формат
elf
Слайд 28
Ассемблирование
Пример: nasm -f elf prog_nasm.asm
Результат: prog_nasm.o
Или: nasm -f elf prog_nasm.asm -o abc.o
Результат:
abc.o
Слайд 29
Ассемблирование
nasm -f elf prog_nasm2.asm
Слайд 30
Компановка
Компановщик – ld ([эль-дэ]).
ld prog_nasm2.o –o prog_nasm2
Слайд 31
Компановка
Используемая ОС – Linux Ubuntu x64, поэтому выведено сообщение об ошибке
Слайд 32
Компановка
Для 64-битных ОС:
ld –m elf_i386 prog_nasm2.o –o prog_nasm2
Слайд 33
Запуск программ NASM
Запуск:
./prog_nasm2
Слайд 34
Рекомендуемая литература
1. Расширенный ассемблер: NASM https://www.opennet.ru/docs/RUS/nasm/
Слайд 35
Рекомендуемая литература
2. А.В. Столяров. Программирование на языке ассемблера NASM для OS UNIX.
2011