Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

In al,61h ;Получить и сохранить

PUSH AX ; данные порта

CLI ;Запретить прерывания

CALL B10SPKR ;Произвести звук

POP AX ;Восстановить значение

OUT 61H,AL ; порта

STI ;Разрешить прерывания

RET

MAIN ENDP

B10SPKR PROC NEAR

B20: MOV DX,DURTION ;Установить время звучания

B30:

AND AL,11111100B ;Очистить биты 0 и 1

OUT 61H,AL ;Передать на динамик

MOV CX,TONE ;Установить частоту

B40:

LOOP B40 ;Задержка времени

OR AL,00000010B ;Установить бит 1

OUT 61H,AL ;Передать на динамик

MOV CX,TONE ;становить частоту

B50:

LOOP B50 ;Задержка времени

DEC DX ;Уменьшить время звучания

JNZ B30 ;Продолжать?

SHL DURTION,1 ; нет - увеличить время,

SHR TONE,1 ; сократить частоту

JNZ B20 ;Нулевая частота?

RET ; да - выйти

B10SPKR ENDP

SOUNSG ENDS

END BEGIN

__________________________________________________________________________

Рис.23.3 Генерация звука

Глава 24 Справочник по директивам языка Ассемблер

__________________________________________________________________________

Ц е л ь: подробно описать операторы и директивы языка Ассемблер.

ВВЕДЕНИЕ

________________________________________________________________

Некоторые особенности Ассемблера кажутся на первый взгляд несколько

странными. Но после того, как вы ознакомились с простейшими и наиболее

общими свойствами Ассемблера, описанными в предыдущих главах, то

обнаружите, что описания в этой главе более понятны и являются удобным

руководством к программированию. В данной главе представлены операторы

атрибутов, операторы, возвращающие значение, директивы данных, а также

индексная адресация памяти.

ИНДЕКСНАЯ АДРЕСАЦИЯ ПАМЯТИ

________________________________________________________________

При прямой адресации памяти в одном из операндов команды указывается

имя определенной переменной, например для переменной COUNTER:

ADD CX,COUNTER

Во время выполнения программы процессор локализует указанную

переменную в памяти путем объединения величины смещения к этой переменной

с адресом сегмента данных.

При индексной адресации памяти ссылка на операнд определяется через

базовый или индексный регистр, константы, переменные смещения и простые

переменные. Квадратные скобки, определяющие операнды индексной адресации,

действуют как знак плюс (+). Для индексном адресации памяти можно

использовать:

- базовый регистр BX в виде [BX] вместе с сегментным регистром

DS или базовый регистр BP в виде [BP] вместе с сегментным регистром

SS. Например, с помощью команды

MOV DX,[BX] ;Базовый регистр

в регистр DX пересылается элемент, взятый по относительному адресу в

регистре BX и абсолютному адресу сегмента в регистре DS;

- индексный регистр DI в виде [DI] или индексный регистр SI в

виде [SI], оба вместе с сегментным регистром DS. Например, с помощью

команды

MOV AX,[SI] ;Индексный регистр

в регистр AХ пересылается элемент, взятый по относительному адресу в

регистре SI и абсолютному адресу сегмента в регистре DS;

- [константу], содержащую непосредственный номер или имя в

квадратных скобках. Например, с помощью команды

MOV [BX+SI+4],AX ;База+индекс+константа

содержимое регистра АХ пересылается по адресу, который вычисляется,

как сумма абсолютного адреса в регистре DS, относительного адреса в

регистре BX, относительного адреса в регистре SI и константы 4;

- смещение (+ или -) совместно с индексным операндом. Существует

небольшое различие при использовании константы и смещения. Например,

с помощью команды

MOV DX,8[DI][4] ;Смещение+индекс+константа

в регистр DX пересылается элемент, взятый по абсолютному адресу в

регистре DS, смещению 8, относительному адресу в регистре DI и

константе 4.

Эти операнды можно комбинировать в любой последовательности. Но

нельзя использовать одновременно два базовых регистра [BX + BP] или два

индексных регистра [DI + SI]. Обычно индексированные адреса используются

для локализации элементов данных в таблицах.

ОПЕРАТОРЫ ЯЗЫКА АССЕМБЛЕР

________________________________________________________________

Существует три типа ассемблерных операторов: операторы атрибута,

операторы, возвращающие значение, и операторы. специфицирующие битовую

строку. В данном разделе рассмотрены первые два типа операторов.

Операторы, специфицирующие битовую строку, оператор MASK, счетчик сдвига и

оператор WIDTH относятся к директиве RECORD и будет рассмотрены в

следующем разделе.

Оператор LENGTH

-----------------

Оператор LENGTH возвращает число элементов, определенных операндом

DUP. Например, следующая команда MOV заносит в регистр DX значение 10:

TABLEA DW 10 DUP(?)

...

MOV DX,LENGTH TABLEA

Если операнд DUP отсутствует, то оператор LENGTH возвращает значение