Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-50_1.docx
Скачиваний:
9
Добавлен:
02.08.2019
Размер:
707.62 Кб
Скачать
  1. Команда прерывания, команды работы со стеком.

int (int - от interrupt - прерывание) - с помощью команды прерывания происходит приостановка работы процессора - управление передается DOS или BIOS в зависимости от операнда этой команды и содержимого некоторых регистров, строго определенных для каждой функции. После выполнения обрабатывающей программы управление передается команде, следующей за int.

Пример:(вывод символа '!')

MOV AH,6 ; в регистр AH пересылается номер функции(в данном случае 6 )

MOV DL, '!'; в регистр DL пересылается нужный символ

int 21h; обращение к обработчику функции операционной системы(вызов DOS)

Регистры стека - SS и SP(ESP)

SS - определяет адрес начала сегмента стека(этот адрес определяется системой самостоятельно)

SP - указатель на вершину стека, его значение уменьшается при добавлении элементов

PUSH <операнд> - положить на вершину стека. Операндом может служить переменная или регистр(тогда на вершину поступит значение регистра)

POP <операнд> - удалить вершину стека(операнды как в PUSH)

Можно обратиться к произвольному элементу стека, не удаляя предварительно все элементы "выше" нужного. Для этого нужно указатель на вершину стека записать в вспомогательный регистр.

MOV BP,SP; (SP)->BP (BP указывает на вершину стека)

MOV AX, [BP+6]; (SS:(BP+6))->AX(адресация по базе - мы берем элемент 6-й от вершины)

Пример - программа переписывает содержимое 4 байтов из одного участка памяти в другой(в обратном порядке) и выводит их на экран

TITLE Prim.ASM; директива определяет заголовок листинга программы (необязательная )

Page,120; определение страницы листинга:1)кол-во строк на странице( у нас отсутствует - значение возьмется по умолчанию - 58 строк) 2)кол-во символов строке - 120

;описание сегмента стека

Sseg Segment Para Stack 'stack'

DB 100h dup(?); выделили для стека 100h(в 16-й системе счисления) = 255 байтов с произвольным значением

Sseg ends;

описание сегмента данных

Dseg segment Para Public 'Data'

DAN DB '1','3','5','7'; DAN - для хранения данных - инициализировали 4-мя символами

REZ DB 4 dup(?); выделили 4 байта для REZ(результат)

Dseg ends

;кодовый сегмент - как одна внешняя процедура - к ней обращение происходит через ;отладчик

Cseg Segment Para Public 'Code'

ASSUME SS:Sseg, DS: Dseg, CS:Cseg

Start proc FAR

PUSH DS;

XOR AX,AX

PUSH AX; в стек отправится пустое слово

MOV AX, Dseg

MOV DS, AX;

пересылка данных в обратной последовательности с выводом на экран

MOV AH, 6; в AH отправили код команды для DOS

MOV DL, DAN; '1' записывается в DL

MOV REZ+3, DL; '1' в последний байт REZ

int 21h; прерывание

MOV DL, DAN+1; '3' записывается в DL

MOV REZ+2, DL; '3' в третий байт REZ

int 21h; прерывание

MOV DL, DAN +2; '5' в DL

MOV REZ+1, DL; '5' во второй байт REZ

int 21h; прерывание

MOV DL, DAN+3; '7' в DL

MOV REZ, DL; '7' отправляется в первый байт REZ

int 21h

MOV AH, 4Ch

int 21h

Start endp

Cseg ends

End start

  1. Упрощённые директивы сегментирования, структура программы с использованием точечных директив, пример программы.

Упрощенные директивы сегментирования, структура программы с использованием точечных директив, пример программы.

С помощью стандартных директив сегментации можно писать программы любой сложности и размера. в ассемблере сегодня существует возможность повысить уровень программирования - для этого имеются упрощенные директивы сегментации, называемые точечными.

MODEL - директива определяет модель памяти, выделяемой под программу:

-tiny - под всю программу выделяется 1 сегмент памяти

-small - по 1-му сегменту на данные и на программу

-medium - под данные 1 сегмент, под программу несколько

-compact - под программу 1 сегмент, под данные несколько

-large - под данные и программу по несколько сегментов

-huge - позволяет использовать памяти больше, чем объем ОП(запись данных на диск)

Пример использования точечных директив

.MODEL small

.STACK 100h

.DATA

St1 DB 'Line 1','$'

St2 DB 'Line 2','$'

St3 DB 'Line 3','$'

.CODE

begin: MOV AH,9; begin: - метка, 9 - номер ф-и вывода на экран

MOV DX, offset St1; в DX должен содержаться адрес St1

int 21h

Mov DX, offset St2

int 21h

MOV DX,offset St3

int 21h

MOV AH,4Ch

int 21h

end begin

В результате получим: Line 1 Line 2 Line 3

Чтобы вывести в столбик необходимы следующие изменения:

St1 DB 'Line 1' ,13,10.'$'; 13- перевод строки, 10 - возврат каретки

St2 DB 'Line 2' ,0Dh,0Ah.'$';0Dh(в 16-й системе счисл) = 13, 0Ah = 10

St3 DB 'Line 3','$'

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]