Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/125: Рейтинг темы: голосов - 125, средняя оценка - 4.99
1 / 1 / 0
Регистрация: 09.12.2012
Сообщений: 8
1

Разница между использованием model small и segment/assume

31.03.2013, 21:23. Показов 24393. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите,пожалуйста,в чем принципиальная разница между использованием упрощенных директив сегментации(.code, .stack, .data) и между использованием стандартных директив(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
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2013, 21:23
Ответы с готовыми решениями:

Из model small в model tiny
Доброго времени суток . Помогите переделать программу из model small в tiny при помощи функций 3Fh...

Error A2118: cannot have segment address references with TINY model
Помогите компилировать программу! Сообщение компилятора AAVmja.asm(9) : error A2118: cannot have...

Разница между датами с использованием массива
Разница между датами с использованием массива. Нужно подсчитать сколько дней осталось к экзамену,...

Разница между использованием this и аргумента в обработке события
Всем привет!Ребят немного не понимаю разницу... Есть 2 разметки в первой я пишу обработчик события...

8
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
01.04.2013, 06:09 2
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

dosha1302,
Для простых программ, содержащих по одному сегменту для кода, данных и стека, хотелось бы упростить ее описание. Для этого в трансляторы MASM и TASM ввели возможность использования упрощенных директив сегментации. Но здесь возникла проблема, связанная с тем, что необходимо было как-то компенсировать невозможность напрямую управлять размещением и комбинированием сегментов. Для этого совместно с упрощенными директивами сегментации стали использовать директиву указания модели памяти MODEL, которая частично стала управлять размещением сегментов и выполнять функции директивы ASSUME (поэтому при использовании упрощенных директив сегментации директиву ASSUME можно не использовать). Эта директива связывает сегменты, которые в случае использования упрощенных директив сегментации имеют предопределенные имена, с сегментными регистрами (хотя явно инициализировать ds или es все равно придется).
Обязательным параметром директивы MODEL является модель памяти. Этот параметр определяет модель сегментации памяти для программного модуля. Предполагается, что программный модуль может иметь только определенные типы сегментов, которые определяются упрощенными директивами описания сегментов
Формат директивыНазначение
.CODE [имя]Начало или продолжение сегмента кода
.DATAНачало или продолжение сегмента инициализированных данных. Также используется для определения данных типа near
.CONSTНачало или продолжение сегмента постоянных данных (констант) модуля
.DATA?Начало или продолжение сегмента неинициализированных данных. Также используется для определения данных типа near
.STACK [размер] Начало или продолжение сегмента стека модуля. Параметр [размер] задает размер стека
.FARDATA [имя] Начало или продолжение сегмента инициализированных данных типа far
.FARDATA? [имя] Начало или продолжение сегмента неинициализированных данных типа far
Наличие в некоторых директивах параметра [имя] говорит о том, что возможно определение нескольких сегментов этого типа. С другой стороны, наличие нескольких видов сегментов данных обусловлено требованием обеспечить совместимость с некоторыми компиляторами языков высокого уровня, которые создают разные сегменты данных для инициализированных и неинициализированных данных, а также констант.
При использовании директивы MODEL транслятор делает доступными несколько идентификаторов, к которым можно обращаться во время работы программы, с тем, чтобы получить информацию о тех или иных характеристиках данной модели памяти.
Имя идентификатора Значение переменной
@code Физический адрес сегмента кода
@data Физический адрес сегмента данных типа near
@fardata Физический адрес сегмента данных типа far
@fardata? Физический адрес сегмента неинициализированных данных типа far
@curseg Физический адрес сегмента неинициализированных данных типа far
@stack Физический адрес сегмента стека
Операнды директивы MODEL используют для задания модели памяти, которая определяет набор сегментов программы, размеры сегментов данных и кода, способ связывания сегментов и сегментных регистров.
МодельТип кодаТип данныхНазначение модели
TINYnearnearКод, данные и стек объединены в одну группу с именем DGROUP и размером до 64 Кб. Используется для создания программ формата .com. Некоторые языки эту модель не поддерживают. СS=DS=SS=DGROUP
SMALLnearnearКод занимает один сегмент, данные и стек объединены в одну группу с именем DGROUP (хотя для описания могут использоваться разные сегменты). Эту модель обычно используют для большинства программ на ассемблере. CS=_text DS=SS=DGROUP
MEDIUMfar nearКод занимает несколько сегментов, по одному на каждый объединяемый программный модуль. Все ссылки на передачу управления — типа far (вызов подпрограмм). Данные и стек объединены в одной группе DGROUP; все ссылки на них — типа near (для доступа к данным используется только смещение). CS=<модуль>_text DS=SS=DGROUP
COMPACTnearfarКод находится в одном сегменте, данные и стек в группе DGROUP и могут занимать несколько сегментов, так что для обращения к данным требуется указывать сегмент и смещение (ссылка на данные — типа far). CS=_text DS=SS=DGROUP
LARGEfarfarКод может занимать несколько сегментов, по одному на каждый объединяемый программный модуль. Стек и данные находятся в группе DGROUP. Для ссылки на данные используются дальние указатели -far. CS=<модуль>_text DS=SS=DGROUP
HUGEfarfarТоже что и модель LARGE, что касается TurboAssebmler.
FLATfarfarТоже, что и TINY, но используются 32-битная адресация, так что максимальный размер сегмента, содержащего и данные, и код, и стек - 4 Гб.
Параметр модификатор директивы MODEL позволяет уточнить некоторые особенности использования выбранной модели памяти
Значение модификатораНазначение
use16 Сегменты выбранной модели используются как 16-битные (если соответствующей директивой указан процессор i80386 или i80486)
use32 Сегменты выбранной модели используются как 32-битные (если соответствующей директивой указан процессор i80386 или i80486)
dosПрограмма будет работать в MS-DOS
Необязательные параметры язык и модификатор языка определяют некоторые особенности вызова процедур. Необходимость в использовании этих параметров появляется при написании и связывании программ на различных языках программирования.
Язык — необязательный операнд, принимающий значения C, PASCAL, BASIC, FORTRAN, SYSCALL и STDCALL. Если он указан, подразумевается, что процедуры рассчитаны на вызов из программ на соответствующем языке высокого уровня, следовательно, если указан язык C, все имена ассемблерных процедур, объявленных как PUBLIC, будут изменены так, чтобы начинаться с символа подчеркивания, как это принято в C.
Модификатор — необязательный операнд, принимающий значения NEARSTACK (по умолчанию) или FARSTACK. Во втором случае сегмент стека не будет объединяться в одну группу с сегментами данных.
стандартные и упрощенные директивы сегментации не исключают друг друга. Стандартные директивы используются, когда программист желает получить полный контроль над размещением сегментов в памяти и их комбинированием с сегментами других модулей.
Упрощенные директивы целесообразно использовать для простых программ и программ, предназначенных для связывания с программными модулями, написанными на языках высокого уровня. Это позволяет компоновщику эффективно связывать модули разных языков за счет стандартизации связей и управления.
После того как модель памяти установлена, вступают в силу упрощенные директивы определения сегментов, объединяющие действия директив SEGMENT и ASSUME. Кроме того, сегменты, объявленные упрощенными директивами, не требуется закрывать директивой ENDS — они закрываются автоматически, как только ассемблер обнаруживает новую директиву определения сегмента или конец программы.
Директива .CODE описывает основной сегмент кода

.code имя_сегмента

эквивалентно:

_TEXT segment word public ’CODE’

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

name_TEXT segment word public ’CODE’

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

Директива .STACK описывает сегмент стека
.stack размерSTACK segment para public ’stack’
Необязательный параметр указывает размер стека. По умолчанию он равен 1 Кб.

Директива .DATA описывает обычный сегмент данных
.data_DATA segment word public ’DATA’
Директива .DATA? описывает сегмент неинициализированных данных
.data?_BSS segment word public ’BSS’
Этот сегмент обычно не включается в программу, а располагается за концом памяти, так что все описанные в нем переменные на момент загрузки программы имеют неопределенные значения.
Директива .CONST описывает сегмент неизменяемых данных
.constCONST segment word public ’CONST’
В некоторых операционных системах этот сегмент будет загружен так, что попытка записи в него может привести к ошибке.

Директива .FARDATA описывает сегмент дальних данных
.fardata имя_сегментаимя_сегмента segment para private ’FAR_DATA’
Доступ к данным, описанным в этом сегменте, потребует загрузки сегментного регистра. Если не указан операнд, в качестве имени сегмента используется FAR_DATA.

Директива .FARDATA? описывает сегмент дальних неинициализированных данных

.fardata? имя_сегмента

эквивалентно:

имя_сегмента 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.
Порядок загрузки сегментов

При использовании стандартных директив сегментации сегменты загружаются в память в том порядке, в котором они описываются в тексте программы.
При использовании упрощенных директив сегментации (по умолчанию) устанавливается порядок загрузки сегментов, существующий в MS DOS и часто требуемый для взаимодействия программ на ассемблере с программами на языках высокого уровня.
Порядок загрузки сегментов:
  1. Все сегменты класса 'CODE'.
  2. Все сегменты, не принадлежащие группе DGROUP и классу 'CODE'.
  3. Группа сегментов DGROUP:
    1. Все сегменты класса 'BEGDATA'.
    2. Все сегменты, кроме классов 'BEGDATA', 'BSS' и 'STACK'.
    3. Все сегменты класса 'BSS'.
    4. Все сегменты класса 'STACK'.
Знание порядка загрузки сегментов необходимо, например, для вычисления длины программы или адреса ее конца. Для этого надо знать, какой сегмент будет загружен последним, и смещение последнего байта в нем.

P.S. В книге Зубкова, порядок загрузки сегментов описан несколько иначе, НО практика показала, что его описание не правильное. При использовании упрощенных директив сегментации, директива .seq, которая, по идее должна устанавливать порядок загрузки сегментов, как они описаны в программе, этого не делает! А делает это директива .alpha, и то, только при использовании TASM, только в модели small, и при этом она добавляет заголовок в exe файл длиной 600h байт! MASM же, при использовании упрощенных директив сегментации всегда размещает сегменты в соответствии с порядком MS DOS, забивая на директивы .seq и .alpha. И еще с выравниванием сегментов, при использовании упрощенных директив сегментации, происходит какая-то свистопляска . Все это выявлено опытным путем.
4
1 / 1 / 0
Регистрация: 09.12.2012
Сообщений: 8
01.04.2013, 22:00  [ТС] 3
Спасибо,что обратили внимание на мой вопрос,но к сожалению,данную информацию,я и сама нашла.Меня интересует ни что такое modell smoll и assume и все остальные директивы,а как распределяется память под сегменты,а точнее в чем разница в разделении памяти при использовании двух видов сегментации,для этого я и приложила карты памяти двух разных случаев!
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
01.04.2013, 23:31 4
Примеры неравнозначные. В первом вы транслируете один модуль LABA112.ASM, во втором - два: LABA11.ASM и LABA12.ASM. Естественно, что линкер, увидев во втором модуле директиву CCODE SEGMENT PARA PUBLIC 'CODE' USE16 выровнял код на границу параграфа, что увеличило его размер на 10. байт.
1
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
02.04.2013, 12:59 5
Цитата Сообщение от dosha1302 Посмотреть сообщение
Подскажите,пожалуйста,в чем принципиальная разница между использованием упрощенных директив сегментации и между использованием стандартных директив
Цитата Сообщение от Mikl___ Посмотреть сообщение
стандартные и упрощенные директивы сегментации не исключают друг друга. Стандартные директивы используются, когда программист желает получить полный контроль над размещением сегментов в памяти и их комбинированием с сегментами других модулей.
Упрощенные директивы целесообразно использовать для простых программ и программ, предназначенных для связывания с программными модулями, написанными на языках высокого уровня. Это позволяет компоновщику эффективно связывать модули разных языков за счет стандартизации связей и управления.
Цитата Сообщение от dosha1302 Посмотреть сообщение
Меня интересует ни что такое modell smoll и assume и все остальные директивы,а как распределяется память под сегменты,а точнее в чем разница в разделении памяти при использовании двух видов сегментации,для этого я и приложила карты памяти двух разных случаев!
dosha1302,
вопрос достаточно серьезный, и в нем тебе придется разбираться самой, причем с разными компиляторами, так как даже МАSМ и ТАSМ по разному устанавливают порядок загрузки сегментов, а FАSМ и WАSМ по другому, в отличии от ТАSМ/МАSМ, "строят" заголовок ЕХЕ-файла
0
1 / 1 / 0
Регистрация: 09.12.2012
Сообщений: 8
02.04.2013, 16:38  [ТС] 6
Я во всех примерах транслирую 2 модуля,посмотрите внимательнее,у меня и в первом случае модули LABA112.asm и LABA122.asm.все идет для одного и того же кода.

Добавлено через 9 минут
у меня нет необходимости разбираться в разных трансляторах,мне достаточно разобраться в tasm, у нас ни такой прям серьезный уровень системного программирования.Мне просто необходимо сделать вывод о разнице в выделении памяти при раздельной трансляции, при использовании стандартных директив и упрощенных.Вот я затрудняюсь найти эту существенную разницу.И не понимаю почему при использовании упрощенных директив выделяется 2 сегмента данных(и для LABA112.asm и для LABA122.asm),а при использовании стандартных директив один сегмент данных(в laba11) хотя модуль LABA112.asm совпадает с модулем laba11.asm(ну только,что директивы разные используются) и модуль LABA122.asm совпадают с laba12
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
02.04.2013, 22:22 7
Цитата Сообщение от dosha1302 Посмотреть сообщение
тут использовала segment и assume
А как именно ты их использовала мы должны догадываться ?
Строчку-то с директивой segment можно было привести.
И не понимаю почему при использовании упрощенных директив выделяется 2 сегмента данных
В обоих случаях один сегмент данных.
Тут он один
00000H 000D9H 000DAH _TEXT CODE
000E0H 000FDH 0001EH _DATA DATA
00100H 00355H 00256H STACK STACK
и тут один
00000H 0001DH 0001EH CDATA DATA
00020H 00103H 000E4H CCODE CODE
00110H 0020FH 00100H CSTACK STACK

---------------------------------------------------------------------
Вот разница в выделении сегментов :
Тут сегмент данных объединен с сегментом стека :
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
А тут эти сегменты раздельно :
0000:0000 001E C=DATA S=CDATA G=(none) M=LABA11.ASM ACBP=68
...
0011:0000 0100 C=STACK S=CSTACK G=(none) M=LABA12.ASM ACBP=74
В каждой строчке первое число - это смещение начала сегмента от начала
образа в EXE-файле в параграфах. В первом случае у сегментов _DATA и
STACK это число одинаково 000E, а значит эти сегменты слились в один.

Добавлено через 19 минут
Директива assume никак на распределение сегментов не влияет.
А вот чтобы сегменты с разными именами сливались в один нужно
использовать директиву group.

Добавлено через 6 минут
Надо полагать, директива .model small порождает директиву
DGROUP GROUP _DATA,STACK
1
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
04.04.2013, 06:44 8
Цитата Сообщение от Ethereal Посмотреть сообщение
Надо полагать, директива .model small порождает директиву
DGROUP GROUP _DATA,STACK
Если внимательно посмотреть на сообщение #2 и там на таблицу #3 то можно заметить
МодельТип кодаТип данных Назначение модели
SMALLnear nearКод занимает один сегмент, данные и стек объединены в одну группу с именем DGROUP (хотя для описания могут использоваться разные сегменты). Эту модель обычно используют для большинства программ на ассемблере. CS=_text DS=SS=DGROUP
2
1 / 1 / 0
Регистрация: 09.12.2012
Сообщений: 8
04.04.2013, 15:14  [ТС] 9
Всем спасибо,очень помогли!Я разобралась и сдала наконец-то эту лабораторную работу!
0
04.04.2013, 15:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2013, 15:14
Помогаю со студенческими работами здесь

Есть ли разница между обычным выводом через echo и выводом с использованием HEREDOC-синтаксиса?
Есть ли разницы между двумя многострочными выводами ? первый записывается как строка, второй код...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru