2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4  След.
 
 Re: Hello world
Сообщение15.06.2013, 13:55 
Заслуженный участник
Аватара пользователя


03/08/11
1613
Новосибирск
Тогогда я вообще ничего ее понимаю. MOV ax,@data. чт делает? Он передает в ах начало сегмента ДАННЫ. A PSP после этого где Будет находиться? Это все происходит наш физическом уровень? Унас жертва только 2 сегмента, доступные программа.

 Профиль  
                  
 
 Re: Hello world
Сообщение15.06.2013, 14:31 
Заслуженный участник


29/04/12
268
xmaister в сообщении #736967 писал(а):
Он передает в ах начало сегмента ДАННЫ.

Да.
xmaister в сообщении #736967 писал(а):
A PSP после этого где Будет находиться?

Если COM, то cs:0, а если EXE, то ds:0, где ds -- то, что было на момент запуска программы. Командой
xmaister в сообщении #736967 писал(а):
mov ds,ax

вы это значение перезаписываете. Если вам нужен PSP, то можете сохранить куда-нибудь начальное значение ds. Но можно не сохранять: DOS предоставляет какой-то системный вызов (гуглите), возвращающий адрес сегмента с PSP.

xmaister в сообщении #736967 писал(а):
Это все происходит наш физическом уровень? Унас жертва только 2 сегмента, доступные программа.

Не распарсила... Программа может обратится куда угодно, в любое место памяти. Она не ограничена двумя сегментами. Значение, записываемые в сегментные регистры, со стороны процессора и системы никак не ограничиваются. Сегменты могут перекрываться. Фактически, сегменты нужны для того, чтобы можно было работать с памятью, большей 64 кб (16-битный регистр больше адресовать не может, FFFF = 64 кб). За счёт сегментного регистра получаем дополнительные биты, точнее адрес $a:b$ означает $a\cdot 2^4+b$.

(Замечание)

На совсем древних x86-процессорах использовалась 20-битная адресная шина, так что $a\cdot 2^4+b$ бралось по модулю $2^{20}$. Но уже в 286 разрядность адресной шины увеличилась так, что переполнения не стало. Так что максимально адресуемый адрес в реальном режиме -- это $\mathrm{FFFF}_{16}:\mathrm{FFFF}_{16}=(2^{16}-1)\cdot 2^4+(2^{16}-1)$.

 Профиль  
                  
 
 Re: Hello world
Сообщение16.06.2013, 10:19 
Заслуженный участник
Аватара пользователя


03/08/11
1613
Новосибирск
Как показывает дебуггер, после перезаписи значения в ds оно отправляется в es, соответсвенно PSP лежит по es:0000. Значит был выделен отдельный сегмент под data, так?

(про память)

Физическая память- набор байтов. Разбиение на сегменты- формальная вещь или она как-то в самой памяти отражается? Просто если реальный режим не запрещает перекрытие сегментов, то получается мы можем объявить начало сегмента и его конец где хотим, главное чтобы он больше 64 кб не был. И еще: где лежат адреса инициализированных байтов и границы сегментов?

 Профиль  
                  
 
 Re: Hello world
Сообщение16.06.2013, 10:48 
Заслуженный участник


29/04/12
268
xmaister в сообщении #737203 писал(а):
Как показывает дебуггер, после перезаписи значения в ds оно отправляется в es

Кто "оно"?
xmaister в сообщении #737203 писал(а):
соответсвенно PSP лежит по es:0000

ЕМНИП, ds = es на момент запуска программы.
xmaister в сообщении #737203 писал(а):
Значит был выделен отдельный сегмент под data, так?

Что значит "выделен"? Данные уже были в памяти на момент запуска программы, вы просто установили ds на соответствующий сегмент.
xmaister в сообщении #737203 писал(а):
Разбиение на сегменты- формальная вещь или она как-то в самой памяти отражается?

Формальная.
xmaister в сообщении #737203 писал(а):
мы можем объявить начало сегмента и его конец где хотим, главное чтобы он больше 64 кб не был.

Конец -- не где хотим. Размер сегмента фиксирован: $2^{16}$.
xmaister в сообщении #737203 писал(а):
И еще: где лежат адреса инициализированных байтов и границы сегментов?

Адрес начала сегмента хранится в каком-нибудь сегментном регистре. Регистр cs всегда должен указывать на тот сегмент, где код (то есть следующая инструкция находится по адресу cs:ip). Регистр ss указывает на сегмент стека (то есть вершина стека -- это ss:sp). Остальные регистры можно использовать свободно, но они имеют предпочтительные назначения. Например, ds обычно используется как адрес сегмента с данными; в частности, тот системный вызов, которым вы печатали строку, берёт строку с адреса ds:dx.

 Профиль  
                  
 
 Re: Hello world
Сообщение16.06.2013, 12:23 
Заслуженный участник
Аватара пользователя


03/08/11
1613
Новосибирск
lena7 в сообщении #737211 писал(а):
Кто "оно"?

Значение в ds.
lena7 в сообщении #737211 писал(а):
Данные уже были в памяти на момент запуска программы, вы просто установили ds на соответствующий сегмент.

Сразу после запуска в начале сегмента данных (ds:0000) загружено PSP. Никакого сегмента который начинается с непосредственно данных у нас нет (по крайней мере я не создавал), поэтому разве не происходит переопределение сегмента данных началом которого становится те данные которые указаны в коде?

 Профиль  
                  
 
 Re: Hello world
Сообщение16.06.2013, 12:50 
Заслуженный участник


29/04/12
268
Мы это уже проходили. На момент запуска ds = es = сегмент с PSP. Строка msg у вас находится где-то в памяти, пусть это адрес X. Вообще, всё, что вы в исходном коде положили в .data будет там (модель small). Командами mov ax,@data и mov ds,ax вы записываете в ds адрес X. Регистр es вы не трогаете, он так и продолжает указывать на PSP.

 Профиль  
                  
 
 Re: Hello world
Сообщение16.06.2013, 13:06 
Заслуженный участник
Аватара пользователя


03/08/11
1613
Новосибирск
lena7 в сообщении #737254 писал(а):
Командами mov ax,@data и mov ds,ax вы записываете в ds адрес X.

Адрес строки сразу после запуска ds=0869, адрес X=0869:0120. Почему @data=087B?
Изображение

 Профиль  
                  
 
 Re: Hello world
Сообщение16.06.2013, 13:23 
Заслуженный участник


29/04/12
268
0869:0120 = 087B:0000

См. формулу выше.

 Профиль  
                  
 
 Re: Hello world
Сообщение16.06.2013, 14:35 
Заслуженный участник


09/09/10
3729
xmaister в сообщении #737203 писал(а):
Разбиение на сегменты- формальная вещь или она как-то в самой памяти отражается?

Вопрос из разряда "правда ли между байтами в памяти есть пробелы, или это просто отладчик так показывает?"

xmaister в сообщении #737203 писал(а):
И еще: где лежат адреса инициализированных байтов и границы сегментов?

Нигде. 8086 в реальном режиме — очень тупая штука. Вы еще спросите, где машина Тьюринга отслеживает клеточки на ленте с начальными данными. Да нигде. Сегмент — это сплошной кусок памяти размером в 64 К, начинающийся с адреса, кратного 16.

(Оффтоп)

1024 байта — это 1 К. 1024 К — это 1 М. Впрочем, такую терминологию я видел в старом справочнике о машинах ЕС ЭВМ, так что не утверждаю, что это соглашение еще живет.

 Профиль  
                  
 
 Re: Hello world
Сообщение16.06.2013, 16:11 
Аватара пользователя


31/10/08
1244

(Оффтоп)

Цитата:
1024 байта — это 1 К. 1024 К — это 1 М. Впрочем, такую терминологию я видел в старом справочнике о машинах ЕС ЭВМ, так что не утверждаю, что это соглашение еще живет.

Слово "байт" потеряли. Не вы, а издатели книги. Без него не понятно биты или байты или кролики, а однозначность нужна. По поводу устаревания, есть такое. Можно сказать целая священная война.
https://ru.wikipedia.org/wiki/Двоичные_приставки
Лично я придерживаюсь обозначения 1 КБайт=1024 Байта.

 Профиль  
                  
 
 Re: Hello world
Сообщение16.06.2013, 16:48 
Заслуженный участник


09/09/10
3729

(Оффтоп)

Pavia в сообщении #737333 писал(а):
Слово "байт" потеряли. Не вы, а издатели книги.

1024 байта — один ка. Не кило, а ка. А 1024 ка — это один эм. Не мега, а эм. Соответственно, дальше можно ввести гэ и тэ. А раз пачками по 1024 меряют лишь байты и пачки 1024, то...

Но опять же, в английском "K" довольно устойчиво означает тысячу.

 Профиль  
                  
 
 Re: Hello world
Сообщение16.06.2013, 18:59 
Заслуженный участник
Аватара пользователя


03/08/11
1613
Новосибирск
Модель памяти, которую мы указываем- это способ организации памяти только внутри данного приложения?
Joker_vD в сообщении #737306 писал(а):
Нигде.

Запутался :facepalm:. У меня есть приложение с моделью памяти small. Есть толпа инициализированных байт, которые были еще до запуска приложения и мне в нем нужно получить доступ к байту xxxx:yyyy. Как это сделать, если никто не знает где байт с адресом xxxx:yyyy? Или байт при инициализации сперва получает какой-то неведомый адрес на физическом уровне а потом уже мы получаем его логический адрес?

 Профиль  
                  
 
 Re: Hello world
Сообщение16.06.2013, 19:25 
Заслуженный участник


29/04/12
268
xmaister в сообщении #737373 писал(а):
Модель памяти, которую мы указываем- это способ организации памяти только внутри данного приложения?

Да.

Вторую часть вашего сообщения я не распарсила... Если вам нужно обратится по адресу xxxx:yyyy, то обращайтесь -- я разрешаю!

 Профиль  
                  
 
 Re: Hello world
Сообщение16.06.2013, 19:46 
Заслуженный участник
Аватара пользователя


03/08/11
1613
Новосибирск
Окей, у нас есть организация памяти внутри приложения, но есть же еще и другая инициализированная память, которая к приложению не относится. Мы же даже не знаем как она органзивано не говоря уже об адресах, как к ней обращаться?

 Профиль  
                  
 
 Re: Hello world
Сообщение16.06.2013, 20:09 
Заслуженный участник


29/04/12
268
xmaister в сообщении #737389 писал(а):
как к ней обращаться?

Зачем?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 49 ]  На страницу Пред.  1, 2, 3, 4  След.

Модераторы: maxal, Toucan, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group