Static Wikipedia February 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Web Analytics
Cookie Policy Terms and Conditions Real mode — Уикипедия

Real mode

от Уикипедия, свободната енциклопедия

Real mode (на английски, буквално реален режим) е режим на работа на компютърните процесори в архитектурата x86. Всеки x86 процесор влиза в реален режим веднага след включване на захранването му. При реалния режим, максималната адресирана памет е 1 MB (220 байта) и няма апаратна защита на достъпа до паметта.

Съдържание

[редактиране] История

Първите процесори от фамилията x86 са 16-битови и могат да работят единствено в реален режим. Всъщност понятието реален режим се появява значително по-късно, когато е въведен защитения режим.

Въпреки че при появата си процесора Intel 8086 е най-съвременният 16-битов процесор, с времето недостатъците на архитектурата му започват на пречат на развитието на софтуера за персонални компютри. Основните ограничения на 8086 (и съответно на реалния режим) са малкото адресно пространство и липсата на апаратна защита на паметта от злонамерени или дефектни програми.

[редактиране] Технология

Реалният режим на работа се характеризира със следните архитектурни особенности:

  • 14 16-битови регистъра, от които 8 са с общо предназначение.
  • 1 MB (220 байта) адресно пространство.
  • 64 KB (216 байта) входно-изходно адресно пространство.
  • Фиксиран размер на сегмента на паметта - 64 KB (216 байта)
  • 7 типа данни.
  • 9 метода за адресиране.
  • Над 80 машинни инструкции

Трябва да се има в предвид, че горепосочените особенности са в сила само за "чистия" реален режим - т.е. този, който е напълно обратно съвместим с 16-битовите x86 процесори: 8086 и 80186 на Intel. При 32-битовите процесори от x86 фамилията дори в реален режим е възможен достъпа до пълния 32-битов размер на регистрите, както и допълнителни типове данни и методи за адресиране. Ако тези разширения бъдат използвани, то програмата няма да е обратно съвместима с 16-битовите x86 процесори.

[редактиране] Регистри

В реален режим всеки x86 процесор има достъп до 14 16-битови регистъра. Осем от тях (AX, BX, CX, DX, SP, BP, SI и DI) са регистри с общо предназначение. Въпреки това, всеки от тях си има свои специфични функции (например достъпа до AX става най-бързо и с най-къса машинна инструкция, а CX се използва за брояч при цикли). Всеки от регистрите AX, BX, CX и DX може да бъде разглеждан и като 2 8-битови регистъра до които има независим достъп (напр. горните 8 бита на DX са 8-битов регистър с името DH, а долните 8-бита - 8-битов регистър с името DL).

Регистрите SP и BP се използват при работата със стека, като първия е указателят на стека, а втория обикновенно се използва от езиците на високо ниво за формирането на така наречения стек фрейм (stack frame) на процедурите. Регистрите SI и DI се използват при формирането на адреса при някои инструкции (най-вече при операции със стрингове).

Други 4 16-битови регистъра са сегментните регистри CS, DS, ES и SS, които се използват при формирането на адресите. Регистърът FLAGS съдържа еднобитови флагове, които отразяват текущото състояне на процесора и събития като препълване, пренос към по-старши разред, нулев резултат и т.н. Последният регистър е програмният брояч IP, който съдържа адреса на следващата инструкция, която трябва да бъде изпълнена от процесора.

[редактиране] Типове данни

В реален режим x86 процесора може да обработва следните типове данни:

  • Цели числа без знак. Могат да бъдат 8-битови (байт) или 16-битови (дума). Байта има диапазон на възможните стойности от 0 до 255 (28 - 1), а думата - от 0 до 65536 (216 - 1).
  • Цели числа със знак. Могат да бъдат 8-битови или 16-битови, в допълнителено кодиране (най-старшият бит е знаков). 8-битовите имат диапазон на възможните стойности от -128 до 127, а 16-битовите - от -32768 до 32767.
  • Двоично-десетични (BCD) числа. Имат две разновидности - пакетирани и непакетирани. При непакетираните BCD числа във всеки байт от числото се съдържа една десетична цифра. При пакетираните BCD числа във всеки байт са пакетирани 2 десетични цифри (едната в младшите 4 бита, а другата - в старшите 4 бита).
  • Стринг от байтове. Последователност от байтове с максимален размер до 65535 (216 - 1) байта.

[редактиране] Методи за адресиране

Повечето x86 инструкции са двуадресни (т.е. работят върху 2 операнда). Първия операнд е както първия източник, така и вместилище за резултата от операцията, а втория операнд е втория източник.

Операндите може да се намират в паметта, в регистър (обикновенно някой от регистрите с общо предназначение), или да са зададени като непосредствена стойност, която е закодирана в самата инструкция. В повечето случаи е допустимо само единият операнд да е разположен в паметта или да е непосредствен (закодиран директно в инструкцията).

Когато единият операнд е разположен в паметта, адреса му се определя по следната формула:

A = B + I + O,

където:

A е получения ефективен адрес на операнда,

B е базов адрес (задава се в регистър BX или BP),

I е индекс (задава се в регистър SI или DI),

O е отместване, което е непосредствено закодирано в самата инструкция като 8- или 16-битово число със знак.

Трябва да се има в предвид, че полученият по този начин 16-битов адрес всъщност представлява отместване в рамките на подразбиращият се сегмент в паметта. Началния адрес на сегмента се получава, като се умножи по 16 (т.е. като се измести няляво с 4 разреда) съдържанието на съответния сегментен регистър (CS, DS, SS, ES). Крайния физически адрес на данните в паметта се получава като се събере началния адрес на сегмента с полученото по горната формула отместване.

Кой точно сегментен регистър се използва при изчисляването на адреса зависи от вида на зарежданите данни: CS се използва за инструкциите, DS - за данните, SS - за стека, а ES - при някои инструкции за работа със стрингове. В повечето случаи е възможно подразбиращия се сегментен регистър да бъде променен с префикс на машинната инструкция.

Сегментната организация на паметта в реалния режим се използва единствено за да е възможно адресирането на 1 MB памет от 16-битов процесор. От гледна точка на процесора сегментите винаги са дълги 64 KB и няма начин да бъде ограничен достъпа до някои части от паметта.

Поради описаната сегментна организация на паметта, се използват два вида указатели: 16-битови (наричани близки - near) и 32-битови (наричани дачечни - far). Близките указатели представляват отместване в рамките на един сегмент, а далечните указатели се състоят от 16-битов начален адрес на сегмента (който се зарежда в съответния сегментен регистър) и 16-битово отместване в рамките на сегмента.

За разлика от други процесорни архитектури, в x86 е възможно адресирането на думи, намиращи се на произволен адрес. Все пак, когато адреса не е кратен на размера на думата, е възможно достъпа да е по-бавен.

[редактиране] Входно-изходно адресно пространство

При x86 архитектурата могат да се използват и двата основни начина за връзка с входно-изходните устройтва на компютъра - вмъкване в основното адресно пространство и използването на специално входно-изходно адресно пространство.

Входно-изходното адресно пространство е с размер 64 KB (216 байта) и достъпа до него става с помощта на специални инструкции (IN, OUT). Методите на адресиране, които се използват от тези инструкции са: непосредствено задаване на адреса в инструкцията или задаване на адреса в регистрите AL или AX. Когато адреса е в първите 256 байта от входно-изходното адресно пространство, може да се използва 8-битов адрес вместо 16-битов.

[редактиране] Инструкции

Инструкциите на x86 са сложни и гъвкави (x86 е CISC архитектура). Инструкциите в реален режим са основния вид инструкции, които се използват в програмите за тази архитектура (тези инструкции са достъпни и в защитен режим, но с повече типове данни и методи на адресиране). Инструкциите може да се разделят условно на няколко групи.

[редактиране] Инструкции за трансфер на данни

  • MOV - копиране на данни от първия във втория операнд.
  • PUSH - записване на данни в стека и декрементиране на стековия указател.
  • POP - четене на данни от стека и инкрементиране на стековия указател.
  • IN, OUT - четене от и запис във входно-изходното адресно пространство.
  • XCHG - размяна на съдържанието на двата операнда
  • LEA - изчисляване на ефективния адрес и прехвърлянето му в регистър.
  • XLAT - бърз достъп до таблици с индекс с размер до 1 байт.

[редактиране] Аритметични инструкции

  • ADD, SUB - събиране и изваждане на цели числа.
  • ADC, SBB - събиране и изваждане на цели числа с отчитане на преноса.
  • MUL, IMUL - умножение на цели числа без и със знак.
  • DIV, IDIV - делене на цели числа без и със знак.
  • AAA, AAS, DAA, DAS, AAM, AAD - специализирани инструкции за корекции на резултата след аритметична операциия с BCD числа.
  • NEG - смяна на знака на цяло число.
  • INC - увеличаване с 1 на цяло число.
  • DEC - намаляване с 1 на цяло число.
  • CBW - разширяване на 8-битово число със знак в 16-битово
  • CWD - разширяване на 16-битово число със знак в 32-битово
  • CMP - сравняване на цели числа

[редактиране] Логически инструкции

  • AND, OR, NOT, XOR - побитови логически операции.
  • ROL, ROR, SAL, SAR, SHL, SHR - аритметични и логически побитови измествания.
  • TEST - побитово сравнение.

[редактиране] Инструкции за работа със стрингове

  • CMPS - сравнение на стрингове.
  • SCAS - сравнение на стринг с регистър.
  • MOVS - трансфер на стринг от паметта на друго място в паметта.
  • LODS - прехвърляне от стринг в регистър.
  • STOS - прехвърляне от регистър в стринг.
  • REP, REPE/REPZ, REPNE/REPNZ - префикси, които се използват заедно с инструкциите за работа със стрингове.

[редактиране] Инструкции за преход

  • JMP - безусловен преход.
  • JO, JNE, JB/JNAE/JC, JNB/JAE/JNC, JE/JZ, JNE/JNZ, JBE/JNA, JS, JNS, JP/JPE, JNP/JPO, JL/JNGE, JNL/JGE, JLE/JNG, JNLE/JG - условен преход (в зависимост от съдържанието на регистър FLAGS).
  • CALL - извикване на подпрограма.
  • RET - връщане от подпрограма.
  • LOOP - безусловен преход в рамките на цикъл.
  • LOOPE/LOOPZ, LOOPNE/LOOPNZ - условен преход в рамките на цикъл.

[редактиране] Други инструкции

  • INT, INT3, INTO - предизвикване на прекъсване.
  • IRET - връщане от подпрограма за обработка на прекъсване.
  • BOUND - проверка за нарушаване на границите на масив.
  • SAHF, LAHF - прехвърляне на младшия байт на FLAGS в и от AH.
  • PUSHF, POPF - запис и четене на FLAGS в и от стека.
  • CLC, STC, CMC, CLD, STD, CLI, STI - нулиране и установяване на различни флагове във FLAGS.
  • HLT - спиране на процесора.
  • WAIT - чакане на копроцесор.
  • NOP - празна инструкция.

[редактиране] Проблеми

Както вече беше споменато, в момента на създаването си, x86 архитектурата (която тогава е еквилалентна на сегашния real mode) е много авангардна. За пръв път се използва сегментна организация на паметта (макар и доста ограничена) в микропроцесор. Регистрите са много повече от тези на тогавашните микропроцесори, методите за адресиране и инструкциите са гъвкави и разнообразни.

С течение на времето обаче, 16-битовия real mode става все "по-тесен" на съществуващите операционни системи и приложни програми по следните причини:

  • Ограничението от 1 MB адресно пространство е твърде малко в сравниение с нарастващите нужди на приложните програми.
  • Липсата на апаратна защита на паметта води до ниска стабилност и сигурност на операционните системи, които изключително лесно могат да бъдат блокирани и повредени от зле работещи или злонамерени програми (компютърни вируси).
  • 16-битовия размер на машинната дума е твърде малък и често се налага обработката на големите числа с няколко инструкции, което значително забавя изпълнението на програмния код.

Всички тези проблеми бяха решени с разширяването на машинната дума до 32 бита и въвеждането на т.нар. защитен режим (protected mode).

[редактиране] Приложения

Изключително популярната в миналото операционна система DOS работи почти изцяло в реален режим. Първите версии на операционната система Windows (Windows 1.0 и Windows 2.0) също използваха реалния режим на работа.

В наши дни реалния режим се използва изключително рядко - най-вече в секторите за начално зареждане. Всички съвременни операционни системи и приложни програми използват защитения режим.

[редактиране] Виж също

[редактиране] Външни връзки

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu