2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3, 4  След.
 
 Re: Hello world
Сообщение15.06.2013, 13:55 
Аватара пользователя
Тогогда я вообще ничего ее понимаю. MOV ax,@data. чт делает? Он передает в ах начало сегмента ДАННЫ. A PSP после этого где Будет находиться? Это все происходит наш физическом уровень? Унас жертва только 2 сегмента, доступные программа.

 
 
 
 Re: Hello world
Сообщение15.06.2013, 14:31 
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 
Аватара пользователя
Как показывает дебуггер, после перезаписи значения в ds оно отправляется в es, соответсвенно PSP лежит по es:0000. Значит был выделен отдельный сегмент под data, так?

(про память)

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

 
 
 
 Re: Hello world
Сообщение16.06.2013, 10:48 
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 
Аватара пользователя
lena7 в сообщении #737211 писал(а):
Кто "оно"?

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

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

 
 
 
 Re: Hello world
Сообщение16.06.2013, 12:50 
Мы это уже проходили. На момент запуска 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 
Аватара пользователя
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 
0869:0120 = 087B:0000

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

 
 
 
 Re: Hello world
Сообщение16.06.2013, 14:35 
xmaister в сообщении #737203 писал(а):
Разбиение на сегменты- формальная вещь или она как-то в самой памяти отражается?

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

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

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

(Оффтоп)

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

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

(Оффтоп)

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

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

 
 
 
 Re: Hello world
Сообщение16.06.2013, 16:48 

(Оффтоп)

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

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

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

 
 
 
 Re: Hello world
Сообщение16.06.2013, 18:59 
Аватара пользователя
Модель памяти, которую мы указываем- это способ организации памяти только внутри данного приложения?
Joker_vD в сообщении #737306 писал(а):
Нигде.

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

 
 
 
 Re: Hello world
Сообщение16.06.2013, 19:25 
xmaister в сообщении #737373 писал(а):
Модель памяти, которую мы указываем- это способ организации памяти только внутри данного приложения?

Да.

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

 
 
 
 Re: Hello world
Сообщение16.06.2013, 19:46 
Аватара пользователя
Окей, у нас есть организация памяти внутри приложения, но есть же еще и другая инициализированная память, которая к приложению не относится. Мы же даже не знаем как она органзивано не говоря уже об адресах, как к ней обращаться?

 
 
 
 Re: Hello world
Сообщение16.06.2013, 20:09 
xmaister в сообщении #737389 писал(а):
как к ней обращаться?

Зачем?

 
 
 [ Сообщений: 49 ]  На страницу Пред.  1, 2, 3, 4  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group