/*Какое прерывание позволяет работать с клавиатурой?*/
2. Программа (2.1), которая выводит в верхний левый угол экрана весёлую рожицу на синем фоне:
asm segment
org 100h
Start:
; mov ax, 3
; int 10h
mov ax, 0B800h
mov es, ax
mov di, 0
mov ah, 31
mov al, 1
mov es:[di], ax
int 20h
asm ends
end Start
В данной программе используется метод прямого отображения в видеобуфер. Что это?
В сегментный регистр es загружаем число 0B800h, которое соответствует сегменту дисплея в текстовом режиме, в регистр di – 0, что будет соответствовать смещению относительно сегмента 0B800h. В регистр ah заносится атрибут символа (31 – ярко-белый символ на синем фоне) и в al – ASCII-код символа (01 – это «рожица»). Квадратные скобки [] указывают на то, что надо загрузить число не в регистр, а по адресу, который содержится в этом регистре.
В ассемблере для организации циклов используется команда loop.
Программа (2.2), которая выводит сообщение «Hello!» 3 раза:
asm segment
org 100h
assume cs:asm, ds:asm, ss:asm, es:asm
Start:
mov ah, 9
mov dx, offset string
mov cx, 3
metka:
int 21h
loop metka
int 20h
string db ‘Hello!’, 0Ah, 0Dh, ‘$’
asm ends
end Start
1) Зачем нужна директива assume?
2) За что отвечает регистр cx? Сколько раз будет выполняться цикл, если cx = 0?
3) 0Ah, 0Dh – это ASCII-коды каких символов?
Условный переход – это передача управления по другому адресу или на указанную метку, если выполняется определенное условие (кроме команды loop, например, команды jnz, jc и др.).
Безусловный переход – это передача управления по другому адресу, на указанную метку в программе не зависимо от того, выполняется ли какое-либо условие или нет (команда jmp).
4) Как будет выглядеть команда loop, если вместо неё использовать оператор сравнения cmp и оператор условного перехода jne?
Задание 3. Усовершенствуйте программу №2.1 так, чтобы она выводила символ по всему экрану
/*Каково разрешение экрана для текста в DOS? -> в регистр cx*/
/*В видеобуфере один символ занимает 2 байта: сам символ и его атрибут -> увеличиваем di (смещение) в цикле на 2*/
3. Подпрограммы (процедуры) образуются директивой proc, которая имеет следующий формат:
имя процедуры proc
…
ret
имя процедуры endp
Они вызываются при помощи оператора call.
Программа (3.1), которая использует подпрограммы для вывода строки и ожидания нажатия клавиши:
asm segment
org 100h
assume cs:asm
_beg:
lea dx, mes1
call out_str
call wait_key
lea dx, mes2
call out_str
int 20h
out_str proc
mov ah, 9
int 21h
ret
out_str endp
wait_key proc
mov ah, 10h
int 16h
ret
wait_key endp
mes1 db ‘Press any key…’, 13, 10, ‘$’
mes2 db ‘You have successfully pressed the key$’
asm ends
end _beg
Команда «lea dx, message» - аналог команды «mov dx, offset message».
Запустите программу под отладчиком: проследите за работой подпрограмм и использованием стека.
Что делает процессор в момент вызова подпрограммы?
Задание 4. Усовершенствуйте программу из задания 3 так, чтобы она поочередно выводила все символы ASCII по всему экрану.
/*сколько всего символов содержит ASCII-таблица?*/
4. Программа (4.1), которая выводит содержание арифметических флагов в регистре флагов:
asm segment
org 100h
assume cs:asm
begin:
lea dx, mess1
mov ah, 9
int 21h
sub ax, ax
; sub ax, 1
pushf
pop bx
mov cx, 10h
m1:
rol bx, 1
mov al, bl
and al, 1
or al, 30h
mov dl, al
mov ah, 2
int 21h
mov dl, ‘ ‘
mov ah, 2
dec cx
cmp cx, 0
jne m1
; loop m1
int 20h
mess1 db 0Ah, 0Dh
db ‘O D I T S Z A P C’, 0Ah, 0Dh
db ‘F F F F F F * F * F * F’, 0Ah, 0Dh
db ‘__________________ ’
db 0Ah, 0Dh, ‘$’
asm ends
end begin
В программе содержимое регистра флагов командой pushf заносится в стек (что это?), после чего командой pop извлекается в регистр bx. Команда rol осуществляет циклический сдвиг влево на один разряд – содержимое выталкиваемого 15 бита помещается в 0 бит.
1) Как формируются ASCII-коды 1 или 0 с помощью команд and и or?
2) Как изменятся состояния флагов регистра флагов, если ввести в действие команду sub ax, 1, которая стоит после команды sub ax, ax?
3) Оформите часть программы, стоящей между меткой m1 и командой loop m1, в виде отдельной процедуры. Обращение к процедуре:
m1: call имя процедуры
loop m1
4) Чем отличается переход, осуществляемый командой jmp, от перехода по команде call?
Задание 5. Напишите программу, преобразующую строчные буквы латинского алфавита в прописные.
/*строчные буквы занимают диапазон: 61h-7Ah, а прописные – 41h-5Ah*/
/*что сделает команда and ah, 0DFh?*/
Задание 6. Напишите программу сравнения 2-х строк, которая выводит сообщение с информацией об их равенстве или неравенстве.
/*команда repe cmpsb выполняет «цепочечное» сравнение cx байт*/
5. Работа с массивами
Задание 7. Напишите программу поиска элемента в массиве (программа должна находить в заданном массиве выбранный элемент и выводить на экран информацию: есть он или нет, а если есть, то сколько раз встречается в массиве)
/*пример объявления массива: «array dw 1,2,3,5,7,7,3,1,2,9»
логически это будет выглядеть так:
array = {1 2}
{3 5}
{7 7}
{3 1}
{2 9} */
Задание 8. Напишите программу, которая находит нечетные числа в предложенном массиве чисел и выводит на экран информацию о количестве найденных нечетных чисел. Если их нет, то она должна сообщать об этом.