Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Арифметические операции Ассемблер. Команды АссемблераСтр 1 из 6Следующая ⇒
Введение в язык Ассемблер
Арифметические операции Ассемблер. Команды Ассемблера
Текст программы .686; директива определения типа микропроцессора .data; директива определения данные .code; директива начала сегмента команд Результат работы программы
|
Двумерные массивы на Ассемблере. Ассемблер двумерными массивами примеры
В данном уроке паказывается ввод элементов в двумерный массив. Приводится пример нахождение максимального элемента массива в ассемблере. И происходит вывод в MessageBox. Пример: Ввести двумерный массив размером 7 х 4. Найти наибольший элемент двумерного массива. Удалить строку с максимальным элементом.
.686; директива определения типа микропроцессора includelib \masm32\lib\user32.lib .data; директива определения данные frmt db " %d", 0 .code; директива начала кода программы mov ecx, _c .ELSE; иначе .ENDIF; окончание директивы высокого уровня ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov ecx, _c .IF(eax == max); условие .ELSE; иначе .ENDIF; окончание директивы высокого уровня m5: .IF(nomer < =14); условие .IF(nomer < =21); условие .IF(nomer < =28); условие end_prog: mov ebx, nomer invoke wsprintf \ Результат работы программы:
|
Ассемблер структуры. Примеры задач
Пример: Задана матрица 3 X 4. Определить максимальный элемент каждой строки. Результат выполнения программы вывести в окно консоли. Текст программы: .386; директива определения типа микропроцессора DATE1 STRUCT; тип данных СТРУКТУРА с именем DATE1 mov eax, 0 lea esi, st3 _m1: mov al, 10 dec ebx; ebx: = ebx – 1 mov al, 10 invoke MessageBox \; API-ФУНКЦИЯ выведения окна консоли invoke ExitProcess, 0; возвращение управления ОС Windows
|
Текст процедуры программы
.686; директива определения типа микропроцессора
.model flat; задание линейной модели памяти
option casemap: none
public _abcd
extern _a: dword, _b: dword, _c: dword, _d: dword
.code; директива начала программы
_abcd proc; ab - c/d
mov eax, _a; пересылка из памяти с именем _а в eax
mov ebx, _b; пересылка из памяти с именем _b в ebx
mul ebx; edx, eax: = eax? ebx
mov esi, eax
mov edi, edx
mov eax, _c
mov ebx, _d
xor edx, edx; подготовление к делению
div ebx
mov ecx, 0
sub ecx, edx; вычитание мелкой части из целого числа
sbb esi, eax; вычитание целой младшей части
sbb edi, 0; вычитание позычки, если она есть
ret
_abcd endp
end; директива окончания программы
Результат работы программы
Массивы в Ассемблере. Программа на Ассемблере. Пример массив элементов
Пример задачи с использованием массива на ассемблере: Заданы массивы Aи Виз N= 8 элементов. Сформировать новый массивСпо правилу: если у элементов Aiи Bi биты 0, 1 и 2 совпадают, то Ci= Аi + Вi. |
Текст прогаммы
.686; директива определения типа микропроцессора
.model flat, stdcall; задание линейной модели памяти
; но соглашения ОС Windows
option casemap: none; отличие малых и больших букв
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\fpu.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\fpu.lib
ExitProcess proto: DWORD
.data; директива определения данные
st1 db " Вывод массива! С", 0
st2 db 10 dup(? ), 0
ifmt db " %d", 0
masivA db 7, 34, 34, 45, 2, 6, 2-6
masivB db 54, 2, 7, 43, 13-7, 65, 9
masivC db 8 dup(0)
work1 db 0
work2 db 0
prom dd 0
.code; директива начала кода программы
_start:
mov eax, 0
mov ebx, 0
mov ecx, 8
mov edx, 0
lea esi, masivA
lea edi, masivB
lea edx, masivC
M1:
mov prom, ebx
mov al, byte ptr[esi+ebx]
mov bl, byte ptr[edi+ebx]
mov work1, al
mov work2, bl
and eax, 07h
and ebx, 07h
sub eax, ebx
jz M3
M2:
mov ebx, prom
inc ebx
loop M1
jmp M4
M3:
mov al, work1
mov bl, work2
add al, bl
mov [edx+ebx], al
jmp M2
M4:
mov edx, 0
mov ecx, 08h
Prom:
lea esi, masivC;
mov al[esi+edx]
cmp al, 0
jnz _M2
_M1: inc edx
loop Prom
jmp _M3
_M2:
mov ebx, eax
jmp _M1
_M3:
invoke wsprintf \
ADDR st2 \
ADDR ifmt \
ebx
invoke MessageBox \
NULL \
addr st2 \
addr st1 \
MB_OK
invoke ExitProcess, 0
end _start; окончание программы
Результат работы программы
Макросы в Ассемблере. Примеры задач
Пример: Написать программу с использованием макросов для вычисления одного из выражений без предыдущего математического упрощения операций: Текст программы: .686; директива определения типа микропроцессора Результат работы программы:
|
Файл 1dll.asm
.386
.model flat, stdcall
option casemap: none; отличие строчных и прописных букв
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\fpu.inc
include \masm32\include\user32.inc
include \masm32\include\msvcrt.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\fpu.lib
includelib 1.lib
ExitProcess proto: DWORD
Mas_sum proto: DWORD, : DWORD, : DWORD; прототип процедуры
.data; директива определения данные
_c dd 40
sum dd 0
op1 dd 6; запись в 32-разрядную память op1
op2 dd 22; минимальных предел
frmt db " %d", 0
buf db 30 dup(? )
stdout DWORD?
stdin DWORD?
cRead dd?
temp dd?
mas1 dd 40 dup(0)
st1 db " Vvesty masiv: "
st2 db " Вывод количества элементов в пределах (6, 22) массива! А, 0
st3 db 10 dup(0)
ifmt db " количество = %d", 0
.code; директива начала кода программы
_start:
lea esi, mas1; загрузка адреса начала массива
mov ecx, _c
m1:
mov ebx, ecx
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov stdout, eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov stdin, eax
invoke WriteConsoleA, stdout, ADDR st1, 14, NULL, NULL; VIVOD ST1
invoke ReadConsole, stdin, ADDR buf, 20
ADDR cRead, NULL; чтения числа как символ
invoke crt_atoi, ADDR buf; преобразовать символ в число
mov [esi], eax
add esi, 4
mov ecx, ebx
loop m1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ecx, _c
lea esi, mas1; загрузка адреса начала массива
mov eax [esi]; загрузка числа
m3:
invoke Mas_sum, op1, op2, eax
add sum, ebx
add esi, 4; расчет адреса нового числа
mov eax[esi]
loop m3
mov ebx, sum
invoke wsprintf \
ADDR st3 \
ADDR ifmt \
ebx
invoke MessageBox \
NULL \
addr st3 \
addr st2 \
MB_OK
invoke ExitProcess, 0
ret
end _start; конец программы
Результат работы программы:
Ассемблер сопроцессор. Примеры задач
Пример 1: Вычислить 6 значений функции: Yn = 4x/(x + 5) (х изменяется от 3 с шагом 1, 25). Результат округлить к целому, разместить в памяти и вывести на экран.
includelib \masm32\lib\user32.lib .data; директива определения данные _x dd 3; сохранение в 32-разрядном амбарчике памяти переменной х .code; директива начала кода программы add edi, 4 loop m1 lea edi, st2 invoke wsprintf \
Пример 2 : Определить номер (х) элемента функции: xn = 3х + 5, при котором сумма элементов превысит 12 000. Результат разместить в памяти и вывести соответствующие сообщения.
includelib \masm32\lib\user32.lib .data; директива определения данные _x dd 0; сохранение переменной х .code; директива начала кода программы mov eax, _x invoke wsprintf \
Пример 3: Вычислить 4 значения функции: Y = 3 * log2(x2+1), x изменяется от 0, 2 с шагом 0, 3.
includelib \masm32\lib\user32.lib .data; директива определения данные _x dd 0.2; сохранение в 32-разрядном амбарчике памяти переменной х .code; директива начала кода программы fld _x
invoke FpuFLtoA, 0, 10, ADDR st2, SRC1_FPU or SRC2_DIMM end _start; директива окончания программы с именем start |
Результат работы программы
Общая информация
Здесь представлена информация по ассемблеру всей серии AVR, т.к. все микроконтроллеры этой серии программно совместимы.
Ассемблер – это инструмент, с помощью которого создаётся программа для микроконтроллера. Ассемблер транслирует ассемблируемый исходный код программы в объектный код, который может использоваться в симуляторах или эмуляторах AVR. Также ассемблер генерирует код, который может быть непосредственно введен в программную память микроконтроллера.
При работе с ассемблером нет никакой необходимости в непосредственном соединении с микроконтроллером.
Исходный файл, с которым работает ассемблер, должен содержать мнемоники, директивы и метки.
Перед каждой строкой программы можно ставить метку, которая является алфавитно-цифровой строкой, заканчивающейся двоеточием. Метки используются как указания для безусловного перехода и команд условного перехода.
Строка программы может быть в одной из четырёх форм:
[ Метка: ] директива [операнды] [Комментарий]
[ Метка: ] команда [операнды] [Комментарий]
Комментарий
Пустая строка
Комментарий имеет следующую форму:
; [Текст]
Таким образом любой текст после символа “; ” игнорируется ассемблером и имеет значение только для пользователя.
Операнды можно задавать в различных форматах:
- десятичный (по умолчанию): 10, 255
- шестнадцатеричный (два способа): 0x0а, $0а
- двоичный: 0b00001010, 0b11111111
- восьмеричный (впереди ноль): 010, 077
Система команд
Система команд микроконтроллеров ATMEL семейства AVR очень большая и в то же время эффективная. Одной из отличительных особенностей микроконтроллеров AVR является то, что почти все команды выполняются за 1 тактовый цикл. Исключение составляют команды перехода. Это существенно увеличивает производительность микроконтроллера даже при относительно невысокой тактовой частоте.
Все команды можно классифицировать на 5 типов:
1. арифметические команды;
2. логические команды;
3. команды перехода;
· команды передачи данных;
· побитовые команды и команды тестирования битов.
Директивы ассемблера
Ассемблер поддерживает множество директив. Директивы не транслируются непосредственно в коды операции. Напротив, они используются, чтобы корректировать местоположение программы в памяти, определять макрокоманды, инициализировать память и так далее. То есть это указания самому ассемблеру, а не команды микроконтроллера.
Все директивы ассемблера приведены в табл. 1.2.
Таблица 1.2.
Директивы ассемблера
Директива | Описание |
BYTE | Зарезервировать байт под переменную |
CSEG | Сегмент кодов |
DB | Задать постоянным(и) байт(ы) в памяти |
DEF | Задать символическое имя регистру |
DEVICE | Задать для какого типа микроконтроллера компилировать |
DSEG | Сегмент данных |
DW | Задать постоянное(ые) слово(а) в памяти |
EQU | Установите символ равный выражению |
ESEG | Сегмент EEPROM |
EXIT | Выход из файла |
INCLUDE | Включить исходный код из другого файла |
LIST | Включить генерацию.lst - файла |
NOLIST | Выключить генерацию.lst - файла |
ORG | Начальный адрес программы |
SET | Установите символ равный выражению |
Синтаксис всех директив следующий:
.[директива]
То есть перед директивой должна стоять точка. Иначе ассемблер воспринимает это как метку.
Дадим несколько пояснений наиболее важным директивам ассемблера
CSEG - Code segment
Директива CSEG указывает на начало сегмента кодов. Ассемблируемый файл может иметь несколько кодовых сегментов, которые будут объединены в один при ассемблировании.
Синтаксис:
.CSEG
Пример:
.DSEG; Начало сегмента данных
vartab: .BYTE 4; Резервируется 4 байта в СОЗУ
.CSEG; Начало сегмента кодов
const: .DW 2; Записать 0x0002 в программной памяти
mov r1, r0; Что-то делать
DSEG - Data Segment
Директива DSEG указывает на начало сегмента данных. Ассемблируемый файл может содержать несколько сегментов данных, которые потом будут собраны в один при ассемблировании. Обычно сегмент данных состоит лишь из директив BYTE и меток.
Синтаксис:
.DSEG
Пример:
.DSEG; Начало сегмента данных
var1: .BYTE 1; Резервировать 1 байт под переменную var1
table: .BYTE tab_size; Резервировать tab_size байтов.
.CSEG
ldi r30, low(var1)
ldi r31, high(var1)
ld r1, Z
ESEG - EEPROM Segment
Директива ESEG указывает на начало сегмента EEPROM памяти. Ассемблируемый файл может содержать несколько EEPROM сегментов, которые будут собраны в один сегмент при ассемблировании. Обычно сегмент EEPROM состоит из DB и DW директив (и меток). Сегмент EEPROM памяти имеет свой собственный счетчик. Директива ORG может использоваться для размещения переменных в нужной области EEPROM.
Синтаксис:
.ESEG
Пример:
.DSEG; Начало сегмента данных
var1: .BYTE 1; Резервировать 1 байт под переменную var1
table: .BYTE tab_size; Зарезервировать tab_size байт.
.ESEG
eevar1: .DW 0xffff; Записать 1 слово в EEPROM
Написание программы
Текст программы можно набирать в любом текстовом редакторе, такие как встроенный редактор Norton Commander, FAR, а также Microsoft Word, WordPad и других. Также можно использовать специально предназначенные для этого программы Wavrasm, AVR Studio
Для создания программы не обязательно использовать ассемблер, программное обеспечение AVR поддерживает также и язык C или С++. Но в лабораторном комплексе этот вариант не рассматривается.
Программа, написанная на ассемблере, должна иметь определенную структуру.
Предлагается следующий шаблон (для AT90S8535)
; *******************************************
; название программы,
; краткое описание, необходимые пояснения
: *******************************************
; ******подключаемые дополнительные файлы
.include “8535def.inc”; файл описания AT90S8535
.include «имя_файла1.расширение»; включение дополнительных
.include «имя_файла2.расширение»; файлов
; ******глобальные константы
.equ имя1 = xxxx;
.equ имя2 = nnnn
; ******глобальные регистровые переменные
.def имя1= регистр
.def имя2= регистр
; *******сегмент данных
.dseg
.org xxxx; адрес первого зарезервированного байта
label1: .BYTE 1; резервировать 1 байт под переменную label1
label2: .BYTE m; резервировать m байт под переменную label2
; ****** сегментEEPROM(ЭСППЗУ)
.eseg
.org xxxx; адрес первого зарезервированного байта
.db выражение1, выражение2, …; записать список байтов в EEPROM.
.dw выражение1, выражение2, …; записать список слов в EEPROM.
; ******сегмент кодов
.cseg
.org $0000; адрес начала программы в программной памяти
; ****** вектора прерываний (если они используются)
rjmp reset; прерывание по сбросу
.org $0002
rjmp INT0; обработчик прерывания IRQ0
.org $0004
rjmp INT1; обработчик прерывания IRQ1
.org adrINTx; адрес следующего обработчика прерываний
rjmp INTx; обработчик прерывания x
…….; далее по порядку располагать обработчики остальных; прерываний
; *******начало основной программы
main: < команда> xxxx
… …
; ******* подпрограммы
; *******подпрограмма 1
subr1: < команда> xxxx
…… ………. ……
ret
; *******подпрограмма 2
subr2: < команда> xxxx
…… ………. ……
ret
…………….
; ******* программы обработчиков прерываний
INT0: < команда> xxxx
…… ………. ……
reti
INT1: < команда> xxxx
…… ………. ……
reti
INTx: < команда> xxxx
…… ………. ……
reti
………………………
; конец программы никак не обозначается.
Ниже приводятся 3 программы решения одной и той же простейшей программы, демонстрирующие использование директив ассемблера.
Как уже указывалось, программа простейшая: вычесть из числа 5 число 3. Если включен тумблер SA1 (рис. 1.2), то на индикацию выдать результат вычитания. Если тумблер SA1отключен – на индикацию вывести цифру ноль.
Алгоритм программы (рис. 1.5) соответствует программе №1, использующей директиву equ ассемблера.
Программа №2 отличается от программы №1 резервированием по одному байту оперативной памяти под семисегментные коды цифр от 0 до 9.
Программа №3 самая короткая. Она использует директиву.dw для определения слов в программной памяти. В программе используется команда LPM ассемблера. По этой команде загружается байт, адресуемый регистром Z в регистр R0. Команда обеспечивает доступ к любому байту памяти программы, организованной как 16 битное слово. Младший бит регистра Z определяет, осуществляется ли доступ к младшему байту слова (0) или к старшему (1).
Рис. 1.5 Алгоритм программы №1
; Программа №1.Использование директивы equ
.include " 8535def.inc" ; включить файл – описание для AT90S8535
.dseg; сегмент данных
.equ cod0=$64; присвоение имен ячейкам SRAM
.equ cod1=$65
.equ cod2=$66
.equ cod3=$67
.equ cod4=$68
.equ cod5=$69
.equ cod6=$6a
.equ cod7=$6b
.equ cod8=$6c
.equ cod9=$6d
.cseg
.org 0
rjmp reset
.org $30; начало программы
reset:
ldi r16, $00; определение стека с вершиной по адресу $00ff
out sph, r16
ldi r16, $ff
out spl, r16
ldi zl, $64; задание адреса начала зарезервированных ячеек
ldi zh, $00
ldi r16, $ff; настроить порт С на выход
out ddrc, r16
ldi r16, 00; настроить порт А на вход
out ddra, r16
ldi r16, $c; настроить порт В: биты 2 и 3 на выход, остальные на вход
out ddrb, r16
ldi r16, $f0; настроить порт D: биты 0...4 на вход, остальные на выход
out ddrd, r16
sbi portB, 3; выдать 1 на разряд 3 порта В
ldi r17, $3f; задание семисегментных кодов
sts cod0, r17
ldi r17, $06
sts cod1, r17
ldi r17, $5b
sts cod2, r17
ldi r17, $4f
sts cod3, r17
ldi r17, $66
sts cod4, r17
ldi r17, $6d
sts cod5, r17
ldi r17, $7d
sts cod6, r17
ldi r17, $07
sts cod7, r17
ldi r17, $7f
sts cod8, r17
ldi r17, $6f
sts cod9, r17
ldi r17, 5; задание уменьшаемого
ldi r18, 3; задание вычитаемого
m1: sbis pina, 4; если включен тумблер SA1, то пропустить
rjmp m2; следующую команду
mov r20, r17; в r20 поместить уменьшаемое
sub r20, r18; вычесть вычитаемое
rjmp vv
m2:
ldi r20, 0
vv:
push zl; сохранить zl в стеке
add zl, r20; сложить zl с результатом
ld r0, z; семисегментный код результата переслать в r20
pop zl; извлечь zl из стека
out portc, r0; выдать результат на индикацию
rjmp m1
; Программа №2. Использование оперативной памяти под переменные
.include " 8535def.inc" ; подключение файла описания AT90S8535
.dseg; сегмент данных
.org $64; адрес первого зарезервированного байта
cod0:.byte 1; резервирование по одному байту под переменные
cod1:.byte 1
cod2:.byte 1
cod3:.byte 1
cod4:.byte 1
cod5:.byte 1
cod6:.byte 1
cod7:.byte 1
cod8:.byte 1
cod9:.byte 1
.cseg; сегмент кодов
.org $0; адрес начала программы в программной памяти
rjmp reset; прерывание по сбросу при подаче питания
; или при нажатии на кнопку " Сброс"
reset:
ldi r16, $00; определение стека с вершиной по адресу $00ff
out sph, r16
ldi r16, $ff
out spl, r16
ldi zl, $64; задание адреса начала зарезервированных ячеек
ldi zh, $00
ldi r16, $ff; настроить порт С на выход
out ddrc, r16
ldi r16, 00; настроить порт А на вход
out ddra, r16
ldi r16, $c; настроить порт В: биты 2 и 3 на выход, остальные на вход
out ddrb, r16
ldi r16, $f0; настроить порт D: биты 0...4 на вход, остальные на выход
out ddrd, r16
sbi portb, 3; выдать 1 на разряд 3 порта В
ldi r17, $3f; задание семисегментных кодов
sts cod0, r17
ldi r17, $06
sts cod1, r17
ldi r17, $5b
sts cod2, r17
ldi r17, $4f
sts cod3, r17
ldi r17, $66
sts cod4, r17
ldi r17, $6d
sts cod5, r17
ldi r17, $7d
sts cod6, r17
ldi r17, $07
sts cod7, r17
ldi r17, $7f
sts cod8, r17
ldi r17, $6f
sts cod9, r17
ldi r17, 5; задание уменьшаемого
ldi r18, 3; задание вычитаемого
m1: sbis pina, 4; если включен тумблер SA1, то пропустить
rjmp m2; следующую команду
mov r20, r17; в r20 поместить уменьшаемое
sub r20, r18; вычесть вычитаемое
rjmp vv
m2:
ldi r20, 0
vv: push zl; сохранить zl в стеке
add zl, r20; сложить zl с результатом
ld r0, z; семисегментный код результата переслать в r20
pop zl; извлечь zl из стека
out portc, r0; выдать результат на индикацию
rjmp m1
; Программа №3. Использование директивы.dw
.include " 8535def.inc" ; подключение файла описания AT90S8535
.cseg
.org 0
rjmp reset
.dw $063f, $4f5b, $6d66, $077d, $6f7f, $7c77, $5e39, $7179; семисегментные коды
reset:
ldi r16, $00; определение стека с вершиной по адресу $00ff
out sph, r16
ldi r16, $ff
out spl, r16
ldi r16, $ff
out ddrc, r16; настроить порт С на выход
ldi r16, 00
out ddra, r16; настроить порт А на вход
ldi r16, $c
out ddrb, r16; настроить порт В: биты 2 и 3 на выход, остальные на вход
ldi r16, $f0
out ddrd, r16; настроить порт D: биты 0...4 на вход, остальные на выход
sbi portb, 3; выдать 1 на разряд 3 порта В
ldi zl, 02; установить адрес семисегментного кода нуля в регистр Z
ldi zh, 00
ldi r17, 5; задание уменьшаемого
ldi r18, 3; задание вычитаемого
m1: sbis pina, 4; если включен SA1, то пропустить следующую команду
rjmp m2
mov r20, r17; в r20 поместить уменьшаемое
sub r20, r18; вычесть вычитаемое
rjmp vv
m2:
ldi r20, 0; присвоить результату значение нуль
vv: push zl; сохранить zl в стеке
add zl, r20; сложить zl с результатом
lpm; загружаем бит, адресуемый регистром Z, в регистр R0
pop zl; извлечь zl из стека
out portc, r0; выдать результат на индикацию
rjmp m1
Ввод программы
Подготовленная программа вводится в ПЭВМ с рабочего места после включения комплекса в работу.
Включение комплекса, собранного по схеме рис.1, осуществляется включением составных частей ПЭВМ и нажатием кнопки включения на блоке питания комплекса БП. Номер рабочего места устанавливается переключателем внутри блока управления и должен совпадать с номером на блоке связи с ЭВМ.
Переключатель режима работы платы ЖКИ рабочего места необходимо поставить в положение “Программирование”. При нажатии на кнопку “Сброс” блока управления на ЖКИ появляется надпись “Место” с соответствующим номером. Этому номеру будет соответствовать окно на экране дисплея ПЭВМ.
Программное обеспечение располагается в каталоге STAND90, в котором есть два подкаталога SERVER и PK& MK. Программное обеспечение работает в среде WINDOWS. Программа SERVER запускается файлом server.bat, программа PK& MK – файлом Pk& mk.exe.
Сразу после запуска программы-сервера на экран выводится меню из трех пунктов: 1 – удалить старые файлы (например, оставшиеся после предыдущей работы), 2 – загрузить старые файлы (для продолжения работы с ними), 3 – любая другая клавиша (например, пробел или Esc) – не удалять и не загружать. После нажатия соответствующей клавиши на экране появляется восемь окон.
Пример содержимого экрана ПЭВМ во время работы программы представлен на рис. 1.6.
Каждое окно имеет надпись “Место” с номером рабочего места и область размером 4х16 знакомест, в которой отображается информация, выводимая на ЖКИ соответствующего рабочего места. Внизу экрана имеется строка, в которой описаны “горячие” клавиши – клавиши и сочетания клавиш, нажатия на которые вызывают определенные действия.
Последнее изменение этой страницы: 2016-03-22; Просмотров: 8485; Нарушение авторского права страницы