1 / 1 / 0
Регистрация: 09.12.2012
Сообщений: 8
|
|
1 | |
Разница между использованием model small и segment/assume31.03.2013, 21:23. Показов 24393. Ответов 8
Метки нет (Все метки)
Подскажите,пожалуйста,в чем принципиальная разница между использованием упрощенных директив сегментации(.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
|
31.03.2013, 21:23 | |
Ответы с готовыми решениями:
8
Из model small в model tiny Error A2118: cannot have segment address references with TINY model Разница между датами с использованием массива Разница между использованием this и аргумента в обработке события |
Ушел с форума
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
01.04.2013, 06:09 | 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено ФедосеевПавел как решение
Решение
dosha1302,
Для простых программ, содержащих по одному сегменту для кода, данных и стека, хотелось бы упростить ее описание. Для этого в трансляторы MASM и TASM ввели возможность использования упрощенных директив сегментации. Но здесь возникла проблема, связанная с тем, что необходимо было как-то компенсировать невозможность напрямую управлять размещением и комбинированием сегментов. Для этого совместно с упрощенными директивами сегментации стали использовать директиву указания модели памяти MODEL, которая частично стала управлять размещением сегментов и выполнять функции директивы ASSUME (поэтому при использовании упрощенных директив сегментации директиву ASSUME можно не использовать). Эта директива связывает сегменты, которые в случае использования упрощенных директив сегментации имеют предопределенные имена, с сегментными регистрами (хотя явно инициализировать ds или es все равно придется). Обязательным параметром директивы MODEL является модель памяти. Этот параметр определяет модель сегментации памяти для программного модуля. Предполагается, что программный модуль может иметь только определенные типы сегментов, которые определяются упрощенными директивами описания сегментов
При использовании директивы MODEL транслятор делает доступными несколько идентификаторов, к которым можно обращаться во время работы программы, с тем, чтобы получить информацию о тех или иных характеристиках данной модели памяти.
Язык — необязательный операнд, принимающий значения 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 описывает сегмент стека
Директива .DATA описывает обычный сегмент данных
Директива .CONST описывает сегмент неизменяемых данных
Директива .FARDATA описывает сегмент дальних данных
Директива .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 и часто требуемый для взаимодействия программ на ассемблере с программами на языках высокого уровня. Порядок загрузки сегментов:
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
|
Ушел с форума
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
|
|
02.04.2013, 12:59 | 5 |
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 |
А как именно ты их использовала мы должны догадываться ?
Строчку-то с директивой segment можно было привести. Тут он один 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
|
Ушел с форума
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
|
|||||||||
04.04.2013, 06:44 | 8 | ||||||||
Если внимательно посмотреть на сообщение #2 и там на таблицу #3 то можно заметить
2
|
1 / 1 / 0
Регистрация: 09.12.2012
Сообщений: 8
|
|
04.04.2013, 15:14 [ТС] | 9 |
Всем спасибо,очень помогли!Я разобралась и сдала наконец-то эту лабораторную работу!
0
|
04.04.2013, 15:14 | |
04.04.2013, 15:14 | |
Помогаю со студенческими работами здесь
9
Есть ли разница между обычным выводом через echo и выводом с использованием HEREDOC-синтаксиса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |