- •Содержание
- •Преобразование чисел
- •Целые числа
- •Дробные числа
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Лабораторная работа №2
- •Объединение со структурой с битовыми полями в языке Си.
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Лабораторная работа №3
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Лабораторная работа №4
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Лабораторная работа №5
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Лабораторная работа №6
- •Программирование на ассемблере
- •Основные команды ассемблера
- •Директивы
- •Программные прерывания
- •Отладка программ
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Лабораторная работа №7
- •Команда jmp
- •Команда Loop
- •Флаговый регистр (flags)
- •Команды условного перехода
- •Знаковые и беззнаковые данные
- •Команды логических операций: and, or, xor, test, not
- •Команды сдвига и циклического сдвига
- •Команды сдвига
- •Команды циклического сдвига
- •Содержание отчета
- •Контрольные вопросы
- •Задание на занятие
- •Литература
Содержание отчета
Для защиты лабораторной работы каждым студентом должен быть написан отчет о лабораторной работе, оформленный в отдельной тетради для лабораторных работ по курсу «Вычислительные машины, системы и сети», включающий тему, цель работы и содержащий следующие пункты:
Общие сведения о логических функциях и синтезе цифровых схем.
Задание на занятие.
Таблица истинности заданной функции.
Выражение для функции, полученное по таблице истинности.
Карта Вейча для своего варианта функции.
Минимизированное с помощью карты Вейча выражение функции.
Схема минимизированной функции на элементах И-ИЛИ-НЕ.
Алгоритм работы программы (блок-схема или словесное описание).
Текст программы на языке Си для минимизированной функции.
Контрольные вопросы
Что такое цифровая схема?
Что такое логический элемент? Приведите примеры.
Что такое таблица истинности?
Каким образом записывается функция по таблице истинности?
Что такое карта Вейча?
Чем определяется размер карты Вейча?
Правило записи набора аргументов из карты Вейча?
Что гарантирует использование карт Вейча?
Запишите соответствие оператора дискретной математики "и", оператора языка Си и логического элемента.
Запишите соответствие оператора дискретной математики "или", оператора языка Си и логического элемента.
Запишите соответствие оператора дискретной математики "не", оператора языка Си и логического элемента.
Задание на занятие
Согласно своему варианту по таблице истинности написать программу на языке Си, моделирующую логическую функцию трех переменных.
Минимизировать, если это возможно, функцию трех переменных.
Оформить отчет.
Варианты функций:
Переменные |
Варианты значения функции | |||||||||||
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
Лабораторная работа №4
Символьные данные
Продолжительность: 8 часов.
Цель: Изучить компьютерное представление символьных данных и ввод данных с клавиатуры.
Основные сведения
Внутри компьютера данные и команды, хранятся в двоичном виде. У каждого компьютера есть набор символов, который он использует. Как минимум этот набор включает 26 заглавных и 26 строчных букв, цифры от 0 до 9, а также некоторые специальные символы: пробел, точка, запятая, символ возврата каретки и т.д. Для того чтобы компьютер мог использовать эти символы, каждому из них приписывается в соответствие номер [2]. Отображение символов в целые числа называется кодом символов. Важно отметить, что связанные между собой устройства и компьютеры должны иметь один и тот же код для одинаковых символов, иначе они не смогут обмениваться информацией. По этой причине были разработаны стандарты для кодирования символов. Самые важные из них – этоASCII-код иUNICODE.ASCII-код был так назван по первым буквам своего названия: американский стандартный код для обмена информацией (AmericanStandardCodeforInformationInterchange). Каждый символASCII-кода содержит 8 битов, таким способом может быть закодировано 256 символов (см. Табл. 4.1). КодировкаUNICODE содержит 16 бит.
Коды от 0 до 0x7Fявляются одними и теми же кодами символов для всех стран. С кода 0x80 начинаются символы национальных букв, а также псевдографические символы и некоторые специальные знаки (таблица 4.2). Эти символы могут отличаться в зависимости от национального драйвера клавиатуры.
Таблица 4.1. ASCII-коды символов (от 0x20 до 0x7F)
Код |
Символ |
Код |
Символ |
Код |
Символ |
Код |
Символ |
Код |
Символ |
Код |
Символ |
20 |
|
30 |
0 |
40 |
@ |
50 |
P |
60 |
` |
70 |
p |
21 |
! |
31 |
1 |
41 |
A |
51 |
Q |
61 |
a |
71 |
q |
22 |
" |
32 |
2 |
42 |
B |
52 |
R |
62 |
b |
72 |
r |
23 |
# |
33 |
3 |
43 |
C |
53 |
S |
63 |
c |
73 |
s |
24 |
$ |
34 |
4 |
44 |
D |
54 |
T |
64 |
d |
74 |
t |
25 |
% |
35 |
5 |
45 |
E |
55 |
U |
65 |
e |
75 |
u |
26 |
& |
36 |
6 |
46 |
F |
56 |
V |
66 |
f |
76 |
v |
27 |
' |
37 |
7 |
47 |
G |
57 |
W |
67 |
g |
77 |
w |
28 |
( |
38 |
8 |
48 |
H |
58 |
X |
68 |
h |
78 |
x |
29 |
) |
39 |
9 |
49 |
I |
59 |
Y |
69 |
i |
79 |
y |
2A |
* |
3A |
: |
4A |
J |
5A |
Z |
6A |
j |
7A |
z |
2B |
+ |
3B |
; |
4B |
K |
5B |
[ |
6B |
k |
7B |
{ |
2C |
, |
3C |
< |
4C |
L |
5C |
\ |
6C |
l |
7C |
| |
2D |
- |
3D |
= |
4D |
M |
5D |
] |
6D |
m |
7D |
} |
2E |
. |
3E |
> |
4E |
N |
5E |
^ |
6E |
n |
7E |
~ |
2F |
/ |
3F |
? |
4F |
O |
5F |
_ |
6F |
o |
7F |
⌂ |
Таблица 4.2 ASCII-коды символов (от 0x80 до 0xFF)
Код |
Символ |
Код |
Символ |
Код |
Символ |
Код |
Символ |
Код |
Символ |
Код |
Символ |
Код |
Символ |
Код |
Символ |
80 |
А |
90 |
Р |
A0 |
а |
B0 |
░ |
C0 |
└ |
D0 |
╨ |
E0 |
р |
F0 |
Ё |
81 |
Б |
91 |
С |
A1 |
б |
B1 |
▒ |
C1 |
┴ |
D1 |
╤ |
E1 |
с |
F1 |
ё |
82 |
В |
92 |
Т |
A2 |
в |
B2 |
▓ |
C2 |
┬ |
D2 |
╥ |
E2 |
т |
F2 |
Є |
83 |
Г |
93 |
У |
A3 |
г |
B3 |
│ |
C3 |
├ |
D3 |
╙ |
E3 |
у |
F3 |
є |
84 |
Д |
94 |
Ф |
A4 |
д |
B4 |
┤ |
C4 |
─ |
D4 |
╘ |
E4 |
ф |
F4 |
Ї |
85 |
Е |
95 |
Х |
A5 |
е |
B5 |
╡ |
C5 |
┼ |
D5 |
╒ |
E5 |
х |
F5 |
ї |
86 |
Ж |
96 |
Ц |
A6 |
ж |
B6 |
╢ |
C6 |
╞ |
D6 |
╓ |
E6 |
ц |
F6 |
Ў |
87 |
З |
97 |
Ч |
A7 |
з |
B7 |
╖ |
C7 |
╟ |
D7 |
╫ |
E7 |
ч |
F7 |
ў |
88 |
И |
98 |
Ш |
A8 |
и |
B8 |
╕ |
C8 |
╚ |
D8 |
╪ |
E8 |
ш |
F8 |
° |
89 |
Й |
99 |
Щ |
A9 |
й |
B9 |
╣ |
C9 |
╔ |
D9 |
┘ |
E9 |
щ |
F9 |
• |
8A |
К |
9A |
Ъ |
AA |
к |
BA |
║ |
CA |
╩ |
DA |
┌ |
EA |
ъ |
FA |
· |
8B |
Л |
9B |
Ы |
AB |
л |
BB |
╗ |
CB |
╦ |
DB |
█ |
EB |
ы |
FB |
√ |
8C |
М |
9C |
Ь |
AC |
м |
BC |
╝ |
CC |
╠ |
DC |
▄ |
EC |
ь |
FC |
№ |
8D |
Н |
9D |
Э |
AD |
н |
BD |
╜ |
CD |
═ |
DD |
▌ |
ED |
э |
FD |
¤ |
8E |
О |
9E |
Ю |
AE |
о |
BE |
╛ |
CE |
╬ |
DE |
▐ |
EE |
ю |
FE |
■ |
8F |
П |
9F |
Я |
AF |
п |
BF |
┐ |
CF |
╧ |
DF |
▀ |
EF |
я |
FF |
|
Вывод символов на экран. Коды от 0x0 до 0x1Fсоответствуют управляющим символам, которые раньше предназначались для пересылки данных. Сейчас в передаче данных по сетям и телефонным линиям используются совсем другие принципы и форматы, но некоторые символы до сих пор сохранили своё назначение – управляющие символы применяются для форматирования при выводе на стандартные устройства (см. Табл.4.3). Такие символы нельзя ввести с клавиатуры с помощью функций ввода, обеспечивающих автоматическое эхо (getche(),scanf() и т.д.).
Таблица 4.3. Коды некоторых управляющих символов.
Код |
Команда |
Значение |
Управляющая последовательность в Си |
0x07 |
BEL |
Bell (звонок) |
\a |
0x08 |
BS |
BackSpace (отступ назад) |
\b |
0x09 |
HT |
HorizontalTab(горизонтальная табуляция) |
\t |
0x0A |
LN |
Line Feed (перевод строки) |
\n |
0x0B |
VT |
VerticalTab(вертикальная табуляция) |
\v |
0x0D |
CR |
Carriage Return (возврат каретки) |
\r |
0x1A |
SUB |
Substitute(замена и конец файла) |
\x1a |
0x1B |
ESC |
ESCape (выход) |
\x1b |
Используя форматирующую строку для вывода символа – "%c", можно вывести на экран символьные отображения некоторых управляющих символов:
Пример 4.1.Вывод на экран двадцати шести управляющих символов.
char i,c;
for (i=0;i<=0x1f;i++)
printf("key %d=%c\n",i,i);
При таком способе управляющие шесть символов с кодами: 7, 8, 9, 0xA, 0xDи 0x1A- интерпретируются буквально согласно своему значению (табл. 4.3), и поэтому необходим другой способ для вывода этих символов на экран.
Пример 4.2.Вывод на экран первых тридцати двух символов ASCII.
#include <dos.h>
void main()
{unsigned int far *screen;
clrscr();
screen = (unsigned int *) MK_FP(0xB800, 0);
int i;
for (i=0; i<=0x1f; i++) screen[i] = 0x0F00 + i;}
В этом примере мы создали глобальный указатель на видеопамять текстового режима. После создания указателя мы обращаемся к видеопамяти как к одномерному массиву из iэлементов, в котором каждый элемент типаunsignedint(беззнаковые два байта) соответствует символу на экране. Первый байт элемента отвечает за цветовой атрибут, а второй – за его код. Таким образом, у всех тридцати двух символов из примера 4.2 цветовой атрибут неизменен и соответствует белым символам на черном фоне.
Рис. 4.1. Выполнение программы из примера 4.2.
Если мы изменим старший байт элемента следующим образом:
for (i=0; i<=0x1f; i++) screen[i]=((i%16)<<8)+i;
то мы увидим на экране ряд из цветных символов, причем цвета начинаются заново каждые 16 символов.
Рис. 4.2. Выполнение измененной программы из примера 4.2.
Если мы изменим обращение к элементам массива так, чтобы данные заносились только в четные элементы:
for (i=0; i<=0x1f; i++) screen[i*2]=((i%16)<<8)+i;
то мы увидим, что ряд символов "разредился".
Рис. 4.3. Выполнение измененной программы из примера 4.2.
Для удобства можно вывести кроме символов и их коды. Поэтому увеличиваем цикл вывода на экран до 256 символов и добавляем цикл вывода кодов следующим образом:
Пример 4.3. Вывод на экран 256 символов и их кодов.
// вывод кодов в десятичном виде
for (int j=0;j<16;j++)
for (int i=0;i<16;i++) printf("%3d ",i*16+j);
// вывод символов
for (i=0;i<16;i++) for (j=0;j<16;j++)
screen[i*5+j*80+4] = 0x0E00 + i*16+j;
Обратите внимание на то, что в строке на экране может поместиться только 80 символов. Вывод на экран кодов с форматирующей последовательностью %3dплюс два пробела (итого, 5) дает возможность автоматического переноса на новую строку после выполнения шестнадцати командprintf().
Ввод символов с клавиатуры.
Рассмотрим внешний вид стандартной клавиатуры IBMPC(рис. 4.4).
Рис. 4.4. Стандартная клавиатура IBM PC.
Можно выделить три основные группы клавиш, которые могут обрабатываться программным путём (таблица 4.3).
Таблица 4.3. Группы клавиш.
Внешний вид |
Наименование |
Описание |
|
обычные клавиши |
ASCII-код!=0, скан-код!=0 |
|
функциональные клавиши |
ASCII-код=0, скан-код!=0 |
|
управляющие клавиши |
ASCII-код и скан-код отсутствует, функциейgetch() не определяется |
Клавиши, которые обрабатываются функцией getch() (обычные и функциональные), имеют двухбайтовый код. Младший байт называетсяASCII-кодом клавиши, а старший – скан-кодом. ЕслиASCII-код равен нулю, то это означает, что была нажата функциональная клавиша, и нужно считывать еще и скан-код.
Пример 4.4.Ввод с клавиатуры и отображение кодов клавиш в шестнадцатеричном виде.
#include <stdio.h>
#include <conio.h>
void main ()
{ char ascii,scan;
// цикл до нажатия ESC
while (ascii != 27)
{ ascii=getch();
if (!ascii) scan=getch(); else scan=0;
// вывод ASCII-кода и скан-кода клавиши
printf("\nASCII = %2x Scan = %2x ",ascii,scan);
// если код нерасширенный, то вывести символ
if (ascii) printf(" simbol=%c",ascii); } }
Нажатие на управляющие клавиши не определяется стандартными функциями языка Си. Для этой группы клавиш следует использовать прерывание BIOS16h, которое отвечает за сервис клавиатуры. Функция 12hэтого прерывания считывает состояние расширенныхshift-клавиш. После выполнения этой функции результат возвращается в регистрAX, гдекаждый бит имеет особое значение:
Младший байт AX (AL):
бит 7 =1 режим вставки (Insert) включен
бит 6 =1 режим CapsLock включен (горит светодиод)
бит 5 =1 режим NumLock включен (горит светодиод)
бит 4 =1 режим ScrollLock включен (горит светодиод)
бит 3 =1 клавиша Alt нажата
бит 2 =1 клавиша Ctrl нажата
бит 1 =1 клавиша левый Shift нажата
бит 0 =1 клавиша правый Shift нажата
Старший байт AX (AH):
бит 7 =1 клавиша SysReq нажата (на современных компьютерах клавиша отсутствует)
бит 6 =1 клавиша CapsLock нажата
бит 5 =1 клавиша NumLock нажата
бит 4 =1 клавиша ScrollLock нажата
бит 3 =1 клавиша правый Alt нажата
бит 2 =1 клавиша правый Ctrl нажата
бит 1 =1 клавиша левый Alt нажата
бит 0 =1 клавиша левый Ctrl нажата
Пример 4.5.Вывод состояния клавиатуры и отображение нажатия управляющих клавиш.
#include <conio.h>
#include <stdio.h>
#include <dos.h>
void main ()
{ clrscr();
char *status[8], *KeyPress[8];
status[0] ="Ins "; status[1] ="CapL";
status[2] ="NumL"; status[3] ="ScrL";
status[4] ="Alt "; status[5] ="Ctrl";
status[6] ="LSht"; status[7] ="RSht";
KeyPress[0]="SysR"; KeyPress[1]="CapL";
KeyPress[2]="NumL"; KeyPress[3]="ScrL";
KeyPress[4]="RAlt"; KeyPress[5]="RCtr";
KeyPress[6]="LAlt"; KeyPress[7]="LCtr";
char b1,b2;
int i,c;
clrscr();
do
{ asm mov ah,12h
asm int 16h
asm mov b1,al
asm mov b2,ah
for (i=7;i>=0;i--)
{
if (((b1 >> i) & 1)!=0) textcolor(WHITE);
else textcolor(DARKGRAY);
gotoxy((8-i)*8,2);
cprintf("%s ",status[7-i]);
if (((b2 >> i) & 1)!=0) textcolor(WHITE);
else textcolor(DARKGRAY);
gotoxy((8-i)*8,4);
cprintf("%s ",KeyPress[7-i]);
}
if (kbhit()) c=getch();
} while(c!=27);
}