Задание 2. Усовершенствуйте программу из задания 1, чтобы перед выходом в DOS заставить программу ждать нажатия пользователем любой клавиши.




/*Какое прерывание позволяет работать с клавиатурой?*/

 

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. Напишите программу, которая находит нечетные числа в предложенном массиве чисел и выводит на экран информацию о количестве найденных нечетных чисел. Если их нет, то она должна сообщать об этом.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-10-21 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: