Программирование на языке Ассемблер
Основные этапы разработки программы на Ассемблере, содержание ее текста. Классификационные признаки системы команд, виды инструкций и способы адресации операндов. Проверка различных клавиш в буфере клавиатуры, порты ее контроллера и функции клавиш.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 12.08.2011 |
Размер файла | 47,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
14
18
КОНТРОЛЬНАЯ РАБОТА
ПО ДИСЦИПЛИНЕ «ПРОГРАММИРОВАНИЕ»
Содержание
Задание 1. Тест клавиатуры
Задание 2. Проверка различных клавиш в буфере клавиатуры
Список используемой литературы
Задание 1. Тест клавиатуры
ассемблер инструкция операнд клавиша
Язык программирования наиболее полно учитывающий особенности "родного" микропроцессора и содержащий мнемонические обозначения машинных команд называется Ассемблером. Программа, написанная на Ассемблере, называется исходной программой. Далее остановимся на версии, называемой Турбо Ассемблер.
Разработка программы на Ассемблере состоит из следующих этапов:
1) Составление алгоритма в виде блок-схемы или структурного описания,
2) Ввод в ЭВМ текста исходной программы PROG.ASM с помощью редактора текстов. Имя PROG может быть произвольным, а расширение ASM - обязательно,
3) Перевод (трансляция или ассемблирование) исходной программы в машинные коды с помощью транслятора TASM.EXE. На этом этапе получается промежуточный продукт PROG.OBJ (объектный код). Выявленные при этом синтаксические и орфографические ошибки исправляются повтором пп. 2 и 3,
4) Преобразование с помощью программы TLINK.EXE объектного кода PROG.OBJ в выполнимый код PROG.EXE или PROG.COM.
5) Выполнение программы и ее отладка начиная с п. 1, если встретились логические ошибки.
Текст программы на Ассемблере содержит следующие операции:
· а) команды или инструкции,
· б) директивы или псевдооператоры,
· в) операторы,
· г) предопределенные имена.
Действия обусловленные операциями перечисленными в пп. б, в, г выполняются на этапе трансляции, т.е. являются командами Ассемблеру. Операции, называемые командами или инструкциями выполняются во время выполнения программы, т.е. являются командами микропроцессору.
Инструкция записывается на отдельной строке и включает до четырех полей, необязательные из которых выделены:
[метка:] |
мнемоника_команды |
[операнд(ы)] |
[;комментарий] |
Метка или символический адрес содержит до 31 символа из букв цифр и знаков ? @. _ $. Причем цифра не должна стоять первой, а точка, если есть должна быть первой.
Мнемоника - сокращенное обозначение кода операции (КОП) команды, например мнемоника ADD обозначает сложение (addition).
Операндами могут быть явно или неявно задаваемые двоичные наборы, над которыми производятся операции. Операнды приводятся в одной из четырех систем счисления и должны оканчиваться символом b(B), o(O), d(D), h(H) для 2, 8, 10 или 16-ной СС. К шестнадцатиричному числу добавляется слева ноль, если оно начинается с буквы.
Система команд может быть классифицирована по трем основным признакам:
· длина команды или число занимаемых ею байтов,
· функциональное назначение и
· способ адресации.
Для МП 1810ВМ86 (8086) команда занимает от одного до шести байтов. Первым байтом команды всегда является код операции, например код команды INT XXh равен CD(HEX).
По функциональному признаку инструкции можно разбить на пять больших групп:
· 1) команды пересылки данных,
· 2) арифметические команды,
· 3) логические команды,
· 4) команды переходов и
· 5) команды управления.
Существует пять основных способов адресации:
· регистровая,
· непосредственная,
· прямая,
· косвенная и
· стековая.
Большинство остальных способов адресации являются комбинациями или видоизменениями перечисленных.
В первом случае операнд(ы) располагаются в регистрах микропроцессора (МП), например по команде MOV AX,CX пересылается содержимое CX в AX.
При непосредственной адресации операнд располагается в памяти непосредственно за КОП, инструкция MOV AL, 0f5h записывает число 245(f5) в регистр AL.
В случае прямой адресации за КОП следует не сам операнд, а адрес ячейки памяти или внешнего устройства, например команда IN AL, 40h вводит байт данных из внешнего устройства с адресом 40h.
Косвенная адресация отличается от регистровой тем, что в регистре хранится адрес операнда, т.е. по команде MOV AL, [BX] в аккумулятор al будет записано число из ячейки памяти с адресом, хранящимся в регистре BX.
Стековая адресация производится к операндам расположенным в области памяти, называемой стек.
model small
.stack 100h
.data
MaxLen db 5
Len db 0
buff db 5 dup (0)
minus db 0
mas db 7 dup (0)
sum db 0
min db 7Fh
ErrInpMsg db 'Error Input!!!',13,10,'$'
InpMsg db 'Input '
Count db 0,' element (-128..127) :',13,10,'$'
Otvet db 'Otevet: $'
.code
start:
mov ax,@data
mov ds,ax
mov es,ax
xor ax,ax
call input
call Do
call output
mov ah,8
int 21h
mov ax,4c00h
int 21h
input proc
xor di,di
mov cx,7
inputLoop:
call inputEl
inc di
loop inputLoop
ret
endp
inputEl proc
push cx
inputElMain:
mov mas[di],0
call InputMsg
mov ah,0Ah
mov dx,offset MaxLen
int 21h
mov dl,10
mov ah,2
int 21h
cmp Len,0
je errInputEl
mov minus,0
xor bx,bx
mov bl,Len
mov si,offset Len
add si,bx
mov bl,1
xor cx,cx
mov cl,Len
inputElLoop:
std
lodsb
call checkSym
cmp ah,1
je errInputEl
cmp ah,2
je nextSym
sub al,'0'
mul bl
test ah,ah
jnz errInputEl
add mas[di],al
jo errInputEl
js errInputEl
mov al,bl
mov bl,10
mul bl
test ah,ah
jz ElNextCheck
cmp ah,3
jne errInputEl
ElNextCheck:
mov bl,al
jmp nextSym
errInputEl:
call ErrorInput
jmp inputElMain
nextSym:
loop inputElLoop
cmp minus,0
je exitInputEl
neg mas[di]
exitInputEl:
pop cx
ret
endp
checkSym proc
cmp al,'-'
je minusSym
cmp al,'9'
ja errCheckSym
cmp al,'0'
jb errCheckSym
jmp exitCheckGood
minusSym:
cmp si,offset Len
je exitWithMinus
errCheckSym:
mov ah,1
jmp exitCheckSym
exitWithMinus:
mov ah,2
mov minus,1
cmp Len,1
je errCheckSym
jmp exitCheckSym
exitCheckGood:
xor ah,ah
exitCheckSym:
ret
endp
ErrorInput proc
mov dx,offset ErrInpMsg
mov ah,9
int 21h
ret
endp
InputMsg proc
mov ax,di
add al,'0'
mov Count,al
mov ah,9
mov dx,offset InpMsg
int 21h
ret
endp
DoEl proc
mov ah,min
cmp mas[di],ah
jnl notNewMin
mov ah,mas[di]
mov min,ah
notNewMin:
cmp mas[di],-5
jl notSum
cmp mas[di],15
jg notSum
mov ah,mas[di]
add sum,ah
notSum:
ret
endp
Do proc
xor di,di
mov cx,7
DoLoop:
call DoEl
inc di
loop DoLoop
ret
endp
output proc
mov di,offset Otvet+11
mov minus,0
mov bl,10
mov al,sum
imul min
test ax,ax
jns notMinusOut
mov minus,1
neg ax
notMinusOut:
div bl
xchg ah,al
add al,'0'
std
stosb
sub al,'0'
xchg ah,al
xor ah,ah
test al,al
jz CheckForMinus
jmp notMinusOut
CheckForMinus:
cmp minus,0
je endOutput
mov al,'-'
std
stosb
endOutput:
mov ah,9
mov dx,offset Otvet
int 21h
ret
endp
end start
Задание 2. Проверка различных клавиш в буфере клавиатуры
Контроллеру клавиатуры соответствуют порты с номерами от 60h до 6Fh, хотя для всех стандартных операций достаточно портов 60h и 61h.
64h для чтения: регистр состояния клавиатуры, возвращает следующий байт:
бит 7: ошибка четности при передаче данных с клавиатуры
бит 6: тайм-аут при приеме
бит 5: тайм-аут при передаче
бит 4: клавиатура закрыта ключом
бит 3: данные, записанные в регистр ввода, - команда
бит 2: самотестирование закончено
бит 1: в буфере ввода есть данные (для контроллера клавиатуры)
бит 0: в буфере вывода есть данные (для компьютера)
При записи в этот порт он играет роль дополнительного регистра управления клавиатурой, но его команды сильно различаются для разных плат и разных BIOS, и мы не будем его подробно рассматривать.
61h для чтения и записи - регистр управления клавиатурой. Если в старший бит этого порта записать значение 1, клавиатура будет заблокирована, если 0 - разблокирована. Другие биты этого порта менять нельзя, так как они управляют другими устройствами (в частности динамиком). Чтобы изменить состояние клавиатуры, надо считать байт из порта, изменить бит 7 и снова записать в порт 61h этот байт.
60h для чтения - порт данных клавиатуры. При чтении из него можно получить скан-код последней нажатой клавиши (см. приложение 1) - именно так лучше всего реализовывать резидентные программы, перехватывающие прерывание IRQ1, так как по этому коду можно определять момент нажатия и отпускания любой клавиши, включая такие клавиши, как Shift/Ctrl/Alt или даже Pause (скан-код отпускания клавиши равен скан-коду нажатия плюс 80h):
int09h_handler:
in al,60h ; прочитать скан-код клавиши,
cmp al,hot_key ; если это наша "горячая"
; клавиша,
jne not_our_key ; перейти к нашему
; обработчику
[...] ; наши действия здесь
not_our_key:
jmp old_int09h ; вызов старого обработчика
Мы пока не можем завершить обработчик просто командой IRET, потому что, во-первых, обработчик аппаратного прерывания клавиатуры должен установить бит 7 порта 61h, а затем вернуть его в исходное состояние, например так:
in al,61h
push ax
or al,80h
out 61h,al
pop ax
out 61h,al
А во-вторых, он должен сообщить контроллеру прерываний, что обработка аппаратного прерывания закончилась командами
mov al,20h
out 20h,al
60h для записи - регистр управления клавиатурой. Байт, записанный в этот порт (если бит 1 в порту 64h равен 0), интерпретируется как команда. Некоторые команды состоят из более чем одного байта - тогда следует дождаться обнуления зтого бита еще раз перед тем, как посылать следующий байт. Перечислим наиболее стандартные команды.
Команда EDh 0?h - изменить состояние светодиодов клавиатуры. Второй байт этой команды определяет новое состояние:
бит 0 - состояние Scroll Lock (1 - включена, 0 - выключена)
бит 1 - состояние Num Lock
бит 2 - состояние Caps Lock
При этом состояние переключателей, которое хранит BIOS в байтах состояния клавиатуры, не изменяется, и при первой возможности обработчик прерывания клавиатуры BIOS восстановит состояние светодиодов.
Команда EEh - эхо-запрос. Клавиатура отвечает скан-кодом EEh.
Команда F3h ??h - Установить параметры режима автоповтора:
бит 7 второго байта команды - 0
биты 6 - 5 устанавливают паузу перед началом автоповтора:
00 = 250ms, 01 = 500ms, 10 = 750ms, 11 = 1000ms
биты 4 - 0 устанавливают скорость автоповтора (символов в секунду):
00000 = 30,0 01111 = 8,0
00010 = 24,0 10010 = 6,0
00100 = 20,0 10100 = 5,0
00111 = 16,0 10111 = 4,0
01000 = 15,0 11010 = 3,0
01010 = 12,0 11111 = 2,0
01100 = 10,0
Все промежуточные значения также имеют смысл и соответствуют промежуточным скоростям, например 00001 = 26,7.
Команда F4h - включить клавиатуру.
Команда F5h - выключить клавиатуру.
Команда F6h - установить параметры по умолчанию.
Команда FEh - послать последний скан-код еще раз.
Команда FFh - выполнить самотестирование.
Клавиатура отвечает на все команды, кроме EEh и FEh, скан-кодом FAh (подтверждение), который поглощается стандартным обработчиком BIOS, так что, если мы не замещаем полностью стандартный обработчик, о его обработке можно не беспокоиться.
Как и в случае вывода на экран, DOS предоставляет набор функций для чтения данных с клавиатуры, которые используют стандартное устройство ввода STDIN, так что можно использовать в качестве источника данных файл или стандартный вывод другой программы.
Функция DOS 0Ah - Считать строку символов из STDIN в буфер
Ввод: |
АН = 0Ah DS:DX = адрес буфера |
|
Вывод: |
Буфер содержит введенную строку |
Для вызова этой функции надо подготовить буфер, первый байт которого содержит максимальное число символов для ввода (1 - 254), а содержимое, если оно задано, может использоваться как подсказка для ввода. При наборе строки обрабатываются клавиши Esc, F3, F5, BS, Ctrl-C/Ctrl-Break и т.д., как при наборе команд DOS (то есть Esc начинает ввод сначала, F3 восстанавливает подсказку для ввода, F5 запоминает текущую строку как подсказку, Backspace стирает предыдущий символ). После нажатия клавиши Enter строка (включая последний символ CR (0Dh)) записывается в буфер, начиная с третьего байта. Во второй байт записывается длина реально введенной строки без учета последнего CR.
Рассмотрим пример программы, выполняющей преобразование десятичного числа в шестнадцатеричное.
; dosinl.asm
; Переводит десятичное число в шестнадцатеричное
;.model tiny
.code
.286 ; для команды shr al,4
org 100h ; начало СОМ-файла
start:
mov dx,offset message1
mov ah,9
int 21h ; вывести приглашение ко вводу message1
mov dx,offset buffer
mov ah,0Ah
int 21h ; считать строку символов в буфер
mov dx,offset crlf
mov ah,9
int 21h ; перевод строки
; перевод числа в ASCII-формате из буфера в бинарное число в АХ
xor di,di ; DI = 0 - номер байта в буфере
xor ах,ах ; АХ = 0 - текущее значение результата
mov cl,blength
xor ch,ch
xor bx,bx
mov si,cx ; SI - длина буфера
mov cl,10 ; CL = 10, множитель для MUL
asc2hex:
mov bl,byte ptr bcontents[di]
sub bl,'0' ; цифра = код цифры - код символа "0",
jb asc_error ; если код символа был меньше, чем код "0",
cmp bl,9 ; или больше, чем "9",
ja asc_error ; выйти из программы с сообщением об ошибке,
mul cx ; иначе: умножить текущий результат на 10,
add ax,bx ; добавить к нему новую цифру,
inc di ; увеличить счетчик
cmp di,si ; если счетчик+1 меньше числа символов -
jb asc2hex ; продолжить (счетчик считается от 0)
; вывод на экран строки message2
push ax ; сохранить результат преобразования
mov ah,9
mov dx,offset message2
int 21h
pop ax
; вывод на экран числа из регистра АХ
push ax
xchg ah,al ; поместить в AL старший байт
call print_al ; вывести его на экран
pop ax ; восстановить в AL младший байт
call print_al ; вывести его на экран
ret ; завершение СОМ-файла
asc_error:
mov dx,offset err_msg
mov ah,9
int 21h ; вывести сообщение об ошибке
ret ; и завершить программу
; Процедура print_al
; выводит на экран число в регистре AL
; в шестнадцатеричном формате,
; модифицирует значения регистров АХ и DX
print_al:
mov dh,al
and dh,0Fh ; DH - младшие 4 бита
shr al,4 ; AL - старшие
call print_nibble ; вывести старшую цифру
mov al,dh ; теперь AL содержит младшие 4 бита
print_nibble: ; процедура вывода 4 бит (шестнадцатеричной цифры)
cmp al,10 ; три команды, переводящие цифру в AL
sbb al,69h ; в соответствующий ASCII-код
das ; (см. описание команды DAS)
mov dl,al ; код символа в DL
mov ah,2 ; номер функции DOS в АН
int 21h ; вывод символа
ret ; этот RET работает два раза - один раз
; для возврата из процедуры print_nibble,
; вызванной для старшей цифры,
; и второй раз - для возврата из print_al
messagel db "Десятичное число: $"
message2 db "Шестнадцатеричное число: $"
err_msg db "Ошибка ввода"
crlf db 0Dh,0Ah,'$'
buffer db 6 ; максимальный размер буфера ввода
blength db ? ; размер буфера после считывания
bcontents: ; содержимое буфера располагается за
; концом СОМ-файла
end start
Функция 0Ah предоставляет удобный, но ограниченный способ ввода данных. Чаще всего используют функции посимвольного ввода, позволяющие контролировать отображение символов на экране, реакцию программы на функциональные и управляющие клавиши и т.д.
Функция DOS 01h - Считать символ из STDIN с эхом, ожиданием и проверкой на Ctrl-Break
Ввод: |
АН = 01h |
|
Вывод: |
AL = ASCII-код символа или 0. Если AL = 0, второй вызов этой функции возвратит в AL расширенный ASCII-код символа |
При чтении с помощью этой функции введенный символ автоматически немедленно отображается на экране (посылается в устройство STDOUT - так что его можно перенаправить в файл). При нажатии Ctrl-C или Ctrl-Break выполняется команда INT 23h. Если нажата клавиша, не соответствующая какому-нибудь символу (стрелки, функциональные клавиши Ins, Del и т.д.), то в AL возвращается 0 и функцию надо вызвать еще один раз, чтобы получить расширенный ASCII-код.
В трех следующих вариантах этой функции код символа возвращается в AL по такому же принципу.
Функция DOS 08h - Считать символ из STDIN без эха, с ожиданием и проверкой на Ctrl-Break
Ввод: |
АН = 08h |
|
Вывод: |
AL = код символа |
Функция DOS 07h - Считать символ из STDIN без эха, с ожиданием и без проверки на Ctrl-Break
Ввод: |
АН = 07h |
|
Вывод: |
AL = код символа |
Функция DOS 06h - Считать символ из STDIN без эха, без ожидания и без проверки на Ctrl-Break
Ввод: |
АН = 07h DL = 0FFh |
|
Вывод: |
ZF = 1, если не была нажата клавиша, и AL = 00 ZF = 0, если клавиша была нажата. В этом случае AL = код символа |
Кроме перечисленных функций могут потребоваться и некоторые служебные функции DOS для работы с клавиатурой.
Функция DOS 0Bh - Проверить состояние клавиатуры
Ввод: |
АН = 0Bh |
|
Вывод: |
AL = 0, если не была нажата клавиша AL = 0FFh, если была нажата клавиша |
Эту функцию удобно использовать перед функциями 01, 07 и 08, чтобы не ждать нажатия клавиши. Кроме того, вызов этой функции позволяет проверить, не считывая символ с клавиатуры, была ли нажата комбинация клавиш Ctrl-Break; если это произошло, выполнится прерывание 23h.
Функция DOS 0Ch - Очистить буфер и считать символ
Ввод: |
АН = 0Ch AL = Номер функции DOS (01, 06, 07, 08, 0Ah) |
|
Вывод: |
Зависит от вызванной функции |
Функция 0Ch очищает буфер клавиатуры, так что следующая функция чтения символа будет ждать ввода с клавиатуры, а не использовать нажатый ранее и еще не обработанный символ. Например, именно эта функция используется для считывания ответа на вопрос «Уверен ли пользователь в том, что он хочет отформатировать диск?».
Функции посимвольного ввода без эха можно использовать для интерактивного управления программой, как в следующем примере.
; dosin2.asm
; Изображает пентамино F, которое можно перемещать по экрану клавишами
; управления курсором и вращать клавишами X и Z. Выход из программы - Esc.
;
line_length = 3 ; число символов в строке изображения
number_of_lines = 3 ; число строк
.model tiny
.code
org 100h ; начало СОМ-файла
start:
cld ; будут использоваться команды
; строковой обработки
mov ax,0B800h ; адрес начала текстовой видеопамяти
mov es,ax ; в ES
mov ax,0003h
int 10h ; текстовый режим 03 (80x25)
mov ah,02h ; установить курсор
mov bh,0
mov dh,26 ; на строку 26, то есть за пределы экрана
mov dl,1
int 10h ; теперь курсора на экране нет
call update_screen ; вывести изображение
; основной цикл опроса клавиатуры
main_loop:
mov ah,08h ; считать символ с клавиатуры
int 21h ; без эха, с ожиданием, с проверкой на Ctrl-Break
test al,al ; если AL = 0
jz eASCII_entered ; введен символ расширенного ASCII
cmp al,1Bh ; иначе: если введен символ 1Bh (Esc),
je key_ESC ; выйти из программы,
cmp al,'Z' ; если введен символ Z,
je key_Z ; перейти на его обработчик
cmp al,'z' ; то же для z
je key_Z
cmp al,'X' ; если введен символ X,
je key_X ; перейти на его обработчик
cmp al,'х' ; то же для х
je key_X
jmp short main_loop ; считать следующую клавишу
eASCII_entered: ; был введен расширенный ASCII-символ
int 21h ; получить его код (повторный вызов функции)
cmp al,48h ; стрелка вверх
je key_UP
cmp al,50h ; стрелка вниз
je key_DOWN
cmp al,4Bh ; стрелка влево
je key_LEFT
cmp al,4Dh ; стрелка вправо
je key_RIGHT
jmp short main_loop ; считать следующую клавишу
;
; обработчики нажатий клавиш
;
key_ESC: ; Esc
ret ; завершить СОМ-программу
key_UP: ; стрелка вверх
cmp byte ptr start_row,0 ; если изображение на верхнем
; краю экрана,
jna main_loop ; считать следующую клавишу,
dec byte ptr start_row ; иначе - уменьшить номер строки,
call update_screen ; вывести новое изображение
jmp short main_loop ; и считать следующую клавишу
key_DOWN: ; стрелка вниз
cmp byte ptr start_row,25-number_of_lines ; если
; изображение на нижнем краю экрана,
jnb main_loop ; считать следующую клавишу,
inc byte ptr start_row ; иначе - увеличить номер строки,
call update_screen ; вывести новое изображение
jmp short main_loop ; и считать следующую клавишу
key_LEFT: ; стрелка влево
cmp byte ptr start_col,0 ; если изображение на левом краю
; экрана,
jna main_loop ; считать следующую клавишу,
dec byte ptr start_col ; иначе - уменьшить номер столбца,
call update_screen ; вывести новое изображение
jmp short main_loop ; и считать следующую клавишу
key_RIGHT: ; стрелка вправо
cmp byte ptr start_col,80-line_length ; если
; изображение на правом краю экрана,
jnb main_loop ; считать следующую клавишу,
inc byte ptr start_col ; иначе - увеличить номер столбца,
call update_screen ; вывести новое изображение
jmp short main_loop ; и считать следующую клавишу
key_Z: ; клавиша Z (вращение влево)
mov ax,current_screen ; считать номер текущего изображения
; (значения 0, 1, 2, 3),
dec ax ; уменьшить его на 1,
jns key_Z_ok ; если получился -1 (поменялся знак),
mov ах,3 ; АХ = 3
key_Z_ok:
mov current_screen,ax ; записать номер обратно,
call update_screen ; вывести новое изображение
jmp main_loop ; и считать следующую клавишу
key_X: ; клавиша X (вращение вправо)
mov ax,current_screen ; считать номер текущего изображения
; (значения 0, 1, 2, 3),
inc ax ; увеличить его на 1,
cmp ax,4 ; если номер стал равен 4,
jne key_X_ok
xor ах,ах ; АХ = 0
key_X_ok:
mov current_screen,ax ; записать номер обратно,
call update_screen ; вывести новое изображение
jmp main_loop ; и считать следующую клавишу
; процедура update_screen
; очищает экран и выводит текущее изображение
; модифицирует значения регистров АХ, ВХ, СХ, DX, SI, DI
update_screen:
mov cx,25*80 ; число символов на экране
mov ax,0F20h; ; символ 20h (пробел) с атрибутом 0Fh
; (белый на черном)
xor di,di ; ES:DI = начало видеопамяти
rep stosw ; очистить экран
mov bx,current_screen ; номер текущего изображения в ВХ
shl bx,1 ; умножить на 2, так как screens - массив слов
mov si,screens[bx] ; поместить в ВХ смещение начала
; текущего изображения из массива screens,
mov ax,start_row ; вычислить адрес начала
mul row_length ; изображения в видеопамяти
add ax,start_col ; (строка * 80 + столбец) * 2
shl ax,1
mov di,ax ; ES:DI - начало изображения в видеопамяти
mov ah,0Fh ; используемый атрибут - белый на черном
mov dx,number_of_lines ; число строк в изображении
сору_lines:
mov cx,line_length ; число символов в строке
copy_1: lodsb ; считать ASCII-код в AL,
stosw ; записать его в видеопамять
; (AL - ASCII, АН - атрибут),
loop copy_1 ; вывести так все символы в строке,
add di,(80-line_length)*2 ; перевести DI на начало
; следующей строки экрана,
dec dx ; если строки не закончились -
jnz copy_lines ; вывести следующую
ret ; конец процедуры update_screen
; изображение пентамино F
screen1 db " XX" ; выводимое изображение
db "XX "
db " X "
screen2 db " X " ; поворот на 90 градусов вправо
db "XXX"
db " X"
screen3 db " X " ; поворот на 180 градусов
db " XX"
db "XX "
screen4 db "X " ; поворот на 90 градусов влево
db "XXX"
db " X "
; массив, содержащий адреса всех вариантов изображения
screens dw screen1,screen2,screen3,screen4
current_screen dw 0 ; текущий вариант изображения
start_row dw 10 ; текущая верхняя строка изображения
start_col dw 37 ; текущий левый столбец
row_length db 80 ; длина строки экрана для команды MUL
end start
Список используемой литературы
Абель П. Язык Ассемблера для IBM PC и его программирование - М.: Высшая школа, 1992. - 252 с.
С.В. Зубков Ассемблер для DOS, Windows и Unix - М.: ДМК Пресс, 1999. - 630 с.
И. Юров Assembler - СПб.: Питер, 2001. - 624 с.
Бэрри Н. Компьютерные сети. Пер. с англ. - М.: БИНОМ. - 1995. - 400с.
Джамса К., Лалани С., Уикли С. Программирование в WWW для профессионалов. - Минск. - Попурри. - 1997. - 631 с.
Кент П. World Wide Web: Пер. с англ.. - М.: Компьютер. - 1996. - 311 с.
Кулаков Ю.А. Компьютерные сети. - Киев. - 1998. - 384 с.
Компьютерные сети. Принципы, технологии, протоколы / В.Г. Олифер, Н.А. Олифер. - СПб: Питер, 2001. - 672 с.
Максимов Н.В., Партыка Т.Л., Попов И.И. Технические средства информатизации: Учебник. - М.: ФОРУМ: ИНФРА-М, 2005. - 576 с.: ил. - (Профессиональное образование).
Милославская Н.Г., Толстой А.И. Интрасети: доступ в Internet. Защита: Учеб. пособие для вузов. - М.: ЮНИТИ-ДАНА, 2000 - 527 с.
Колесников. Internet: для пользователя. - К.: Издательская группа BHV, 2000. - 304 с.
Новомлинский Л. Интернет-торговля. Часть 1// Сети и системы связи. - 1998 - №8.
Новомлинский Л. Интернет-торговля. Часть 2 // Сети и системы связи. - 1998 - №9.
Пятибратов А.П. Вычислительные машины, сети и телекоммуникации/ Пятибратов А.П., Гудыно Л.П. - М.: Финансы и статистика. - 1998. - 400 с.
Сеть Internet. Применение в науке и бизнесе / Горностаев Ю.М. и др. - М.: Россия - 1994. - 136 с.
Сеть Internet./ Горностаев Ю.М. и др. - М.: Россия. - 1993. - 88 с.
Сорокин Л. Аукционы в Интернете - будущее электронной коммерции // Мир электронной коммерции. - 2000. - №1.
Информатика: Учебник. - 3-е перераб. изд. / Под ред. проф. Н.В. Макаровой. - М.: Финансы и статистика, 2000. - 768 с.: ил.
Размещено на Allbest.ru
Подобные документы
Ассемблер как символический аналог машинного языка. Архитектура микропроцессора: организация памяти, способы адресации операндов, правила использования регистров. Текст программы. Этапы программирования на ассемблере, алгоритмы выполнения задач.
контрольная работа [515,1 K], добавлен 20.01.2016Изучение архитектуры персонального компьютера на примере микропроцессора фирмы Intel. Регистры общего назначения. Оперативная память; форматы данных и команд. Команд пересылки с различными способами адресации операндов. Структура программы на Ассемблере.
курс лекций [506,4 K], добавлен 03.05.2014Организация центрального процессора. Подключение интерфейсных программируемых БИС. Методы адресации и примеры команд. Программирование таймера и контроллера прерываний. Программная модель микропроцессорной системы. Программирование на языке ассемблера.
реферат [82,6 K], добавлен 05.12.2010Разработка и практическая апробация действия драйвер-фильтра клавиатуры для операционной системы Windows, переопределяющего значение любых клавиш и отключающего клавиши клавиатуры. Составление программы для установки и управления данным драйвером.
курсовая работа [226,8 K], добавлен 18.06.2009Расположение клавиш на клавиатуре. "Горячие клавиши" общего назначения. Использование цифровой клавиатуры для быстрого ввода чисел. Организация клавиш набора, функциональных, перемещения и управления. Характеристика основных символов клавиатуры.
презентация [670,4 K], добавлен 10.08.2015Назначение и история разработки клавиатуры, ее технические характеристики и классификация. Особенности расположения клавиш, их группировка и сочетание. Основные режимы работы изучаемого периферического устройства, порядок его настройки и подключения.
курсовая работа [1,9 M], добавлен 22.05.2013Выбор режимов адресации, посредством которых будет осуществлен доступ к данным. Этапы создания программы. Характеристика таблицы символов и полученного файла листинга. Анализ изменения состояния регистра IP при выполнении команд JMP, Jcc, LOOPx.
курсовая работа [4,9 M], добавлен 25.03.2012Клавиатура как современный основной элемент компьютера, ее назначение. Функции некоторых клавиш в большинстве программ. Шрифты в контексте ввода текста с клавиатуры и отображения символов. Основные виды, параметры клавиатур и принцип их действия.
реферат [101,8 K], добавлен 20.02.2009Назначение, особенности, структура и функционирование различных моделей микроконтроллеров. Средства их отладки и программирования. Способы адресации и система команд. Набор периферийных устройств. Порты ввода/вывода. Модуль формирования ШИМ-сигналов.
курсовая работа [201,9 K], добавлен 25.12.2014Анализ технического задания. Разработка программы по вычислению функции на языке ассемблер для микропроцессора Кр580ВМ80. Алгоритмы программного умножения, деления, сложения, вычитания и сдвига влево многобайтных чисел. Расчет времени работы программы.
курсовая работа [88,2 K], добавлен 19.09.2012