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

34) Использование встроенного Asm.

Команды ассемблера в тексте программы на 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

35) Вызов Asm процедур из с.

Общая схема:

1) Процедуры на asm и c объединяются совместно, используя файл-проект. В этом случае перечисляются c функции и имена объектных модулей, написанных на asm после трансляции их с помощью tasm.

2) Компиляция из командной строки:

а) выполнить трансляцию модуля на С;

б) выполнить трансляцию модуля на ассемблере;

в) выполнить объединение объектных модулей.

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

36) Резидентные программы.

Программы, кот. ост. в памяти после возврата действия в ДОС носят назв. резидентных. Блоки памяти в которых сидят резиденты ОС отмечает как занятые.

Прерывания делятся:

1) Аппаратные:

- маскируемые;

- немаскируемые;

2) Программные:

- прерывания BIOS;

- прерывания DOS;

- пользовательские;

3) Исключительные ситуации:

- ошибки;

- ловушки;

- аварийное завершение.

Они вызываются процессором при возникновении ошибки(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 с нужным номером).

Способы установки векторов прерывания:

  1. Непосредственным обращением к соотв. Байтам

( 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

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