Начало » Програмиране » Регистри в асемблер

Серията x86 включва различни микропроцесори като 8088, 8086, 80286, 80386, 80486, pentium. Независимо от голямата разлика в скоростта и усложнението на тези процесори, основната архитектура остава една и съща. Всички те съдържат първоначалният комплект от 16 битови регистри. От тук нататък ще разглеждаме предимно 16 битовите регистри за да не възникнат усложнения.
Какво е регистър? Казано простичко това е вътрешната памет на процесора.
Някои регистри имат специални функции, други са общи. Когато се учите да програмирате на асемблер ще ви е от помощ да гледате на процесора като на група регистри които можете да променяте.
Има четири категории регистри:
1. Общи регистри.
2. Сегментни регистри.
3. Указател към инструкциите.
4. Флагове
<b>Общи регистри</b>
Съществуват 8 общи регистри, първите 4 са наречени регистри за данни. Те са най-често използвани, защото могат да се ползват като 16 или 2х8 битови регистри, а другите 4 не могат.
Първата четворка са: ах,bx,cx,dx. Когато се разделят може да използва поотделно долната и горната им част. Пример: при ax - al(долна част) и аh(горна част на регистъра). Ако напълните ah с 5 и al с 55h, AX ще съдържа 0555h. Въпреки че са наречени общи, всеки един от тях има собствена определена роля:
AL/AX са познати като акумулаторни регистри, те са регистри, които могат да се използват при входно/изходни инструкции
ВХ - познат като базов регистър, използва се като указател към главния адрес на сегмента.
СХ познат като регистър брояч и се използва за контрол на даден цикъл.
DX се нарича регистър за данни и има собствени уникални начини да се справя с mul и div, както и съдържа 16 битовия адрес на входно/изходния порт.
Другите четири общи регистри са: bp (базов указател), sp (указател към стек) si (index на източник) and di (index на крайно предназначение)
<b>Сегментни регистри</b>
Сегментните регистри са тази част от асемблер-а, в която доста хора изгубват интерес и се отказват да продължат. Съществуват четири 16 битови сегментни адреси. Когато стартирате персоналния компютър в т.н. 'реален режим' операционната система навлиза в т.н. 'защитен режим'. Ролята на сегментните регистри е да позволят на процесора да има достъп до 1МБ адресно пространство(тоест осъществяват адресирането на паметта). Но те са само 16 битови и могат да адресират само 65536 места от паметта. Дали е така? Тук идва хитрата част: Всеки адрес който процесора изпраща е всъщност 20 битов физически адрес. Той е образуван от сумата на сегментен адрес(от сегм. регистър) и адрес на отместване(от друг рег. или паметта). Сумата се осъществява като: 1. Измества се съдържанието на сегментия регистър с едно 16-тично число(4бита). 2. Добавя се съдържанието на сегментния регистър към другия регистър(адреса на отместване).
<q>Примерно ако имаме:
адрес на отместване = 1234h
сегментен регистър = 5678h
01234h
+56780h
----------
579B4h = 20-битов адрес
</q>
Тази преадресация се извършва автоматично от хардуера. От тук нататък за да се отнасяме към този адрес ще пишем: сегмент:отместване. В зависимост от регистрите които ще използваме, различни сегментни регистри ще играят роля при показването на това 20 битово число:
ip се използва с cs
sp се използва с ss
bp се използва с ss
DS:SI ; източник при операции с низове
ES:DI ; крайна посока при операции с низове
Всички други регистри се използват с ds.
Възприемайте регистрите като променливи служещи за съхранението на данни.
Виждаме че се използват указатели(ip,sp,bp) и сегменти(cs,ss,ss).
<b>Указател към инструкции</b>
Указателят към инструкции(ip) е много важен регистър. Както подсказва името му, сочи към това коя ще е следващата инструкция, която ще се изпълни. Пред ip, sp или bp можем да срещнем ‘e’ е случаите на разширени(32 …
| 01 | Използване на Debug - 2 част |
| 02 | Използване на Debug |
| 03 | Оператори в асемблер |
| 04 | Класове в C++ I част |
| 05 | Класове в C++ II част |
|
Коментари за Регистри в асемблер
А защо при Pentium имаме достъп до 6те сегмента в даден момент?
1. Сегментните регистри не се използват при програмирането при 32 битови версии на Windows.
2. Почти всички операции (аритметични, логични и т.н.) се регистрират в флаг-регистъра, така че мога да кажа, че този регистър е доста по-важен (в известен смисъл) от eip регистъра, в който е записан само адреса на инструкцията.
3. Чудя се кой програмира на 8088, 8086, 80286, 80386, 80486, pentium...
- Много сме очаровани от това че момичета се занимават с асемблер!
Според нас относно въпроса кой-на какъв вид процесор програмира - мислим че повече се програмира върху pentium-based архитектура процесори.