|
|
| Посл.отвђт | Сообщен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 |