|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
18.08.2010, 21:53 | #1 | |
Участник клуба
Регистрация: 13.01.2009
Сообщений: 1,353
|
Регистры и смещение.
Подумал, что этой теме самое место в этом разделе. Изучая Дельфи, я понял, что ничего путного из этого не получу, так как не знаю элементарной организации памяти и архитектуры компьютера... Начал изучать, тут же наткнулся на учебное пособие по ассемблеру, где описывается все низкоуровневое программирование и разбирается устройство компьютера... И вот не могу понять хоть убейте меня!
Цитата:
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
|
|
18.08.2010, 22:01 | #2 | |
Участник клуба
Регистрация: 13.01.2009
Сообщений: 1,353
|
Вот я понял про регистры, которые адресуют 4 сегмента а вот со строчки
Цитата:
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
Последний раз редактировалось ImmortalAlexSan; 18.08.2010 в 22:13. |
|
18.08.2010, 22:26 | #3 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Смещение - это адрес в памяти, относительно точки отсчета. В данном случае точка отсчета не начало памяти, а адрес начала сегмента.
Эти извращенства были придуманы когда компьютеры были большими, а память маленькой. При таком раскладе команда занимает меньше места (адрес получается более коротким, а память-то совсем маленькая), для поддержки всего этого есть регистр, хранящий адрес начала сегмента, процессор сам заботится о том, что бы приплюсовать (или сделать конкатенацию, смотря как там устроено) смещение к базе, при работе с памятью.
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс Последний раз редактировалось ROD; 18.08.2010 в 22:36. |
18.08.2010, 22:55 | #4 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Ну, сегментная модель памяти осталась в прошлом (и слава богу). В Win32 используется плоская модель памяти - это когда вся память представлена одним большим массивом из байт. Соответственно, многие из сегментных сегментов потеряли смысл и сегодня они эквивалентны (указывают на одну и ту же область памяти).
Очень грубо понять сегмент и смещение можно так: сегмент - это переменная типа массив 0..65535 из байт (к примеру). Смещение - это индекс в массиве. Чтобы обратиться к ячейке памяти (т.е. элементу массива) вам нужно взять адрес начала массива (сегмент) и прибавить к нему индекс (смещение). Т.е. когда вы говорите просто "индекс 15" - вы не можете узнать, про какой байт идёт речь, пока вы не скажете от какого массива этот индекс. Иными словами, индекс имеет смысл, только будучи приписан к массиву ("индекс относителен к началу массива"). Аналогично и смещение задаёт сдвиг от начала сегмента. Связано это с тем, что 16-ти разрядное число не может адресовать много памяти. Зато два числа (сегмент + смещение) дают большую свободу. Эта модель - не более, чем обходной путь. В 32-х разрядном мире смысла в этих изворотах нет. Ну а параграф - это просто 16 байт. Лучше всего это понять, рисуя на бумажке. Неужто в книге нет иллюстраций? Вообще, эту информацию можете смело пропустить - я не думаю, кто она хоть как-то применима в мире Win32, если только вы не станете писать приложения под Windows 3.1. P.S. Возможно, вам будет интересно.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
Последний раз редактировалось GunSmoker; 18.08.2010 в 23:00. |
18.08.2010, 23:05 | #5 |
Участник клуба
Регистрация: 13.01.2009
Сообщений: 1,353
|
Спасибо ребят, стало гораздо понятнее!
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
|
18.08.2010, 23:44 | #6 | |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Цитата:
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс Последний раз редактировалось ROD; 18.08.2010 в 23:48. |
|
19.08.2010, 00:05 | #7 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Видимо, мы просто используем разное определение понятия "плоская модель памяти".
В моём понимании она не исключает сказанного вами. Иными словами, говоря "плоская", я имею ввиду только виртуальное адресное пространство процесса (т.е. указатель - это одно значение, а не составное), а не то, что у него под капотом. Т.е. плоская - это когда один сегмент, содержащий в себе и данные и код. А технически, да, 32-х разрядное плоское пространство имеет под собой страничную организацию. Это, кстати, достаточно распространённая трактовка.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
19.08.2010, 00:09 | #8 | |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Цитата:
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
|
19.08.2010, 07:01 | #9 | ||
₪₪₪₪₪₪₪₪
Форумчанин
Регистрация: 16.04.2007
Сообщений: 471
|
Цитата:
ROD То про что говорит GunSmoker ещё называется "Несегментированная модель памяти" или просто FLAT - можно сказать даже, что это один большой сегмент в 4гига. Поищи Программирование для Windows NT. Александр Фролов, Григорий Фролов, Том 26, 1 часть. И зубрить 1 главу магической книги как Отче наш. Цитирую: Цитата:
Книга очень гудовая. Последний раз редактировалось r9m; 19.08.2010 в 07:15. |
||
19.08.2010, 11:06 | #10 | |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Цитата:
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Регистры | Волк | Microsoft Office Excel | 9 | 08.04.2009 16:07 |
Регистры символов | rexec | Microsoft Office Excel | 11 | 02.02.2009 13:15 |
Регистры | Манжосов Денис :) | Помощь студентам | 8 | 28.07.2008 12:48 |
Регистры | RealSHELS | Общие вопросы Delphi | 3 | 28.03.2008 18:56 |
Регистры | Elm0 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 13 | 10.02.2008 19:49 |