Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по ассемблеру.doc
Скачиваний:
65
Добавлен:
15.09.2014
Размер:
220.67 Кб
Скачать

;25) Дан массив строк. Найти строку наибольшей длины, вывести на экран

.model small

.stack 100h

.data

strings db "123", '$'

db "1234", '$'

db "12345", '$'

db "123456", '$'

db "1234567", '$'

db "123456", '$'

db "12345", '$'

db "1234", '$'

db "123", '$'

count dw ?

.code

main:

mov ax, @data

mov ds, ax

mov cx, 9

mov di, 0

mov si, 0

mov dx, 0

seek:

mov bx, si

go:

xor ax, ax

mov al, strings+si

inc si

cmp al, '$'

jne go

mov ax, si

sub ax, bx

cmp ax, dx

jl nextstr

mov dx, ax

mov di, bx

nextstr:

loop seek

mov dx, di

mov ah, 09h

int 21h

mov ah, 4ch

int 21h

end main

;28) Вывести все ASCII символы по 16 в строке

.MODEL small

.STACK 100h

.DATA

refresh db 0Dh, 0Ah, '$'

.CODE

main:

mov ax, @data

mov ds, ax

xor dx, dx

mov cx, 16

printSTR:

push cx

mov cx, 16

printSIM:

inc dl

mov ah, 02h

int 21h

loop printSIM

pop cx

push dx

mov dx, offset refresh

mov ah, 09h

int 21h

pop dx

loop printSTR

mov ah, 4ch

int 21h

end main

end

;31) Прочитать состояние буфера клавиатуры, если он не пуст, то ввести в программный буфер текст. Вывести текст на экран, как в файл. Вывести первый символ текста.

.MODEL small

.STACK 100h

.DATA

sum dw ?

buf db 20 dup(?)

msg db 10, 13, '$', 10, 13

.CODE

main:

mov ax, @data

mov ds, ax

enter_text:

mov ah, 01h

int 16h

jz enter_text ;z=1 - буфер пуст

mov ah, 3fh ;читать, как из файла

mov bx, 0 ;дескриптор буфера клавы

mov cx, 15 ;число читаемых байт

lea dx, buf ;буфер для чтения данных

int 21h ;на выходе в ax - число реально прочитанных байт

mov sum, ax

mov ah, 40h ;запись в файл

mov bx, 1 ;дескриптор stdout

mov cx, sum ;число записываемых байт

lea dx, buf ;адрес буфера, содержащего записываемые данные

int 21h

;вывод первого символа текста

mov ah, 40h

mov bx, 1

mov cx, 1

lea dx, buf

int 21h

;

mov ah, 4ch

int 21h

end main

end

26)вывод информации на экран. Видеорежимы.

Вывод на экран

В текстовом режиме:

1. Функция DOS int 21h

2. Функция BIOS int 10h

3. Прямой доступ к видео памяти

Всё что выводится на монитор находится в памяти. Для того что бы вывести данные на монитор они должны быть занесены в память В000:0000h -//- B800:FFFFh всё что находится в этой памяти немедленно пересылается на экран. Для отображения каждого символа используется 2 байта инфы. Младший байт хранит код символа, старший атрибуты. мет RGB мет RGB начало фон конец цвет символа.

Графический режим

Прерывание 10h также позволяет переключать графические режимы

Номера режимов:

11h 640x480 2 цветов

12h 640x480 16 цветов

13h 320x200 256 цветов

;Работа с окнами в текстовом режиме. (результат работы проги: синее окно,

;в нем - зеленое окно, в зеленом окне - текст :))

.MODEL small

.STACK 100h

.DATA

str_ db 'TEXT'

len equ $-str_

.CODE

main:

mov ax, @data

mov ds, ax

mov es, ax

mov ah, 06h ;очистка окна

mov al, 00h ;режим окна

mov bh, 17h ;видео-атрибут для пустых строк

mov cx, 0000h ;очистка экрана от (00;00) до (24;79)

mov dx, 1b4fh

int 10h

mov ax, 0600h ;в ah - 06h в al - 00h

mov bh, 20h

mov cx, 0a1ch

mov dx, 0c31h

int 10h

mov ah, 13h ;вывод на экран в позиции курсора

mov al, 0 ;не менять положение курсора

mov bh, 0 ;номер страницы

mov bl, 07h ;цвет выводимого текста

mov cx, len

mov dx, 0b25h ;координаты на экране (dh - y, dl - x)

lea bp, str_ ;адрес выводимой строки

int 10h

mov ah, 4ch

int 21h

end main

32);В сегменте данных определены числа в формате двойного слова. С клавы вводится

;число, и программа определяет, имеется ли данное число в сегменте данных.

.MODEL small

.STACK 100h

.DATA

num1 dd 1

num2 dd 12

num3 dd 123

num4 dd 1234

mum5 dd 123456789

num6 dd 12345

buf dw 0

my_num dd 0

ten dd 10

msg db 10,13, "Found!", 10, 13, "$"

.CODE

.386

main: mov ax, @data

mov ds, ax

mov es, ax

mov di, 0

cld

input_num:

mov ah, 01h

int 21h

cmp al, 0dh

je end_input

mov ah, 0

sub al, 30h

mov buf, ax

fild my_num ;поместить my_num на вершину стека сопроцессора( ST(0) )

fimul ten ;умножить ST(0) на ten

fiadd buf ;сложить ST(0) и buf

fistp my_num ;записать ST(0) в my_num

jmp input_num

end_input:

mov eax, my_num

mov cx, 6 ;количество чисел в сегменте кода

find_num:

scasd ;сравнить es:di с еах

jne continue

lea dx, msg

mov ah, 09h

int 21h

continue: loop find_num

mov ah, 4ch

int 21h

end main

27) Прерывания DOS, BIOS.

Прерывания делятся: 1) Аппаратные: - маскируемые; - немаскируемые; 2) Программные: - прерывания BIOS; - прерывания DOS; пользовательские; 3) Исключительные ситуации: - ошибки; - ловушки; - аварийное завершение. Первые 20 прерываний с номерами от 00h до 1Fh – BIOS прерывания. Прерывания с номерами 20h b старше – DOS прерывания (прерывание 21h играет особую роль, т.к. представляет собой целую коллекцию функций). Основные BIOS прерывания: 08h – таймер; 09h – работа с клавой(выполняется при каждом нажатии и отпускании клаваиш); 16h – в/в клавиатуры(Ф-ции: 00h – читать сл. Нажатую клав. Выход al – ASCII символ ah – сканкод; 01h – проверить готовность символа(и показать его если так) Выход – zf=1-если символ не готов 0 – если готов; 02h – состояние shift-клавиши); 10h – видео сенрвис(00h – уст. Видеорежим; 02h – уст. Позицию; 08h и 09h – читать/писать символ/атрибут).Основные DOS функции прерывания 21h: 3ch,3dh,3eh – создать/открыть/закрыть файл; 09h – вывод строки; 0Ah — Считать строку символов;Функция DOS 08h — Считать символ из STDIN без эха, с ожиданием и проверкой на Ctrl-Break;Функция DOS 0Ch — Очистить буфер и считать символ;Функция DOS 02h — Записать символ в STDOUT с проверкой на Ctrl-Break

30) Ввод информации с клавиатуры.

Ввод данных с клавиатуры может быть осуществлен несколькими способами: - работа с Клавой напрямую; - при помощи DOS функций; -при помощи BIOS функций. Доступ к клаве через порт: 61h – порт для работы с Клавой. Если 7-ой бит == 0, то контроллер клавы недоступен. Порт 60h предназначен для чтения данных с клавы и сохранен для совместимости с клавиатурой PC XT. Порт 64h – можно прочитать с клавиатуры коды клавиш и их статус, программировать и осуществлять настройку клавиатуры. in al,60h – считать скан-код; in al,61h – читаем байт сост. клавы. Ввод используя функции BIOS: при помощи прерывания 16h. Функции 00h (аналоги – 10h, 20h) – чтение кода нажатой клавиши с ожиданием(в al – ASCII код; в ah – скан код); 01h(11h,21h) – проверяет наличие символа в буфере клавиатуры(в al – ASCII код; в ah – скан код); 05h — Поместить символ в буфер клавиатуры, имитируя нажатие клавиши, в ch - записать скан-код, cl - ASCII-код. 02h(12h, 22h) — считать состояние клавиатуры. 04h – для включения и выключения звукового сигнала клавиатуры.(в al – 0 выключение, 1 включение). Ввод используя функции DOS: через вектор 21h: 01h – считывает символ с эхом, код возвр. в al. 06h – читает символ без ожидания и без эха. 07h – ожидает чтение символа без эха без проверки на Ctrl-Break. 08h - считать символ без эха, с ожиданием и проверкой на Ctrl-Break. 0Ah – считывает строку символов с обработкой нажатия Ctrl-Break. 0Bh - Проверить состояние клавиатуры(AL = 0, если не была нажата клавиша;AL = 0FFh, если была нажата клавиша). 0Сh - Очистить буфер и считать символ. 3Fh – обращение к клавиатуре как к файлу.

33) Мультимодульные программы

Рассмотрим пути создания программ из нескольких модулей.

Каждый компилируется по отдельности, затем компоновщик объединит в одну программу.

3 директивы:

  • public

  • extrn

  • global

public [язык] метка [, [язык] метка…]

Определяет метки программы, которые будут доступны в других программах.

.data

public my_equ, my_var

my_equ equ 25

my_var dd 12345678h

.code

public my_proc

my_proc proc

extrn определение [, определение…]

определение = [язык] метка:тип[:количество повторений]

Определяет какие метку будут взяты из другого модуля.

Тип: ABS (константа), BYTE, WORD,…, FAR, NEAR, PROC

global определение [, определение…]

Объединяет функции public и extrn.

.data

global my_out:dataptr, my_in:word

my_in dw 10

.code

global my_out_code:near, my_in_code:far

my_in_code proc far

call my_out_code

Соседние файлы в предмете Конструирование программ и языки программирования