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

Директива Assume

06.10.2019, 10:07. Показов 20200. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,господа. Никак не могу уяснить предназначение директивы ASSUME. Почитал Абеля, Шнайдера , некоторые статьи в интернете...Но у меня никак не откладывается в голове ЧТО и КАК она делает. Может кто скажет простым языком?. Или проследите за моей логикой и найдите в ней ошибку, например:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
;----сегмент данных
DATASG segment
  var1 db '*'
DATASG ends
 
;----сегмент кода
CODESG segment
org 100h
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG
 
START proc far
 push DS
 push AX
 mov AX,DATASG   ;
 mov DS,AX           ;инициализация регистра DS
 call MAIN
START endp
 
MAIN proc NEAR
...
...
MAIN endp
CODESG ends
end START
С помощью данной директивы мы указываем ассемблеру связать имя нашего сегмента DATASG с регистром DS..эмм...зачем?
Ведь мы же загружаем в DS адрес сегмента позже..

И когда мы обращаемся к памяти
Assembler
1
 mov ax,var1
Процессор берёт значение из DS:var1 который у нас инициализирован.

По моей логике нам достаточно оставить только одну строку, либо с директивой ASSUME, либо со строкой инициализации DS..
Зачем нам два раза указывать, что DS - это DATASG директивой, а потом ещё и строкой загрузки в DS адреса сегмента.
Это вызывает у меня путаницу...то же самое и с остальными сегментными регистрами CS,ES,SS

Спасибо большое за ваше внимание. Буду рад любым разъяснениям )
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2019, 10:07
Ответы с готовыми решениями:

ASSUME
Здравствуйте! Объясните, пожалуйста, для чего нужно писать такие строки mov ax,dseg mov ds,dseg...

Помогите разобраться с assume
Пытаюсь разобраться с assume, не могу понять почему (Строка 11) не компилируется, если (Строка...

Вопрос по использованию Assume
.386 Tabl1 struc namex db 4 dup (?) field1 dw 4 dup (?) Tabl1 ENDS ...

Разница между использованием model small и segment/assume
Подскажите,пожалуйста,в чем принципиальная разница между использованием упрощенных директив...

4
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
06.10.2019, 10:39 2
Цитата Сообщение от LAO_OAL Посмотреть сообщение
По моей логике нам достаточно оставить только одну строку, либо с директивой ASSUME, либо со строкой инициализации DS
Вы правильно мыслите.
В masm/tasm имеется также упрощённый синтаксис, где над этими моментами вообще задумываться не надо?
Assembler
1
2
3
4
5
6
7
8
9
.model small
.data
; тут какие-то переменные
.stack
100h
.code
.startup
; тут наш код, без инициализаций (кроме ES)
end
1
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
06.10.2019, 10:55 3
ASSUME - директива компилятора, присутствующая не во всех компиляторах ассемблера. Предназначена помочь компилятору брать точку отсчёта для инструкций со смещением к переменным. Это актуально при смене сегмента данных.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
data1 segment
  x db 78
  y dw 54
data1 ends
 
data2 segment
  z dw 65
  w dw 14
data2 ends
 
.........
assume ds:data1
  lea si, [x]
 
  push es
  mov ax, data2
  mov es, ax
assume es:data2
  lea di, es:[z]
  pop es
assume es:nothing
...............
0
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
06.10.2019, 16:28 4
LAO_OAL,
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
ASSUME - директива компилятора, присутствующая не во всех компиляторах ассемблера. Предназначена помочь компилятору брать точку отсчёта для инструкций со смещением к переменным. Это актуально при смене сегмента данных.
Вроде все правильно, но не полно.

Сперва Вам нужно понять как может быть организована программа, т.е. её модель:
  • TINY - код, данные и стек размещаются в одном и том же сегменте размером до 64 Кб. Эта модель памяти чаще всего используется при написании на ассемблере небольших программ;
  • SMALL - код размещается в одном сегменте, а данные и стек - в другрм (для их описания могут применяться разные сегменты, но объединенные в одну группу). Эту модель памяти также удобно использовать для создания программ на ассемблере;
  • COMPACT - код размещается в одном сегменте, а для хранения данных могут использоваться несколько сегментов, так что для обращения к данным требуется указывать сегмент и смещение (данные дальнего типа);
  • MEDIUM - код размещается в нескольких сегментах, а все данные - в одном, поэтому для доступа к данным используется только смещение, а вызовы подпрограмм применяют команды дальнего вызова процедуры;
  • LARGE и HUGE — и код, и данные могут занимать несколько сегментов;
  • FLAT - то же, что и TINY, но используются 32-битные сегменты, так что максимальный размер сегмента, содержащего и данные, и код, и стек, - 4 Мб.
Для Вас важно понять не название моделей, а количество сегментов, которые может быть использовано в программе, при разных моделях.

В своем коде Вы используете сокращенную форму описания сегмента. Есть ещё и полная форма:
имя_сегмента segment readonly выравн. тип разряд 'класс'
  • имя_сегмента -имя оно и есть имя;
  • segment - директива компилятора;
  • readonly - только MASM её понимает, остальным безразлично;
  • выравн. - определяет, с какого адреса будет начинатся сегмент, по умолчанию PARA(адрес кратный 16-ти)
  • тип 5-ть параметров(PUBLIC, STACK, COMMON, AT, PRIVATE - (сами почитаете);
  • разряд - 16-ть или 32-а бита:
  • 'класс' - компилятор формирует сегменты одного класса в один, главное, чтобы суммарный размер не превышал 64-е Kb, сперва формируется все сегменты "CODE', все не 'DGROUP', потом все 'DGROUP' и последним замыкает 'STACK'.

Так вот, ASSUME - указывает компилятору, что на момент выполнения программы(или в нужной точке, т.к. директива может применятся несколько раз) сегментные регистры cs,ds.es.ss - будут иметь значения их реального разпожения в памяти и смещения в сегменте нужно будет считать относительно их во время компиляции. Реальные зачения будут записаны загрузчиком программы по адресам, которые есть в таблице настройки(начнете учить MZ-заголовок и Вы на таблицу настройки "наступите").
1
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.05.2021, 11:30 5
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

LAO_OAL,
максимально разжёвано
Разница между использованием model small и segment/assume
3
20.05.2021, 11:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2021, 11:30
Помогаю со студенческими работами здесь

Директива IRPC
Здравствуйте! Необходимо обработать строку символов с помощью макродирективы IRPC, но она...

Директива Pentium 4
Доброго времени суток! Подскажите пожалуйста какая директива лучше всего подходит для Pentium 4....

Как правильно использовать "assume" в ml64.exe?
Как правильно использовать "assume" в ml64.exe? Если в 32-битной версии я объявлял так: (assume...

директива local и команда enter
при трансляции текста программы, в случае обнаружения директивы local, ml64 подменяет ее командой...


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

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