Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТОД_МП.DOC
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
2.28 Mб
Скачать

1.6. Пример исходной программы

На рис. 1.2 обобщены предыдущие сведения в простой исходной программе на ассемблере. Программа содержит сегмент стека STACKSG и сегмент кода CODESG.

STACKSG SEGMENT PARA STACK ‘Stack’

DB 12 DUP ( ‘STACKSEG’ )

STACKSG ENDS

CODESG SEGMENT PARA ‘Code’

BEGIN PROC FAR

ASSUME SS: STACKSG, CS: CODESG, DS: NOTHING

MOV AX,0123H ; 3аписать 0123 в АХ.

ADD AX,0025H ; Прибавить 25 к AX.

MOV BX,AX ; Переслать AX в BX.

ADD BX,AX ; Прибавить BX к AX.

MOV CX,BX ; Переслать BX в CX.

Рис. 1.2. Пример исходной программы на ассемблере

SUB CX,AX ; Вычесть AX из CX.

MOV AX,4C00H

INT 21H ; Возврат в DOS.

BEGIN ENDP ; Конец процедуры.

CODESG ENDS ; Конец сегмента.

END BEGIN ; Конец программы.

Рис. 1.2. Окончание

Сегмент STACKSG содержит один элемент DB (определить байт), который определяет 12 копий слова ‘STACKSEG’. В последующих программах стек не определяется таким способом, но при использовании отладчика для просмотра ассемблированной программы на экране данное определение помогает локализовать стек.

Сегмент кода CODESG содержит выполняемые команды программы, хотя первая директива ASSUME не генерирует кода. Директива ASSUME назначает регистр SS для STACKSG и регистр CS для CODESG. В действительности эта директива сообщает ассемблеру, что для адресации в STACKSG необходимо использовать адрес в регистре SS и для адресации в CODESG – адрес в регистре CS. Системный загрузчик при загрузке программы с диска в память для выполнения устанавливает действительные адреса в регистрах SS и CS. Программа не имеет сегмента данных, так как в ней нет определения данных и соответственно в ASSUME нет необходимости ассигновать регистр DS.

2. Определение данных

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

Другой способ определения константы – непосредственное значение, т. е. значение, указанное прямо в ассемблерной команде, например:

MOV AL,20H

В этом случае шестнадцатеричное число 20 становится частью машинного объектного кода. Непосредственное значение ограничено одним байтом или одним словом, но там, где его можно применять, оно более эффективно, чем использование константы.

2.1. Директивы определения данных

Ассемблер обеспечивает два способа определения данных: во-первых, через указание длины данных; во-вторых, по их содержимому. Рассмотрим основной формат определения данных:

[имя] Dn выражение

Имя элемента данных необязательно (это указывается квадратными скобками), но если в программе имеются ссылки на некоторый элемент, то это делается посредством имени.

Для определения элементов данных имеются следующие директивы: DB (байт), DW (слово), DD (двойное слово), DQ (учетверенное слово) и DT (десять байтов). Выражение может содержать константу

А DB 25

или знак вопроса для неопределенного значения

B DB ?

Выражение может содержать несколько констант, разделенных запятыми и ограниченных только длиной строки:

С DB 11, 12, 13, 14, 15, 16, . . .

Ассемблер определяет эти константы в виде последовательности смежных байтов. Ссылка по имени С указывает на первую константу 11, по С+1 – на вторую константу 12. (С можно представить как С + 0). Например, команда

MOV AL,С+3

загружает в регистр AL значение 14 (0ЕН). Выражение допускает также повторение константы в следующем формате:

[имя] Dn число повторений DUP ( выражение ) ...

Следующие три примера иллюстрируют повторение:

DW 10 DUP ( ? ) ; Десять неопределенных слов.

DB 5 DUP ( 14 ) ; Пять байт, содержащих 0ЕН.

DB 3 DUP ( 4 DUP ( 8 ) ) ; Двенадцать восьмерок.

В третьем примере сначала генерируются четыре копии десятичной 8 (8888), затем это значение повторяется три раза, давая в результате двенадцать восьмерок. Выражение может содержать символьную строку или числовую константу.

Символьные строки

Символьная строка используется для описания таких данных, как, например, имена людей или заголовки страниц. Содержимое строки отмечается одиночными кавычками, например ‘PC’, или двойными кавычками “PC”. Ассемблер переводит символьные строки в объектный код в обычном формате ASCII.

Символьная строка определяется только директивой DB, в которой указывается более двух символов в нормальной последовательности слева направо. Директива DB представляет единственно возможный формат для определения символьных данных. На рис. 2.1 приведены некоторые примеры.

DATASG SEGMENT PARA ‘Data’

; Определение байта – DB :

A DB ? ; Не инициализировано.

B DB ‘Personal Computer’ ; Символьная строка.

C DB 32 ; Десятичная константа.

D DW 20H ; Шестнадцатеричная константа.

Рис. 2.1. Определение символьных строк и числовых величин

E DB 01011001B ; Двоичная константа.

DATASG ENDS

END

Рис. 2.1. Окончание

Числовые константы

Числовые константы применяются для арифметических значений и для адресов памяти. Для описания числовой константы кавычки не ставятся. Ассемблер преобразует все числовые константы в шестнадцатеричные и записывает байты в объектном коде в обратной последовательности – справа налево. Ниже показаны различные числовые форматы.

Десятичный формат. Десятичный формат допускает десятичные цифры от 0 до 9 и обозначается последней буквой D, которую можно не указывать, например 125 или 125D. Несмотря на то, что ассемблер позволяет кодирование в десятичном формате, он преобразует эти значения в шестнадцатеричный объектный код. Десятичное число 125 преобразуется в 7DH.

Шестнадцатеричный формат. Шестнадцатеричный формат допускает цифры от 0 до F и обозначается в конце буквой Н. Так как ассемблер полагает, что с буквы начинаются идентификаторы, то первой цифрой шестнадцатеричной константы должна быть цифра от 0 до 9. Например, 2ЕН или 0FFFH ассемблер преобразует соответственно в 2Е и FF0F ( байты во втором случае записываются в объектный код в обратной последовательности ).

Двоичный формат. Двоичный формат допускает двоичные цифры 0 и 1 и обозначается в конце буквой В. Двоичный формат обычно используется для более четкого представления битовых значений в логических командах AND, OR, XOR и TEST. Десятичное 12, шестнадцатеричное С и двоичное 1100В генерируют один и тот же код: шестнадцатеричное 0СН или двоичное 00001100B в зависимости от того, как вы рассматриваете содержимое байта.

Восьмеричный формат. Восьмеричный формат допускает восьмеричные цифры от 0 до 7 и обозначается последней буквой Q или O, например 253Q. На сегодня восьмеричный формат используется весьма редко.

Десятичный формат с плавающей точкой. При записи символьных и числовых констант следует помнить, что, например, символьная константа, определенная как DB ‘12’, представляет символы ASCII и генерирует 3132Н, а числовая константа, определенная как DB 12, представляет двоичное число и генерирует 0СН. Все десятичные числа с плавающей точкой записываются с точкой (1.2345, 3.78Е-3, 3.0). Необходимо обратить внимание, что целые числа в вещественном формате записываются обязательно с точкой, например 123.0.

Директива определения байта (DB)

Из различных директив, определяющих элементы данных, чаще используется директива DB (определить байт). Символьное выражение в директиве DB может содержать строку символов любой длины. Обратите внимание, что константа B содержит символьную строку ‘Personal Computer’. Объектный код показывает символы кода ASCII для каждого байта.

Числовое выражение в директиве DB может содержать одну однобайтовую константу или более. Один байт выражается двумя шестнадцатеричными цифрами. Наибольшее положительное шестнадцатеричное число в одном байте – это 7F, все «большие» числа от 80 до FF представляют отрицательные значения. В десятичном счислении эти пределы выражаются числами +127 и –128.

Директива определения слова (DW)

Директива DW определяет элементы, которые имеют длину в одно слово (два байта). Символьное выражение в DW ограничено двумя символами, которые ассемблер представляет в объектном коде так, что, например, ‘PC’ становится 'СР'. Для определения символьных строк директива DW имеет ограниченное применение.

Числовое выражение в DW может содержать одну или более двухбайтовых констант. Два байта представляются четырьмя шестнадцатеричными цифрами. Наибольшее положительное шестнадцатеричное число в двух байтах – это 7FFFH все «большие» числа от 8000H до FFFFH представляют отрицательные значения. В десятичном исчислении эти пределы выражаются числами + 32767 и – 32768.

Для форматов директив DW, DD и DQ ассемблер преобразует константы в шестнадцатеричный объектный код, но записывает его в обратной последовательности. Таким образом, десятичное значение 12345 преобразуется в 3039Н, но записывается в объектном коде как 3930.

Директива определения двойного слова (DD)

Директива DD определяет элементы, которые имеют длину в два слова (четыре байта). Числовое выражение может содержать одну константу или более, каждая из которых имеет максимально четыре байта (восемь шестнадцатеричных цифр). Наибольшее положительное шестнадцатеричное число в четырех байтах – это 7FFFFFFFH все «большие» числа от 80000000H до FFFFFFFFH представляют отрицательные значения. В десятичном исчислении эти пределы выражаются числами + 2147483647 и – 2147483648.

Ассемблер преобразует все числовые константы в директиве DD в шестнадцатеричное представление, но записывает объектный код в обратной последовательности. Таким образом, десятичное значение 12345 преобразуется в 00003039Н, но записывается в объектном коде как 39300000.

Директива определения поля из четырех слов (DQ)

Директива DQ определяет элементы, имеющие длину четыре слова (восемь байтов). Числовое выражение может содержать одну или более констант, каждая из которых имеет максимум восемь байтов или 16 шестнадцатеричных цифр. Наибольшее положительное шестнадцатеричное число – это 7 и далее пятнадцать цифр F.

Ассемблер преобразует все числовые константы в директиве DQ в шестнадцатеричные представления, но записывает объектные коды в обратной последовательности, как и в директивах DD и DW.

Обработка ассемблером символьных строк в директиве DQ аналогична обработке директив DD и DW.

Директива определения десяти байтов (DТ)

Директива DT определяет элементы данных, имеющие длину десять байтов. Назначение этой директивы связано с «упакованными десятичными» числовыми значениями. По директиве DT генерируются различные константы в зависимости от версии ассемблера. Для практического применения ознакомьтесь с руководством по имеющемуся у вас ассемблеру.