Вопрос № 97744: Здравствуйте!
Начал изучать книгу "Ассемблер это просто!" и сразу появились неясности.
Объясните пожалуйста, во второй главе этой книги говорится что
микропроцессоры имеют 14 регистров, и мне не понятно это их общее количество...Вопрос № 97749: Здравствуйте!
Начал изучать книгу "Ассемблер это просто!" и сразу появились неясности.
Объясните пожалуйста, во второй главе этой книги говорится что
микропроцессоры имеют 14 регистров, и мне не понятно это их общее количество...
Вопрос № 97.744
Здравствуйте!
Начал изучать книгу "Ассемблер это просто!" и сразу появились неясности.
Объясните пожалуйста, во второй главе этой книги говорится что
микропроцессоры имеют 14 регистров, и мне не понятно это их общее количество или речь идет только о 14 типах, по их назначению, регистрах. Вобщем-то читая дальше я понял что сегментных регистров в процессоре,физически, много, так-как было сказано что программы типа ".COM" загружается впервые свободные регистры. А как же с другими регистрами, например с регистрами данных, например "ah или al", или регистрами-указателями, ведь если их тоже, физически, много как процессор определяет с какими
именно надо работать, ведь в отличии от сегментных, регистры данных или указатели не имеют точного
адреса в программе, это видно в отладчике.
Зарание спасибо.
Отвечает: Sergijj
Здравствуйте, Ташканов Иван Герардович!
Ну во-первых не все микропроцессоры, а только i80x86 и совместимые с ними.
А во-вторых, Вы немного неправильно поняли смысл регистра.
Регистр - это НЕ поименованная область памяти компьютера, а собственная, минимально-уровневая из доступных программно, память собственно процессора.
Память компьютера (к которой обращаются программы и загружаются они туда же) - это ОЗУ (Оперативное Запоминающее Устройство) - отдельная от процессора микросхемка.
А память собственно процессора (её программы используют как инструментарий) - это регистры.
Так вот, регистры (будем для простоты придерживаться рассматриваемого Вами уровня) сами по себе 16-битные = словные = 2-байтовые (т.к. в 1 байт = 8 бит).
Из них:
CS, SS, DS, ES - сегментные, т.е. могут содержать только (во всяком случае подразумевается, что использоваться будут они именно так) адрес сегмента кода (CS) или данных (SS, DS, ES) (сегмент - начало куска памяти, куда идёт обращение).
IP, SP, SI, DI - парные им индексные (или "указательные") регистры, т.е. содержат уже не абсолютный адрес сегмента памяти, а относительный адрес _кода_ или _данных_ (а не сегмента _памяти_) - размер смещения необходимых _кода_ или _данных_ в памяти, относительно начала _сегмента_памяти_.
AX (а с ним и 8-битные AH, AL), BX (а с ним и 8-битные BH, BL), CX (а с ним и 8-битные CH, CL), DX (а с ним и 8-битные DH, DL), BP и регистр флагов (FLAGS) - это регистры - "рабочие лошадки".
Т.е., как видите, 16-битных регистров _всего_ 14...;)
Кроме того, из первых двух групп регистров (сегментные и индексные ("указательные")) видна архитектура памяти процессоров i80x86: вся память разбита на сегменты (сегмент = 64 килобайта = 65536 байт - именно столько значений может "поместиться" в 16 битах информации)
и адрес конкретных данных в памяти представляет собой т.н. "сегментную пару" - адрес (номер) сегмента и смещение относительно начала этого сегмента.
Записывается это так:
или так (не в виде имён регистров, а в виде значений, находящихся "внутри" этих регистров):
"адрес сегмента (в шестнадцатиричной системе счисления)":"размер смещения (в шестнадцатиричной системе счисления)", например: 0A000:0000
Безусловно, что у каждого регистра есть своя функция:
пара CS:IP (CodeSegment:IndexPointer) отвечает за хранение указателя (сегмент + смещение) на то место в памяти, где происходит выполнение программы (не данные, а код);
пара SS:SP (StackSegment:StackPointer) отвечает за хранение указателя на текущую вершину стека выполняемой программы;
пары DS:SI (DataSegment:SourceIndex) и ES:DI (Extended_dataSegment:DestinationIndex) отвечают за хранение указателей на текущие пользовательские (программные) данные.
BX - (Base_registr) рекомендуется для хранения базы (например адреса сегмента);
CX - (Counter_registr) рекомендуется для использования в качестве счётчика;
DX - (Data_registr) нет рекомендаций - свободные данные;
AX - (Auxiliary_registr) дополнительный регистр, который собственно и является главной рабочей лошадкой, не рекомендуется для длительного хранения данных;
BP - (BasePointer) дополнительный базовый указатель;
FLAGS - регистр флагов (битового (маскированного) представления результатов операций).
Вот собственно и всё. Более детальную информацию можно посмотреть в справочной литературе.
Если что осталось неясным, пишите. Постараюсь ответить.
Успехов!
--------- Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 10-ый класс)
Ответ отправлен: 09.08.2007, 10:23 Оценка за ответ: 4
Вопрос № 97.749
Здравствуйте!
Начал изучать книгу "Ассемблер это просто!" и сразу появились неясности.
Объясните пожалуйста, во второй главе этой книги говорится что
микропроцессоры имеют 14 регистров, и мне не понятно это их общее количество
или речь идет только о 14 типах, по их назначению, регистрах. Вобщем-то читая дальше я понял что сегментных регистров в процессоре,физически, много, так-как было сказано что программы типа ".COM" загружается впервые свободные регистры. А как же с другими регистрами, например с регистрами данных, например "ah или al", или регистрами-указателями, ведь если их тоже, физически, много как процессор определяет с какими именно надо работать, ведь
в отличии от сегментных, регистры данных или указатели не имеют точного адреса в программе, это видно в отладчике.
Зарание спасибо.
Отвечает: Калашников О.А.
Здравствуйте, Ташканов Иван Герардович!
Вы спутали регистры и ячейки памяти. Регистры могут быть 8-ми разрядные (AH, AL), 16-ти разрядные (AX) и 32-х разрядные (EAX). Соответственно в таблице это можно отразить так:
EAX
AX
AH | AL
При этом, регистры AH и AL являются старшей и младшей частью регистра AX, а регистр AX является младшей частью регистра EAX.
Если говорить упрощённо, то регистр - это просто переменная. Например, как в Бейсике: $a = 10.
Что в Ассемблере будет выглядеть как
mov al,10
При этом AX и EAX будут тоже автоматически содержать число 10.
По поводу сегментных и остальных регистров. Их не много, а определённое количество. Посмотреть список всех 16-разрядных регистров можно в отладчике afd. В оталдчике CodeView или SoftICE можно увидеть все 8-и, 16-и и 32-х разрядные регистры.
Ответ отправил: Калашников О.А. (статус: *Администратор) Россия, Москва ---- Ответ отправлен: 09.08.2007, 10:02 Оценка за ответ: 5