- •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) Исключительные ситуации:
- •Непосредственным обращением к соотв. Байтам
Команды ассемблера
в тексте программы на C
без изменения вкл. в формируемый
компилятором код. Для встроенного
ассемблера разр. использовать: - машинные
команды; строковые команды; - все
инструкции передач управления с прямой
или косвенной адресацией; - директивы
описания и определения данных. Нельзя
исп. директивы, управляющие его работой:
ASSUME,SEGMENT,ENDS,PROC,ENDP,ORG
и т.д. а также имя группы DGROUP,
имена сегментов _TEXT,_STACK,_DATA
и т.п. Можно ссылаться на описанные в С
переменные. Группа инструкций, заключенная
в фигурные скобки, не требует повторения
перед каждой из них ключевого слова
“asm”.
;37) Найти сумму
элементов чётных строк матриц
.186 cseg
segment
assume
cs:cseg org
100h main:
sum dw 0
col equ 4
row equ 4
mov bx, offset matrix
mov si, 0
mov di, 0
mov sum, 0
count_row:
mov cx, col
go_col:
xor ax, ax
mov al, [bx+si]
add sum, ax
inc si
loop go_col
inc di
add si, col
cmp di, row
jl count_row
cmp sum, 10
jl norma
mov ax, sum
mov dl, 10
div dl
mov byte ptr sum+1, al
mov byte ptr sum, ah
norma:
add byte ptr sum+1, 30h
add byte ptr sum, 30h
mov dl, byte ptr sum+1
mov ah, 02h
int 21h
mov dl, byte ptr sum
mov ah, 02h
int 21h
ret
matrix db 1, 2, 7, 4
db 1, 6, 7, 0
db 1, 7, 7, 5
db 1, 3, 7, 1
cseg ends
end main
;40) Сортировка
символов строки, заданной в сегменте
данных
.model
small .data
string db "csebfa",
'$'
len dw 6 .stack
100h .code main:
mov ax, @data
mov ds, ax
mov si, 0
mov cx, len
go_si:
mov
di, 0
push cx
mov cx, len
go_di:
mov dx, 0
mov dl, string[di]
cmp string[si], dl
jge next
mov dh, string[si]
mov string[di], dh
mov string[si], dl
next:
inc di
loop go_di
pop cx
inc si
loop go_si
mov dx, offset string
mov ah, 09h
int 21h
mov ah, 4ch
int 21h
end main
Общая схема:
а) выполнить
трансляцию модуля на С;
б) выполнить
трансляцию модуля на ассемблере;
в) выполнить
объединение объектных модулей.
ASM
процедура должна удовлетворять ниже
перечисленным требованиям:
- гарантировать
получение необходимой информации
редактором связей;
- обеспечить получ.
значений аргументов, переданных ей при
вызове, и видимость всех внешних
переменных;
- должно собл.
соотв. моделей памяти, используемых
при компиляции C-функции
и при обработке asm
процедур.
В этой связи
ассемблерная процедура должна:
а) использовать
правило именования сегментов, принятое
в С;
б) явно описывать
все глобальные и внешние идентификаторы;
в) поддерживать
принятую в С посл. передачи аргументов
и возврата значений в точку вызова.
Все внешние
переменные, на которые ссылается
ассемблерная процедура. и описанные в
С-функциях как внешние, должны объявляться
в asm
блоке явно с исп. директивы extrn
имя_переменной: тип. Если имеются
переменные, описанные в ассемблерном
модуле, значения которых исп. в С функции.
то они в asm
модуле объявляются с атрибутом public.
;38) Найти сумму
элементов чётных столбцов матрицы
.186 cseg
segment assume
cs:cseg org
100h main:
sum dw 0
col equ 4
row equ 4
mov bx, offset matrix
mov di, 0
mov sum, 0
count_col:
mov si, di
mov ax, si
mov dl, 2
div dl
cmp ah, 0
jne next
mov cx, row
go_row:
xor ax, ax
mov al, [bx+si]
add sum, ax
add si, col
loop go_row
next:
inc di
cmp di, col
jl count_col
cmp sum, 10
jl norma
mov ax, sum
mov dl, 10
div dl
mov byte ptr sum+1, al
mov byte ptr sum, ah
norma:
add byte ptr sum+1, 30h
add byte ptr sum, 30h
mov
dl, byte ptr sum+1
mov ah, 02h
int 21h
mov dl, byte ptr sum
mov ah, 02h
int 21h
ret
matrix db 1, 2, 7, 4
db 1, 6, 7, 0
db 1, 7, 7, 5
db 1, 3, 7, 1
cseg ends
end main
Программы, кот.
ост. в памяти после возврата действия
в ДОС носят назв. резидентных. Блоки
памяти в которых сидят резиденты ОС
отмечает как занятые.
Прерывания делятся:
- маскируемые;
- немаскируемые;
- прерывания BIOS;
- прерывания DOS;
- пользовательские;
- ошибки;
- ловушки;
- аварийное
завершение.
Они вызываются
процессором при возникновении ошибки(00
h – 1Fh)
и поддерживаются только в защищенном
режиме.
Сущ. 2 способа
оставить программу резидентной:
1) с помощью int
21h
(ah=31h;
al=код
возврата; dx=размер
резидента в 16-байтных параграфах включая
PSP;
cs=сегмент
резидента).
2) int
27h
– оставить программу резидентной(dx=
адрес последнего байта программы; cs
= сегмент резидента).
1-ый исп. когда
резиденты большого размера и явл. exe.
Резиденты небольшого размера, реализуются
в виде com
и ост. в памяти обработчиком int
27h.
Резиденты – активные (перехватывают
прерывания от внешних устройств) и
пассивные (активизируются при вып.
команды int
с нужным номером).
Способы
установки
векторов
прерывания:
( xor ax,ax---
mov es,ax---
mov ax,es:[9*4]---
mov int_ofs,ax---
mov ax,es:[9*4+2]---
mov int_seg,ax---)
Установить
адрес
входа
в
собственный
обработчик
также
можно
напрямую,
путем
модификации
таблицы
векторов(запрещает
прерывание
т.к.
недопустимо
чтобы
INT_NUM появилось
в
момент,
когда
изменяем
вектор.---
push 0---pop es---mov bx,INT_NUM---shl bx,2---mov ax,seg ISR---shl
eax,16---mov ax,offset ISR---mov es:[bx],eax---sti). В
многозадачной среде ОС может поддерживать
несколько таблиц векторов прерываний,
и реальный физический адрес может быть
известен только DOS.
2) Используя функции
DOS.
Функция 35h
получает адрес обработчика.(Вход
ah=35h,al=номер
прерывания; выход es:bx=адрес
обработчика). 25h
– устанавливает адрес входа в
обработчик.(вход ah=25h;
al=номер
прерывания; ds:dx
= адрес нового обработчика; выход –
ничего).
;39) Программа вывода
знаков строки в обратном порядке
.model
small .data
string db "abcde",
'$'
len dw 5 .stack
100h .code main:
mov ax, @data
mov ds, ax
mov cx, len
print:
mov si, cx
dec si
mov dl, string[si]
mov ah, 02h
int 21h
loop print
mov ah, 4ch
int 21h
end main
34) Использование встроенного Asm.
35) Вызов Asm процедур из с.
1) Процедуры на asm и c объединяются совместно, используя файл-проект. В этом случае перечисляются c функции и имена объектных модулей, написанных на asm после трансляции их с помощью tasm.
2) Компиляция из командной строки:
36) Резидентные программы.
1) Аппаратные:
2) Программные:
3) Исключительные ситуации:
Непосредственным обращением к соотв. Байтам