| imho.ws |
![]() |
|
|
|
# 1 |
|
Guest
Сообщения: n/a
|
низкоуровневое программирование. вопросы
Собственно, пока возникло два вопроса.
1. На это я, порывшись в юзергайдах и книжках, уже ответ нашёл. Но на всякий случай хочу удостовериться в его правильности (он в скобках). Связан ли объём адресуемой памяти процессора с параметром его разрядности? (нет, эти параметры независимы - разные наборы выводов) 2. Как запускаются приложения? Куда передаются данные бинарных файлов на выполнение? Инструкции, содержащиеся в бинарных файлах - это инструкции процессора или опеационной системы? |
|
|
# 2 |
|
Administrator
Регистрация: 13.05.2002
Сообщения: 11 227
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
1. Zawisit ot arhitekturi.
2. Esli eto ne skript, a instrukcii processora, to i wipolnyaet ih processor.
__________________
Осколки прошлого, как снег, закрутит ураган времён, В ушедший день для нас навек, обрушив мост, Оставив в наших душах след, тьма уплывёт за горизонт, И в чистом небе вспыхнет свет, свет новых звёзд. |
|
|
|
|
# 3 |
|
::VIP::
Регистрация: 09.05.2004
Адрес: Киев
Сообщения: 670
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
1.Ну, обьем адресуемой памяти процессора вроде как и связан с его разрядностью - если у процессора вегистры 16 бит, то и адресовать он сможет не больше 2^16=65536 байт. Для адресации используются
АДРЕСНЫЕ РЕГИСТРЫ От размера этих регистров зависит размер памяти, к которой процессор может непосредственно адресоваться. В процессорах первых поколений Intel 8088/8086 размер адресных регистров был 16 битов или 2 байта - максимальное число (номер байта в памяти), которое может быть записано в такой регистр, 2^16-1=65535 или, как его округленно называют - 64 килобайта Но уже в компьютерах на базе этих процессоров возникла необходимость адресоваться к памяти размером 1024 килобайта (1 мегабайт). Чтобы выйти из затруднения с регистрами недостаточного размера, для адресации отвели 2 регистра и решили составлять адрес из 2-х частей : первая часть адреса содержит номер блока памяти как количество 16 байтовых ПАРАГРАФОВ, а вторая часть номер байта, отсчитанный от границы (начала) параграфа. Первую часть адреса назвали адресом СЕГМЕНТА, а вторую - СМЕЩЕНИЕМ внутри сегмента. Очевидно, что обе составляющие при 16-битовом регистре адреса не могут быть больше 65535 Максимальный адрес, по которому можно обратиться к памяти при такой 2-ступенчатой адресации FFFF0 или 65535 * 16 = 1048560. Если все смещения будут максимальными - по 64 Кбайта -, то всего можно иметь до 16 сегментов. Процессоры следующих поколений имели уже более длинные регистры для хранения адресов - 80286 использует 24 битовые и позволяет адресовать напрямую до 16 мегабайт, а 80386 имеет 32-битовые регистры и может адресовать до 4 Гигабайт 2.Как уже говорилось в предыдущих темах, ассемблер заменяет аббревиатурами команды процессора. Последний раз редактировалось Slanj; 02.06.2004 в 05:34. |
|
|
|
|
# 4 | ||
|
Guest
Сообщения: n/a
|
Цитата:
И что такое параграф и чем он отличается от сегмента? Цитата:
|
||
|
|
# 5 |
|
::VIP::
Регистрация: 09.05.2004
Адрес: Киев
Сообщения: 670
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
сегмент:смещение
Смотри, у тебя первая часть - адрес сегмента памяти , измеряется в параграфах, тоесть сколькото раз по 16. Наприме, если сегмент равен 34, то реальный адрес, на который он указывает = 34*16=544. А смещение измеряется для более точного указания в байтах, так что если оно будет равно 7, то весь адрес, вычисляемый по формуле сегмент:смещение будет равен 544+7=551 байт.
Речь идет об оперативной памяти. Последний раз редактировалось Slanj; 02.06.2004 в 04:38. |
|
|
|
|
# 7 |
|
::VIP::
Регистрация: 09.05.2004
Адрес: Киев
Сообщения: 670
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
65535 - это максимальный размер числа в адресном регистре. А в этом регистре, как мы знаем каждая единица - это один параграф(сделано было, чтобы больше можно было адресовать). А теперь помнож 65535 - количество единиц на их значение 16 и получится 1МБ
Последний раз редактировалось Slanj; 02.06.2004 в 06:02. |
|
|
|
|
# 10 | |
|
Junior Member
Регистрация: 03.06.2003
Сообщения: 167
![]() |
Чего-то тут с этой русской терминологией можно запутаться.
Неважно. Не знаю там где как, но на PowerPC расклад такой: 2 bytes - halfword 4 bytes - word 8 bytes - double word 16 bytes - quad word Цитата:
|
|
|
|
|
|
# 12 |
|
::VIP::
Регистрация: 09.05.2004
Адрес: Киев
Сообщения: 670
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
metton
RISC - это Reduced Instruction Set Computer. Извини, обьяснял ночью, башка не очень варила, сам немного запутался. Просто и правда в разных учебниках все по разному называют. Давай остановимся на Зубкове (его приоритет подтвердила моя преподша, содрав добрую половину своих лекций из его книги ). Просто сегментную часть адреса называют номером параграфа. Но это не суть делла важно, ты ведь в программах термины не будешь писать . Давай так, значение сегмента адреса в двоичном виде сдвигается на 4 бита влево (что равносильно уможению на 16), полученному адресу плюсуется адрес смещения и получается реальный адрес.
|
|
|
|
|
# 13 | |
|
Junior Member
Регистрация: 03.06.2003
Сообщения: 167
![]() |
Цитата:
1. CISC (Complex Instruction Set Computer) - например процессоры от AMD и Intel, включая все процессоры семейства x86. 2. RISC (Reduced Instruction Set Computer) - подавляющее большинство других архитектур, таких как IBM PowerPC (Power Mac G4/G5), Sun Sparc, DEC/Compaq Alpha, MIPS. 3. EPIC (Explicitly Parallel Instruction Computing) - чипы семейства Itanium от Intel |
|
|
|
|
|
# 14 | ||
|
Guest
Сообщения: n/a
|
Slanj
Цитата:
Цитата:
А селекторы хранятся в CS, DS, ES, FS, GS и SS, так? А где хранятся смещения? и ещё, не понял эту фразу из Зубкова: "...в защищённом режиме адрес начала для каждого сегмента хранится отдельно, так что возможно 2^46 (64 терабайта) различных логических адресов в формате сегмент:смещение (программа может определить до 16384 сегментов, каждый из которых до 4Гб)..." Что значит - хранятся отдельно и откуда взялись эти числа? И вот ещё, пока не забыл. Из Абеля. Зачем нужен бит чётности и где он хранится? Почему число битов со значением 1 не должно быть чётно? Книга вообще, наверное толковая, но в ней, как и во многих других такое количество неустоявшейся (и не объяснённой) терминологии, что очень многое приходится додумывать. basturd ОК, учту. А к какому типу относится ARM? Скорее всего, RISC? |
||
|
|
# 15 |
|
::VIP::
Регистрация: 09.05.2004
Адрес: Киев
Сообщения: 670
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Ну вот, мы уже идем на поправку! Ты немножко неправильно понял - селектор это есть адрес в памяти, деленный на 16. Как я уже говорил, это чтобы больше памяти адресовать. А чтобы получить реальный адрес этот селектор надо сместить на 4 бита влево или * 16. Как аналог, представь, в одном килограмме 1000 граммов, а в одном селекторе (или параграфе) 16 бит.
Cs, Ds, Es, Fs, Gs и Ss - это сегментные регистры, используются для хранения сегмента адреса. Cs - сегмент кода - код программы Ds - сегмент данных - сегментная часть адреса расположения данных программы Ss - сегмент стека - адрес стека Es, Fs, Gs - дополнительные сегментные регистры, могут содержатьсегментную часть любого адреса памяти. Смещения хранятся в Bp, Sp, Si, Di Bp - указатель базы - хранит смещение в области данных Sp - смещение вершины стека Si, Di - индекс источника, индекс приемника с ними и будешь скоро работать Si - смещение данных, которые должны быть перемещены Di - смещение, куда должны быть перемещены Смещение следующей выполняемой команды всегда хранится в специальном регистре — Ip |
|
|
|
|
# 16 | ||
|
Guest
Сообщения: n/a
|
Slanj
Так, ну это я понял - смещаем селектор на 4 бита влево. На 4 бита - потому что в параграфе(слове) есть две позиции смещения - 2 байта? Цитата:
И откуда всё-таки эти числа: Цитата:
|
||
|
|
# 17 |
|
::VIP::
Регистрация: 09.05.2004
Адрес: Киев
Сообщения: 670
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Это помогает нам больше памяти адресовать, так как адрес теперь состоит из двух частей, в одной из которых единицы в 16 раз больше, а вторая часть для точного указания просто в единицах. Получается и адресовать мы сможем в 16 раз больше - 65535 (максимальное число, умещающееся в двух байтах) умножить 16 = 1МБ.
Насчет второго пока не задумывайся, а то опять запутаешся. Попробуй рассмотреть это немного позже. P.S. Решил все же добавить. В защищенном режиме - 32 разрядные процессоры. Регистры у них по 32 бита. Теперь узнаем максимальное значение в 32 битах - 2^32 = 4ГБ. Программа может определить до 16384 сегментов. 4ГБ * 16384 как раз и равно 64 ТБ. Автор просто немного сократил эту операцию, оставив додумывать нам. Последний раз редактировалось Slanj; 03.06.2004 в 03:26. |
|
|
|
|
# 18 | ||||
|
Guest
Сообщения: n/a
|
Slanj
опять не всё понял... Цитата:
Цитата:
Цитата:
Цитата:
чё-то щас туплю... но я упорный - пока не разберусь, не успокоюсь! |
||||
|
|
# 19 |
|
::VIP::
Регистрация: 09.05.2004
Адрес: Киев
Сообщения: 670
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Да, мы с тобой я вижу тут долго сидеть будем. Но ничего, сам ассемблер хорошенько повторю.
1. Ну конечно, адрес, хранимый в регистрах, состоящий из сегмента и смещения. 2.Это я уже устал писать. В сегментном регистре каждая единица - это 16 бит. 3.Да, это смещение. 4.Умножается максимальное количество селекторов на их значение. А упорство - это очень хорошая вещь, мне его очень часто не хватает
|
|
|
|
|
# 20 | |||
|
Guest
Сообщения: n/a
|
Цитата:
Цитата:
Цитата:
непоятно, теперь не понятно, что значит значение селектора - 16 в общем, я пошёл. ещё раз перечитаю это раздел у Зубкова, Абеля и Петцольда, и, может быть, просветлюсь
|
|||