Упрощенный формат директивы MODEL
MODEL [ ] [др. параметры]
Обязательным параметром директивы MODEL является «модель памяти». Этот параметр определяет модель сегментации памяти для программного модуля.
Возможные значения параметра «модель памяти»:
Параметр «модификатор» директивы MODEL уточняет особенности использования выбранной модели памяти.
Возможные значения параметра «модификатор модели памяти»:
Другие параметры используются при написании программ на разных языках программирования (пока использовать не будем).
Для большинства программ на ассемблере используют директиву
При использовании директивы MODEL транслятор создает и делает доступными для программиста идентификаторы, в которых хранится информация о физических адресах сегментов.
Перечислим идентификаторы, создаваемые директивой MODEL:
Структура программы на языке Assembler
Таким образом, общая структура программы может выглядеть следующим образом:
masm ;режим работы TASM: ideal или masm
model small ;модель памяти
.stack ;сегмент стека
.data ;сегмент данных
end BEGIN ;конец программы с точкой входа BEGIN
Текст программы с использованием упрощенных директив сегментации.
Описаны 3 сегмента программы: сегмент данных, сегмент стека и сегмент кода.
В сегменте данных задана строка для вывода на экран.
Размер стека равен 256 байт.
Сегмент кода содержит команды начала и завершения программы, а также комментарии к пропущенным командам.
masm ;режим работы TASM: ideal или masm
model small ;модель памяти
.data ;сегмент данных
message db ‘Привет всем,$’
.stack ;сегмент стека
db 256 dup (‘?’) ;сегмент стека
main : ;начало программы
mov ax,@data ;заносим в сегментный регистр ds
mov ds,ax ; физический адрес сегмента данных
;здесь будут команды вывода строки на экран
mov ax,4c00h ;пересылка 4c00h в регистр ax
int 21h ;вызов прерывания с номером 21h
end main ;конец программы с точкой входа main
Структура программы на языке ассемблера
Глава из книги “Ассемблер для процессоров Intel Pentium”
Автор: Ю. Магда
Источник: Ассемблер для процессоров Intel Pentium
Материал предоставил: Издательство «Питер»
Опубликовано: 08.04.2006
Версия текста: 1.0

Материал этой главы посвящен вопросам организации и компоновки программного кода на языке ассемблера. Затронуты вопросы взаимодействия различных частей ассемблерной программы, организации сегментов программного кода, данных и стека в контексте различных моделей памяти. Напомню, что мы рассматриваем эти аспекты применительно к макроассемблеру MASM фирмы Microsoft, хотя многие положения действительны и для других компиляторов. Начнем с анализа сегментов. Мы уже сталкивались с этими вопросами в главе 3, сейчас же рассмотрим их более детально.
4.1. Организация сегментов
Для хорошего понимания, как работает программа на ассемблере, нужно очень четко представлять себе организацию сегментов. Применительно к процессорам Intel Pentium термин “сегмент” имеет два значения:
Физический сегмент может располагаться только по адресу, кратному 16, или, как иногда говорят, по границе параграфа. Логические сегменты тесно связаны с физическими. Каждый логический сегмент ассемблерной программы определяет именованную область памяти, которая адресуется селектором сегмента, содержащимся в сегментном регистре. Сегментированная архитектура создает определенные трудности в процессе разработки программ. Для небольших программ, меньших 64 Кбайт, программный код и данные могут размещаться в отдельных сегментах, поэтому никаких особых проблем не возникает.
При использовании 32-разрядного защищенного режима эти проблемы исчезают. Например, в плоской модели памяти (о ней мы поговорим чуть позже) для адресации программного кода и данных достаточно 32-разрядного эффективного адреса внутри непрерывной области памяти.
Логические сегменты могут содержать три основных компонента программы: программный код, данные и стек. Макроассемблер MASM обеспечивает правильное отображение этих компонентов на физические сегменты памяти, при этом сегментные регистры CS, DS и SS содержат адреса физических сегментов памяти.
4.2. Директивы управления сегментами и моделями памяти макроассемблера MASM
В макроассемблер MASM включены директивы, упрощающие определение сегментов программы и, кроме того, предполагающие те же соглашения, которые используются в языках высокого уровня Microsoft. Упрощенные директивы определения сегментов генерируют необходимый код, указывая при этом атрибуты сегментов и порядок их расположения в памяти. Везде в этой книге мы будем использовать именно упрощенные директивы определения сегментов, наиболее важные из которых перечислены далее:
| Модель памяти | Адресация кода | Адресация данных | Операционная система | Чередование кода и данных |
|---|---|---|---|---|
| TINY | NEAR | NEAR | MS-DOS | Допустимо |
| SMALL | NEAR | NEAR | MS-DOS, Windows | Нет |
| MEDIUM | FAR | NEAR | MS-DOS, Windows | Нет |
| COMPACT | NEAR | FAR | MS-DOS, Windows | Нет |
| LARGE | FAR | FAR | MS-DOS, Windows | Нет |
| HUGE | FAR | FAR | MS-DOS, Windows | Нет |
| FLAT | NEAR | NEAR | Windows NT, Windows 2000, Windows XP, Windows 2003 | Допустимо |
Все семь моделей памяти поддерживаются всеми компиляторами MASM, начиная с версии 6.1.
Модель small поддерживает один сегмент кода и один сегмент данных. Данные и код при использовании этой модели адресуются как near (ближние). Модель large поддерживает несколько сегментов кода и несколько сегментов данных. По умолчанию все ссылки на код и данные считаются дальними (far).
Модель medium поддерживает несколько сегментов программного кода и один сегмент данных, при этом все ссылки в сегментах программного кода по умолчанию считаются дальними (far), а ссылки в сегменте данных — ближними (near). Модель compact поддерживает несколько сегментов данных, в которых используется дальняя адресация данных (far), и один сегмент кода с ближней адресацией (near). Модель huge практически эквивалентна модели памяти large.
Должен заметить, что разработчик программ может явно определить тип адресации данных и команд в различных моделях памяти. Например, ссылки на команды внутри одного сегмента кода в модели large можно сделать ближними (near). Проанализируем, в каких случаях лучше всего подходят те или иные модели памяти.
Модель tiny работает только в 16-разрядных приложениях MS-DOS. В этой модели все данные и код располагаются в одном физическом сегменте. Размер программного файла в этом случае не превышает 64 Кбайт. С другой стороны, модель flat предполагает несегментированную конфигурацию программы и используется только в 32-разрядных операционных системах. Эта модель подобна модели tiny в том смысле, что данные и код размещены в одном сегменте, только 32-разрядном. Хочу напомнить, что многие примеры из этой книги разработаны именно для модели flat.
Параметр соглашение_о_вызовах используется для определения способа передачи параметров при вызове процедуры из других языков, в том числе и языков высокого уровня (C++, Pascal). Параметр может принимать следующие значения: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL. При разработке модулей на ассемблере, которые будут применяться в программах, написанных на языках высокого уровня, обращайте внимание на то, какие соглашения о вызовах поддерживает тот или иной язык. Более подробно соглашения о вызовах мы будем рассматривать при анализе интерфейса программ на ассемблере с программами на языках высокого уровня.
Параметр тип_ОС равен OS_DOS, и на данный момент это единственное поддерживаемое значение этого параметра.
Здесь параметр flat указывает компилятору на то, что будет использоваться 32-разрядная линейная адресация. Второй параметр c указывает, что при вызове ассемблерной процедуры из другой программы (возможно, написанной на другом языке) будет задействован способ передачи параметров, принятый в языке C. Следующий пример:
Здесь используются модель памяти large, соглашение о передаче параметров языка C и отдельный сегмент стека (регистр SS не равен DS).
В этом примере используются модель medium, соглашение о передаче параметров для Pascal и область стека, размещенная в одном физическом сегменте с данными.
4.3. Структура программ на ассемблере MASM
В следующем примере показана 16-разрядная программа на ассемблере, в которой используются упрощенные директивы ассемблера MASM:
Здесь оператор end main указывает на точку входа main в главную процедуру. Оператор end закрывает последний сегмент и обозначает конец исходного текста программы. В 16-разрядных приложениях MS-DOS можно инициализировать сегментные регистры так, чтобы они указывали на требуемый логический сегмент данных. Листинг 4.1 демонстрирует это.
Затем строка s1, адресуемая через регистры DS:DX, выводится на экран с использованием прерывания 9h функции 21h MS-DOS. Попробуйте закомментировать проанализированные две строки кода и посмотреть на результат работы программы.
Для 32-разрядных приложений шаблон исходного текста выглядит иначе:
Основное отличие от предыдущего примера — другая модель памяти (flat), предполагающая 32-разрядную линейную адресацию с атрибутом near.
Замечу, что директива SEGMENT может применяться с любой моделью памяти, не только flat. При использовании директивы SEGMENT потребуется указать компилятору на то, что все сегментные регистры устанавливаются в соответствии с моделью памяти flat. Это можно сделать при помощи директивы ASSUME:
Регистры FS и GS программами не используются, поэтому для них указывается атрибут ERROR.
Сейчас мы рассмотрим программный код 32-разрядной процедуры на ассемблере (она называется _seg_ex), в которой используются два логических сегмента данных. Процедура выполняет копирование строки src, находящейся в сегменте данных data1, в область памяти dst в сегменте данных data2 и содержит один логический сегмент программного кода (code segment).
Успокою читателей, незнакомых с принципами работы процедур (они рассмотрены далее в книге): в данном случае нас будет интересовать код внутри процедуры _seg_ex (команды, находящиеся между директивами _seg_ex proc и _seg_ex endp). Исходный текст программного кода процедуры _seg_ex представлен в листинге 4.2.
При использовании модели flat доступ к данным осуществляется по 32-разрядному смещению, поэтому смысл показанных ниже команд, загружающих адреса логических сегментов (а заодно и адреса строк src и dst) в регистры ESI и EDI, думаю, понятен:
Группа следующих команд выполняет копирование строки src в dst, при этом регистр CX содержит количество копируемых байтов:
Здесь процедура seg_ex является внешней, поэтому объявлена как extern.
Результатом выполнения программы будет строка на экране дисплея
Разница между использованием model small и segment/assume
Start Stop Length Name Class
00000H 000D9H 000DAH _TEXT CODE
000E0H 000FDH 0001EH _DATA DATA
00100H 00355H 00256H STACK STACK
Detailed map of segments
0000:0000 0046 C=CODE S=_TEXT G=(none) M=LABA112.ASM ACBP=48
0000:0046 0094 C=CODE S=_TEXT G=(none) M=LABA122.ASM ACBP=48
000E:0000 001E C=DATA S=_DATA G=DGROUP M=LABA112.ASM ACBP=48
000E:001E 0000 C=DATA S=_DATA G=DGROUP M=LABA122.ASM ACBP=48
000E:0020 0256 C=STACK S=STACK G=DGROUP M=LABA122.ASM ACBP=74
Address Publics by Name
0000:0057 INPUT
0000:0046 NEWSTR
0000:00A6 OUTPUT
0000:00AB PROCEDURE
Address Publics by Value
0000:0046 NEWSTR
0000:0057 INPUT
0000:00A6 OUTPUT
0000:00AB PROCEDURE
Program entry point at 0000:0000
Добавлено через 1 минуту
тут использовала segment и assume
Start Stop Length Name Class
00000H 0001DH 0001EH CDATA DATA
00020H 00103H 000E4H CCODE CODE
00110H 0020FH 00100H CSTACK STACK
Detailed map of segments
0000:0000 001E C=DATA S=CDATA G=(none) M=LABA11.ASM ACBP=68
0002:0000 0046 C=CODE S=CCODE G=(none) M=LABA11.ASM ACBP=68
0002:0050 0094 C=CODE S=CCODE G=(none) M=LABA12.ASM ACBP=68
0011:0000 0100 C=STACK S=CSTACK G=(none) M=LABA12.ASM ACBP=74
Address Publics by Name
0002:0061 INPUT
0002:0050 NEWSTR
0002:00B0 OUTPUT
0002:00B5 PROCEDURE
Address Publics by Value
0002:0050 NEWSTR
0002:0061 INPUT
0002:00B0 OUTPUT
0002:00B5 PROCEDURE
Program entry point at 0002:0000

Помогите компилировать программу! Сообщение компилятора AAVmja.asm(9) : error A2118: cannot have.
Разница между датами с использованием массива
Разница между датами с использованием массива. Нужно подсчитать сколько дней осталось к экзамену.

Всем привет!Ребят немного не понимаю разницу. Есть 2 разметки в первой я пишу обработчик события.
Решение
_TEXT segment word public ’CODE’
для моделей TINY, SMALL и COMPACT
name_TEXT segment word public ’CODE’
имя_сегмента segment para private ’FAR_BSS’
Как и в случае с FARDATA, доступ к данным из этого сегмента потребует загрузки сегментного регистра. Если имя сегмента не указано, используется FAR_BSS.
Организация и модели памяти, адресация
Память – способность объекта обеспечивать хранение данных.
Все объекты, над которыми выполняются команды, как и сами команды, хранятся в памяти компьютера.
Способы адресации байтов
Существует прямой и обратный способы адресации байтов.
При обратном способе адресации байты адресуются слева направо, так что самый старший (левый) байт слова имеет наименьший адрес.
Прямым способом называется противоположная система адресации. Компиляторы высокоуровневых языков поддерживают прямой способ адресации. 
Объект занимает целое слово. Поэтому для того, чтобы обратиться к нему в памяти, нужно указать адрес, по которому этот объект хранится.
Организация памяти
Физическая память, к которой микропроцессор имеет доступ по шине адреса, называется оперативной памятью ОП (или оперативным запоминающим устройством — ОЗУ).
Механизм управления памятью полностью аппаратный, т.е. программа сама не может сформировать физический адрес памяти на адресной шине.
Микропроцессор аппаратно поддерживает несколько моделей использования оперативной памяти:
Сегментация — механизм адресации, обеспечивающий существование нескольких независимых адресных пространств как в пределах одной задачи, так и в системе в целом для защиты задач от взаимного влияния.
Каждая программа в общем случае может состоять из любого количества сегментов, но непосредственный доступ она имеет только к 3 основным сегментам и к 3 дополнительным сегментам, обслуживаемых 6 сегментными регистрами. К основным сегментам относятся:
Регистры дополнительных сегментов ( ES, FS, GS ), предназначены для специального использования.
Для доступа к данным внутри сегмента обращение производится относительно начала сегмента линейно, т.е. начиная с 0 и заканчивая адресом, равным размеру сегмента. Для обращения к любому адресу в программе, компьютер складывает адрес в регистре сегмента и смещение — расположение требуемого адреса относительно начала сегмента. Например, первый байт в сегменте кодов имеет смещение 0, второй байт – 1 и так далее.
Таким образом, для обращения к конкретному физическому адресу ОЗУ необходимо определить адрес начала сегмента и смещение внутри сегмента.
Физический адрес принято записывать парой этих значений, разделенных двоеточием
сегмент : смещение
Плоская модель памяти предполагает, что задача состоит из одного сегмента, который, в свою очередь, разбит на страницы.
Достоинства:
В абсолютном большинстве современных 32(64)-разрядных операционных систем (для микропроцессоров Intel) используется плоская модель памяти.
Модели памяти
.MODEL модификатор МодельПамяти СоглашениеОВызовах
Параметр МодельПамяти является обязательным.
Основные модели памяти:
| Модель памяти | Адресация кода | Адресация данных | Операци- онная система | Чередование кода и данных |
| TINY | NEAR | NEAR | MS-DOS | Допустимо |
| SMALL | NEAR | NEAR | MS-DOS, Windows | Нет |
| MEDIUM | FAR | NEAR | MS-DOS, Windows | Нет |
| COMPACT | NEAR | FAR | MS-DOS, Windows | Нет |
| LARGE | FAR | FAR | MS-DOS, Windows | Нет |
| HUGE | FAR | FAR | MS-DOS, Windows | Нет |
| FLAT | NEAR | NEAR | Windows NT, Windows 2000, Windows XP, Windows Vista | Допустимо |
Модель tiny работает только в 16-разрядных приложениях MS-DOS. В этой модели все данные и код располагаются в одном физическом сегменте. Размер программного файла в этом случае не превышает 64 Кбайт.
Модель small поддерживает один сегмент кода и один сегмент данных. Данные и код при использовании этой модели адресуются как near (ближние).
Модель medium поддерживает несколько сегментов программного кода и один сегмент данных, при этом все ссылки в сегментах программного кода по умолчанию считаются дальними (far), а ссылки в сегменте данных — ближними (near).
Модель compact поддерживает несколько сегментов данных, в которых используется дальняя адресация данных (far), и один сегмент кода с ближней адресацией (near).
Модель large поддерживает несколько сегментов кода и несколько сегментов данных. По умолчанию все ссылки на код и данные считаются дальними (far).
Модель huge практически эквивалентна модели памяти large.
Желательно указывать тот тип процессора, который используется в машине, хотя это не является обязательным требованием. Операционная система автоматически инициализирует сегментные регистры при загрузке программы, поэтому модифицировать их нужно только в случае если требуется смешивать в одной программе 16-разрядный и 32-разрядный код. Адресация данных и кода является ближней ( near ), при этом все адреса и указатели являются 32-разрядными.
Параметр модификатор используется для определения типов сегментов и может принимать значения use16 (сегменты выбранной модели используются как 16-битные) или use32 (сегменты выбранной модели используются как 32-битные).
Параметр СоглашениеОВызовах используется для определения способа передачи параметров при вызове процедуры из других языков, в том числе и языков высокого уровня (C++, Pascal). Параметр может принимать следующие значения:
При разработке модулей на ассемблере, которые будут применяться в программах, написанных на языках высокого уровня, обращайте внимание на то, какие соглашения о вызовах поддерживает тот или иной язык. Используются при анализе интерфейса программ на ассемблере с программами на языках высокого уровня.




