Model small ассемблер что это
Перейти к содержимому

Model small ассемблер что это

Модели памяти и упрощенные директивы определения сегментов

SMALL – код размещается в одном сегменте, а данные и стек – в другом (для их описания могут применяться разные сегменты, но объединенные в одну группу). Эту модель памяти также удобно использовать для создания программ на ассемблере;

COMPACT – код размещается в одном сегменте, а для хранения данных могут использоваться несколько сегментов, так что для обращения к данным требуется указывать сегмент и смещение (данные дальнего типа);

MEDIUM – код размещается в нескольких сегментах, а все данные – в одном, поэтому для доступа к данным используется только смещение, а вызовы подпрограмм применяют команды дальнего вызова процедуры;

LARGE и HUGE – и код, и данные могут занимать несколько сегментов;

FLAT – то же, что и TINY, но используются 32-битные сегменты, так что максимальный размер сегмента, содержащего и данные, и код, и стек, – 4 Мб.

Язык – необязательный операнд, принимающий значения C, PASCAL, BASIC, FORTRAN, SYSCALL и STDCALL. Если он указан, подразумевается, что процедуры рассчитаны на вызов из программ на соответствующем языке высокого уровня, следовательно, если указан язык C, все имена ассемблерных процедур, объявленных как PUBLIC, будут изменены так, чтобы начинаться с символа подчеркивания, как это принято в C.

Модификатор – необязательный операнд, принимающий значения NEARSTACK (по умолчанию) или FARSTACK. Во втором случае сегмент стека не будет объединяться в одну группу с сегментами данных.

После того как модель памяти установлена, вступают в силу упрощенные директивы определения сегментов, объединяющие действия директив SEGMENT и ASSUME. Кроме того, сегменты, объявленные упрощенными директивами, не требуется закрывать директивой ENDS – они закрываются автоматически, как только ассемблер обнаруживает новую директиву определения сегмента или конец программы.

Директива .CODE описывает основной сегмент кода

_TEXT segment word public ’CODE’

для моделей TINY, SMALL и COMPACT и

name_TEXT segment word public ’CODE’

для моделей MEDIUM, HUGE и LARGE (name – имя модуля, в котором описан данный сегмент). В этих моделях директива .CODE также допускает необязательный операнд – имя определяемого сегмента, но все сегменты кода, описанные так в одном и том же модуле, объединяются в один сегмент с именем NAME_TEXT.

Директива .STACK описывает сегмент стека и эквивалентна директиве

STACK segment para public ’stack’

Необязательный параметр указывает размер стека. По умолчанию он равен 1 Кб.

Описывает обычный сегмент данных и соответствует директиве

_DATA segment word public ’DATA’

Описывает сегмент неинициализированных данных:

_BSS segment word public ’BSS’

Этот сегмент обычно не включается в программу, а располагается за концом памяти, так что все описанные в нём переменные на момент загрузки программы имеют неопределённые значения.

Описывает сегмент неизменяемых данных:

CONST segment word public ’CONST’

В некоторых операционных системах этот сегмент будет загружен так, что попытка записи в него может привести к ошибке.

Сегмент дальних данных:

имя_сегмента segment para private ’FAR_DATA’

Доступ к данным, описанным в этом сегменте, потребует загрузки сегментного регистра. Если не указан операнд, в качестве имени сегмента используется FAR_DATA.

Сегмент дальних неинициализированных данных:

имя_сегмента segment para private ’FAR_BSS’

Как и в случае с FARDATA, доступ к данным из этого сегмента потребует загрузки сегментного регистра. Если имя сегмента не указано, используется FAR_BSS.

Во всех моделях памяти сегменты, представленные директивами .DATA, .DATA?, .CONST, .FARDATA и .FARDATA?, а также сегмент, описанный директивой .STACK, если не был указан модификатор FARSTACK, и сегмент .CODE в модели TINY автоматически объединяются в группу с именем FLAT – для модели памяти FLAT или DGROUP – для всех остальных моделей. При этом сегментный регистр DS (и SS, если не было FARSTACK, и CS в модели TINY) настраивается на всю эту группу, как если бы была выполнена команда ASSUME.

Программисты, знающие ассемблер, помогите.

Подпишите пожалуйста к каждой строчке, что она означает.

.model small
.data
A dw 2438h
B dw 1325h
R1 dw ?
R2 dw ?

.code
start:
mov ax,@data
mov ds,ax
;1. Переставить 1-ю и 3-ю тетрады в слове А
mov ax,A
mov dx,ax
and ax,0F0Fh
mov cl,8
ror dx,cl
and dx,0F0F0h
or ax,dx
mov R1,ax
;2. Сложить А и В в двоично-десятичном виде
mov al,byte ptr A
add al,byte ptr B
daa
mov byte ptr R2,al
mov al,byte ptr A+1
adc al,byte ptr B+1
daa
mov byte ptr R2+1,al

mov ax,4C00h
int 21h
end start
code ends

.model small; — директива что у нас будет .com файл ( не больше 64Кб)
.data ; — начало сегмента данных
A dw 2438h ; — присваиваем переменной А размером двойной слово (4байта) значение 2438 в 16-ричной системе
B dw 1325h; — присваиваем переменной B размером двойной слово (4байта) 1325 в 16-ричной системе
R1 dw ? ;Оставляем место в 4 байта для переменной R1
R2 dw ?; Оставляем место в 4 байта для переменной R2

.code ; сегмент кода — исполнения
start:
mov ax,@data ; в сегмент ах заносим начало памяти, выделенную под сегмент данных.
mov ds,ax ; из ах в дс переносим, таким образом настроили дс на работу
с данными
;1. Переставить 1-ю и 3-ю тетрады в слове А
mov ax,A ;переменную А в ах ах=2438h
mov dx,ax ; из ах в дх=2438
and ax,0F0Fh ; «and» обнуляет 1й и 3й байт (считать от нуля)
mov cl,8 ; в кл регистр заносим 8
ror dx,cl ; делаем сдвиг на байт вправо дх теперь=4080
and dx,0F0F0h
or ax,dx
mov R1,ax
;2. Сложить А и В в двоично-десятичном виде
mov al,byte ptr A
add al,byte ptr B
daa
mov byte ptr R2,al
mov al,byte ptr A+1
adc al,byte ptr B+1
daa
mov byte ptr R2+1,al

mov ax,4C00h
int 21h
end start
code ends
НЕ НУ РЕАЛЬНО МНОГО КОДА, ЧТОБЫ ОПИСЫВАТЬ. а ВЕДЬ ВСЕ ЭЛЕМЕНТАРНО! ДАВАЙ ДАЛЬШЕ САМ. ЧЕМ БОЛЬШЕ НЕУЧЕЙ СРЕДИ ПРОГРАММИСТОВ, ТЕМ ЦЕННЕЕ НОРМАЛЬНЫЕ)))

Что означает.model small в 8086 программах?

Я новичок в ассемблере 8086 года. Я могу понять логику, используемую в программе, и написать небольшие программы. Но я просто хочу знать, что это делает:

Что такое объяснение для.model small?

Я использую masm .

С .model tiny вы получаете программу, где CS , DS и SS все указывают на одну и ту же 64 КБ памяти. Стек размещается в самой высокой области этого сегмента в 64 КБ.

С .model small вы получаете программу, где CS указывает на собственный сегмент, за которым следует сегмент, на который указывают DS и SS . Стек размещается в самой высокой области сегмента SS .

Директива .stack 300h сообщает MASM размер стека, поэтому MASM может предупредить вас, когда остальная часть программы (данные, bss, куча) столкнутся со стеком.

В обеих этих моделях весь доступ к элементам данных выполняется с использованием ближайших указателей.

Из-за того, что 8086 является 16-разрядной архитектурой, у нее возникают трудности с доступом к памяти более 64 КБ.

Наиболее эффективным способом использования указателей является использование выделенных 16-битных регистров (например, bx ). Однако, когда ваша программа хочет получить доступ к более чем 64 КБ, она также должна использовать сегментные регистры (например, es ). Чтобы разрешить оба способа адресации, были изобретены модели памяти.

Таким образом, директива .model small сообщает ассемблеру, что вы намерены использовать небольшую модель памяти – один сегмент кода, один сегмент данных и один сегмент стека, а значения сегментных регистров никогда не меняются.

Он имеет следующие эффекты:

Вы можете записать инструкцию retn (возврат из near подпрограммы) в качестве ret . Поскольку ассемблер знает, что весь ваш код находится в одном и том же сегменте, все ваши подпрограммы будут near (т.е. Имеют 16-разрядный адрес), а все команды ret означают retn .

Звучит глупо и незначительно? Читай дальше.

Если ваш код разбросаны по нескольким исходных файлов, вы будете иметь call инструкции, которые вызывают подпрограммы, ассемблер ничего не знаю о. Когда вы используете небольшую модель памяти, она знает, по крайней мере, что каждая подпрограмма имеет 16-разрядный адрес, и может использоваться код операции ближнего вызова.

Вы можете написать код, не объявляя свою модель памяти, но тогда вам придется call near а не просто call .

Если все ваши исходные файлы объявляют .model small , компоновщик возьмет все сегменты кода и попытается .model small их все с 64 КБ (то же самое для сегментов данных). Это может потерпеть неудачу, если материал слишком велик.

Малым программам сборки обычно не заботятся о модели памяти. Кодировка 64 КБ более чем достаточно для написания сложных программ, если только вы не используете большую внешнюю библиотеку. В этом случае .model small может означать, что “я не забочусь о том, что это модель памяти, просто используйте значение по умолчанию”.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *