Информатика. Занятие 5

Содержание

Слайд 2

Логические операции

Логические операции в языке C:
&& – логическое «И»
|| – логическое «ИЛИ»
!

Логические операции Логические операции в языке C: && – логическое «И» ||
– логическое «НЕ»

Слайд 3

Поразрядные (побитовые) операции

Поразрядные операции в языке C:
& – побитовое «И»
| – побитовое

Поразрядные (побитовые) операции Поразрядные операции в языке C: & – побитовое «И»
«ИЛИ»
~ – побитовое «НЕ»
^ – исключающее «Или»
<< – побитовый сдвиг влево
>> – побитовый сдвиг вправо
Другие поразрядные операции:
Стрелка Пирса (НЕ-ИЛИ)
Штрих Шеффера (НЕ-И)

Слайд 4

Поразрядные (побитовые) операции
Стрелка Пирса и штрих Шеффера:

Поразрядные (побитовые) операции Стрелка Пирса и штрих Шеффера:

Слайд 5

Поразрядные (побитовые) операции
Арифметические сдвиги:
A <<= B == A * 2B
A >>= B

Поразрядные (побитовые) операции Арифметические сдвиги: A A >>= B == A /
== A / 2B
Примеры арифметического сдвига:
(3 <<= 7) == (3 * 27) == 384
(3072 >>= 10) == (3072 / 210) == 3
(365 >>= 6) == (365/26) == 5

Слайд 6

Различия между логическими и поразрядными операциями в языке C

Логические операции:
15 && 10

Различия между логическими и поразрядными операциями в языке C Логические операции: 15
== 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 вправо на

Работа с отдельными битами числа Задание: выполнить циклический сдвиг числа 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 вправо на

Работа с отдельными битами числа Задание: выполнить циклический сдвиг числа 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 вправо на

Работа с отдельными битами числа Задание: выполнить циклический сдвиг числа 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, которая инвертирует второй по старшинству байт

Задание 1 Задача: Напишите программу на языке C, которая инвертирует второй по
случайного числа X типа int.

Слайд 14

Задание 2

Задача:
Напишите программу на языке C, которая меняет местами нулевой и третий,

Задание 2 Задача: Напишите программу на языке C, которая меняет местами нулевой
а также первый и второй байты случайного числа X типа int.

Слайд 15

Задание 3

Задача:
Напишите программу на языке C, которая обнуляет биты случайного числа X

Задание 3 Задача: Напишите программу на языке C, которая обнуляет биты случайного
типа int с номерами 0, 5, 12 и 14.

Слайд 16

Задание 4

Задача:
Напишите программу на языке C, которая заносит в биты случайного числа

Задание 4 Задача: Напишите программу на языке C, которая заносит в биты
X типа int с номерами 3, 8 и 10 значение 1.

Слайд 17

Задание 5

Задача:
Напишите программу на языке C, которая выполняет циклический сдвиг влево на

Задание 5 Задача: Напишите программу на языке C, которая выполняет циклический сдвиг
3 первого байта случайного числа X типа int (нумерация байтов начинается с нуля!).

Слайд 18

Задание 6

Задача:
Напишите программу на языке C, которая выполняет проверку значения седьмого бита

Задание 6 Задача: Напишите программу на языке C, которая выполняет проверку значения
случайного числа X типа int (нумерация битов начинается с нуля!). Если этот бит равен 0, инвертировать значение 12-го бита.

Слайд 19

Задание 7

Задача:
Напишите программу на языке C, которая получает случайное число X типа

Задание 7 Задача: Напишите программу на языке C, которая получает случайное число
int. В этом числе седьмой бит переместить в одиннадцатый, а третий и шестой поменять местами. Нумерация битов начинается с нуля.

Слайд 20

Ассемблер. NASM

Ассемблер. NASM

Слайд 21

Установка NASM

Установка NASM:
Проверка наличия NASM в ОС: nasm –h (или просто nasm)
1

Установка NASM Установка NASM: Проверка наличия NASM в ОС: nasm –h (или
способ установки NASM:
Терминал -> apt install nasm
Ввод пароля!

Слайд 22

Установка NASM

Установка NASM:
2 способ установки NASM:
Загрузка архива, содержащего NASM
Разархивировать (например, в

Установка NASM Установка NASM: 2 способ установки NASM: Загрузка архива, содержащего NASM
папку nasm_cat), открыть файл INSTALL

Слайд 23

Установка NASM

Установка NASM:
.
.
Терминал -> cd ./nasm_cat
sh autogen.sh (может не понадобиться)
sh configure
make
Или: make

Установка NASM Установка NASM: . . Терминал -> cd ./nasm_cat sh autogen.sh
everything (более полное построение)
Или: make strip (игнорирование необязательных данных)
Переход в root (команда su или sudo)
Переход обратно в папку с nasm
make install
NASM установлен!

Слайд 24

Установка NASM

Установка NASM

Слайд 25

Написание программ NASM
Написание программ:
Любой текстовый редактор (стандартный или любой другой)
Расширение (суффикс) файла

Написание программ NASM Написание программ: Любой текстовый редактор (стандартный или любой другой)
- *.asm

Слайд 26

Компиляция NASM

Компиляция:
Проходит в 2 этапа:
Ассемблирование На выходе – объектный файл file.o
Сборка (компановка) Компановка выполняется

Компиляция NASM Компиляция: Проходит в 2 этапа: Ассемблирование На выходе – объектный
из одного или нескольких объектных модулей. На выходе – исполняемый файл программы (например, prog). В Linux часто используется стандартный компановщик ld.

Слайд 27

Ассемблирование

Ассемблирование:
nasm -f <имя_файла.asm> [-o <объектный_файл>]
Формат выходных файлов:
elf
bin
obj
coff
… (их много)
Часто используется формат

Ассемблирование Ассемблирование: nasm -f [-o ] Формат выходных файлов: elf bin obj
elf

Слайд 28

Ассемблирование

Пример: nasm -f elf prog_nasm.asm Результат: prog_nasm.o
Или: nasm -f elf prog_nasm.asm -o abc.o Результат:

Ассемблирование Пример: nasm -f elf prog_nasm.asm Результат: prog_nasm.o Или: nasm -f elf
abc.o

Слайд 29

Ассемблирование
nasm -f elf prog_nasm2.asm

Ассемблирование nasm -f elf prog_nasm2.asm

Слайд 30

Компановка
Компановщик – ld ([эль-дэ]).
ld prog_nasm2.o –o prog_nasm2

Компановка Компановщик – ld ([эль-дэ]). ld prog_nasm2.o –o prog_nasm2

Слайд 31

Компановка
Используемая ОС – Linux Ubuntu x64, поэтому выведено сообщение об ошибке

Компановка Используемая ОС – Linux Ubuntu x64, поэтому выведено сообщение об ошибке

Слайд 32

Компановка

Для 64-битных ОС:
ld –m elf_i386 prog_nasm2.o –o prog_nasm2

Компановка Для 64-битных ОС: ld –m elf_i386 prog_nasm2.o –o prog_nasm2

Слайд 33

Запуск программ NASM

Запуск:
./prog_nasm2

Запуск программ NASM Запуск: ./prog_nasm2

Слайд 34

Рекомендуемая литература

1. Расширенный ассемблер: NASM https://www.opennet.ru/docs/RUS/nasm/

Рекомендуемая литература 1. Расширенный ассемблер: NASM https://www.opennet.ru/docs/RUS/nasm/

Слайд 35

Рекомендуемая литература

2. А.В. Столяров. Программирование на языке ассемблера NASM для OS UNIX.

Рекомендуемая литература 2. А.В. Столяров. Программирование на языке ассемблера NASM для OS UNIX. 2011
2011