- •1)Архитектура пк.
- •1) Регистры общего назначения
- •2) Сегментные регистры
- •Ip(для кода); bx,si,di(для сегмента данных);bp,sp(для стека).Значения предыдущих кроме ip можно изменять, имея ввиду что память имеет кольцевую организацию.
- •4. Структура программы на asm
- •7) Организация прерываний.
- •1)Внешние;
- •2)Внутренние.
- •1) На вход intr - поступ. Запрос прерывание;
- •2) Послед. Действия определ. Допустимой ситуацией:
- •3) Микропроц. Выраб. 2 сигнала подтверждения intx.
- •4) По шине адресов/данных в микропроц. Передается байт с номером n прерываний.
- •5) Текущее содерж. Регистра признаков и регистра cs и ip загруж. В стек.
- •6) Признаки I,t сбрасываются в 0.
- •7)В cs:ip загруж. Содержимое вектора n.
- •8) Выполн. Программа обработки прерывания.
- •9) В конце обработки прерыв. Команда iret восстан. Знач. Регистра ip,es и fl.
- •10)Прерванная программа продолж. Свое выполнение.
- •2) Структура памяти и методы адресации.
- •Прямая адресация, при которой смещение данного размером 16 бит явл. Частью команды: mov ax,my_label
- •Регистровая адресация – операнд нах-ся в одном из регистров общего назначения или в одном из сегментных регистров, имя регистра определяется в самой команде ---- mov ax,bx
- •Неявная адресация – адреса объектов задаются неявно кодом операций.
- •Внутрисегментный косвенный переход - содержимое регистра ip заменяется 16 битовым значением заданного регистра или адресации данных кроме непосредственных. --- jmp [bx]
- •Межсегментный прямой переход – сод-мое регистра в ip и cs зам-ся 2 словами расп-ся непосредственно в команде ---- jmp far ptr far label
- •Межсегментный косвенный переход – при этом сод-мое регистров ip,cs зам-ся 2 словами последовательно расп. В памяти (ip по младшему алресу). --- jmp dword ptr[bx]
- •8. Объявление и инициализация данных
- •3) Организация стека.
- •1)Несмотря на то что знач. Sp можно изменять, этого делать не следует,
- •2) Необходимо обращ. Внимание для выделения памяти для стека.
- •Int 21h ; функция dos "завершить программу";
- •12) Логические и сдвиговые операции.
- •13) Организация циклов, условных и безусловных переходов
- •16) Префиксы повторения.
- •17) Подпрограммы. Передача параметров. Ближние и дальние процедуры.
- •18) Повторяющиеся блоки и макросы. Локальные метки.
- •22) Стандартные директивы определения сегментов.
- •30) Ввод информации с клавиатуры.
- •34) Использование встроенного Asm.
- •35) Вызов Asm процедур из с.
- •1) Процедуры на asm и c объединяются совместно, используя файл-проект. В этом случае перечисляются c функции и имена объектных модулей, написанных на asm после трансляции их с помощью tasm.
- •2) Компиляция из командной строки:
- •36) Резидентные программы.
- •1) Аппаратные:
- •2) Программные:
- •3) Исключительные ситуации:
- •Непосредственным обращением к соотв. Байтам
;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
Ввод данных с
клавиатуры может быть осуществлен
несколькими способами: - работа с Клавой
напрямую; - при помощи 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
…30) Ввод информации с клавиатуры.