Структура программы на ассемблере:
Model small ;модель программы, или же количество памяти на сегмент
. data ;сегмент данных
;описание переменных
. stack 100 h ;сегмент стека
. code ;сегмент данных
;процедуры, макрокоманды
main :
;основная программа
End main
Директивы резервирования памяти
Для описания простых типов данных в программе используются специальные директивы резервирования и инициализации данных, которые, по сути, являются указаниями транслятору на выделение определенного объема памяти. Если проводить аналогию с языками высокого уровня, то директивы резервирования и инициализации данных являются определениями переменных.
Машинного эквивалента этим директивам нет; просто транслятор, обрабатывая каждую такую директиву, выделяет необходимое количество байт памяти и при необходимости инициализирует эту область некоторым значением .
Директивы резервирования и инициализации данных простых типов имеют формат:
Рис. 5. Директивы описания данных простых типов
На рис. 5 использованы следующие обозначения:
· ? показывает, что содержимое поля не определено, то есть при задании директивы с таким значением выражения содержимое выделенного участка физической памяти изменяться не будет. Фактически, создается неинициализированная переменная;
· значение инициализации — значение элемента данных, которое будет занесено в память после загрузки программы. Фактически, создается инициализированная переменная, в качестве которой могут выступать константы, строки символов, константные и адресные выражения в зависимости от типа данных. Подробная информация приведена в приложении 1;
· выражение — итеративная конструкция с синтаксисом, описанным на рис. 5.17. Эта конструкция позволяет повторить последовательное занесение в физическую память выражения в скобках n раз.
· имя — некоторое символическое имя метки или ячейки памяти в сегменте данных, используемое в программе.
· db — резервирование памяти для данных размером 1 байт. Директивой db можно задавать следующие значения:
o выражение или константу, принимающую значение из диапазона:
§ для чисел со знаком –128...+127;
§ для чисел без знака 0...255;
o символьную строку из одного или более символов. Строка заключается в кавычки. В этом случае определяется столько байт, сколько символов в строке.
· dw — резервирование памяти для данных размером 2 байта. Директивой dw можно задавать следующие значения:
o выражение или константу, принимающую значение из диапазона:
§ для чисел со знаком –32 768...32 767;
§ для чисел без знака 0...65 535;
o выражение, занимающее 16 или менее бит, в качестве которого может выступать смещение в 16-битовом сегменте или адрес сегмента;
o 1- или 2-байтовую строку, заключенная в кавычки.
· dd — резервирование памяти для данных размером 4 байта. Директивой dd можно задавать следующие значения:
o выражение или константу, принимающую значение из диапазона:
§ для i386 и выше:
§ для чисел со знаком –2 147 483 648...+2 147 483 647;
§ для чисел без знака 0...4 294 967 295;
o относительное или адресное выражение, состоящее из 16-битового адреса сегмента и 16-битового смещения;
o строку длиной до 4 символов, заключенную в кавычки.
· df — резервирование памяти для данных размером 6 байт;
· dp — резервирование памяти для данных размером 6 байт. Директивами df и dp можно задавать следующие значения:
o выражение или константу, принимающую значение из диапазона:
§ для чисел со знаком –2 147 483 648...+2 147 483 647;
§ для чисел без знака 0...4 294 967 295;
o относительное или адресное выражение, состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младших моделей микропроцессоров Intel);
o адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;
o строку длиной до 6 байт, заключенную в кавычки.
· dq — резервирование памяти для данных размером 8 байт. Директивой dq можно задавать следующие значения:
o относительное или адресное выражение, состоящее из 32 или менее бит
o константу со знаком из диапазона –263...263–1;
o константу без знака из диапазона 0...264–1;
o строку длиной до 8 байт, заключенную в кавычки.
· dt — резервирование памяти для данных размером 10 байт. Директивой dt можно задавать следующие значения:
o относительное или адресное выражение, состоящее из 32 или менее бит
o адресное выражение, состоящее из 16-битового сегмента и 32-битового смещения;
o константу со знаком из диапазона –279...279-1;
o константу без знака из диапазона 0...280-1;
o строку длиной до 10 байт, заключенную в кавычки;
o упакованную десятичную константу в диапазоне 0...99 999 999 999 999 999 999.
Очень важно уяснить себе порядок размещения данных в памяти. Он напрямую связан с логикой работы микропроцессора с данными. Микропроцессоры Intel требуют следования данных в памяти по принципу: младший байт по младшему адресу.
Для иллюстрации данного принципа рассмотрим листинг 1, в котором определим сегмент данных. В этом сегменте данных приведено несколько директив описания простых типов данных.
Листинг 1. Пример использования директив резервирования и инициализации данных. Программа вводит строку с клавиатуры.model small . stack 100 h .datamessage db 'Массив байт, содержащих символьные переменные',10,13 '$'po db 1, 3, 4, 5, 0fh, 0bh, 32, 01011bperem_1 db 0ffh perem_2 dw 3a7fhperem_3 dd 0f54d567ahk1 db 10k2 db ?mas db 10 dup ('?')adr dw k1adr_full dd perem_3 .code start: mov ax,@data mov ds,ax mov ah,0ah mov dx,offset message ; mov dx, adr int 21h mov ax,4c00h int 21hEnd start
Система команд
Дата: 2019-12-22, просмотров: 274.