· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› mov ax,@data

Посл.отвђт Сообщенiе


Дата: Июн 19, 2004 04:57:53

Всем доброго времени...
Проблема с пересылкой строк. Тов. Абель пишет: перед пересылкой надо DS и ES инициализировать адресом сегмента

данных. Как Это сделать - не написано. Взял пример с bsu.edu.ru:8801/resource/assembler/guide/Lesson/Lesson11/ по пересылке там :
assume ds:@data, es:@data
mov ax,@data ;загрузка сегментных регистров
mov ds,ax ;настройка регистров DS и ES
mov es,ax

но почему-то не работает: на строку mov ax,@data компилятор ругается: error A2004 : symbol type conflict
В поиске по <mov ax,@data> нашёл один топик, но никто на эту конструкцию не жаловался. В хэлпах masm'a error A2004 не

обозначена вообще. Подскажите пожалуйста, в чём тут дело?


Дата: Июн 19, 2004 09:03:56

Можно попробовать так:
.DOSSEG  ; -- At the very top of the file

...

mov ax, DGROUP
mov es, ax
mov ds, ax


Дата: Июн 19, 2004 12:01:34

К сожалению, ничего не дает. Может, с компиляторм у меня чего? И нет ли другого способа записать в ax адрес сегмента .data


Дата: Июн 19, 2004 12:35:07

Все команды для работы со строками считают, что строка-источник находятся по адресу DS:SI,
то есть в сегменте DS, со смещением SI, а строка-приемник по адресу ES:DI.

assume ds:@data, es:@data
вполне достаточно, у тебя строка-приемник и строка-источник находятся в одном сегменте

если у тебя 2 сегмента, то их нужно сначала явно объявить директивой segment

а только потом настраивать регистры.

mov ax, offset "сюда поставить имя сегмента"
mov es, ax

тогда директива assume не нужна

если у тебя один сегмент данных, объявленный директивой .data
то ds по умолчанию на него настроен,

так что запихать в ax адрес сегмента .data не получится!


Дата: Июн 19, 2004 16:09:48

reflector
Спасибо, сейчас начну разбираться со всем этим.


Дата: Июн 19, 2004 16:38:38

Что за компилятор то?
если у тебя один сегмент данных, объявленный директивой .data
то ds по умолчанию на него настроен,
так что запихать в ax адрес сегмента .data не получится!

Что такое "настроен" и почему это если что-то на что-то настроено то неполучится?
mov reg,ИмяСегмента
результируется с простое mov reg, константа.
или по формату опкода mov reg,imm16
Эта константа равна колличеству смещения в параграфах от загрузочных (програмных) данных с которого начинаются байты определённые в этом сегменте (под сегментом в данном случае имеется ввиду програмное определение в исходнике)
Во время загрузки к эти константы (байты в инструкции представляющие эти константы) меняются (так называются релокейшн) или "патчатся" другими равными константа+первый свободный сегмент (номер сегмента и есть колличество параграфов но уже от начала памяти). Таким образом свободный сегмент представляет сабой некую базу которая прибавляется к относительному сегменту в программе, когда она компилируется и определяются эти imm16 которые реально появляются при всяких mov ax,segname то считается что база равна 0 а при реальной загрузке она поправляется на реальное смещение в параграфах (или номер сегмента) первого свободного в памяти. Делает это загрузчик в DOS.
Что нужно поправлять (по каким адресам заменить слова на слова + свободный сегмент) он берёт из заголовка (так называемый relocation table там находится)
Как я понял речь идёт о досовской программе в данном случае.
В силу вышесказанного нет никаких проблем скомпилировать такую константу, поскольку известен и размер и сегмент.
Хоть один у тебя сегмент хоть 100 хоть data хоть какой.
Тут простая арифметика - типа сколько предыдущие сегменты сожрали в параграфах. Нисколько не сожрали - будет 0. Всё.


Дата: Июн 20, 2004 00:45:49

Да всё правильно, assume ds:@data, es:@data оказалось достаточно. Хотя раз в примере пишут mov ax,@data то хотелось бы чтобы всё-таки пример не вызывал ошибок :)
Спасибо всем.


Дата: Июн 22, 2004 18:37:53

cresta
Да всё правильно, assume ds:@data, es:@data оказалось достаточно
это у тебя com-файл, очевидно? Будешь писать ЕХЕшники - будет недостаточно. И тогда снова сюда вернешься с вопросами...

Для ЕХЕ-файлов придется писать mov ax,@data и масм, тасм должны все нормально сьесть...


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.116