Кіріспе

CPU-ның нұсқаулар жиынтығы архитектурасының бір бөлігі

Адрестеу режимдері – көптеген орталық процессорлардың (CPU) нұсқаулар жиынтығы архитектурасының бір бөлігі болып табылады. Белгілі бір нұсқаулар жиынтығы архитектурасында анықталған әртүрлі адрестеу режимдері, осы архитектурадағы машина тіліндегі нұсқаулардың әрбір нұсқаудың операндасын қалай анықтайтынын көрсетеді. Адрестеу режимі машиналық нұсқаудың ішінде немесе басқа жерде сақталған регистрлер мен/немесе тұрақты мәндерді пайдаланып, операндтың нақты жад мекенжайын есептеу әдісін анықтайды. Компьютерлік бағдарламалауда адрестеу режимдері ең алдымен ассемблер тілінде бағдарлама жазатындар мен компиляторларды құрастырушыларға қызығушылық тудырады. Бұл ұғыммен байланысты, кез келген нұсқаудың кез келген адрестеу режимін қолдану мүмкіндігімен айналысатын ортогональды нұсқаулар жиынтығын қарастыруға болады.

Қақпақтар

Адрестік режимдерге қатысты жалпы қабылданған атаулар жоқ: әр түрлі авторлар мен компьютер өндірушілер бір адрестік режимге әртүрлі атаулар берсе, немесе әртүрлі адрестік режимдерге бірдей атаулар қолдануы мүмкін. Сонымен қатар, бір архитектурада жеке адрестік режим ретінде қарастырылатын адрестік режим, екінші архитектурада екі немесе одан көп адрестік режиммен қамтылған функционалдықты білдіруі мүмкін. Мысалы, күрделі нұсқаулар жиынтығының (CISC) кейбір архитектуралары, Digital Equipment Corporation (DEC) VAX сияқты, регистрлерді және тура немесе дереу тұрақтыларды жай ғана тағы бір адрестеу режимі ретінде қарастырады. Ал IBM System/360 және оның ізбасарлары, сондай-ақ көптеген қысқартылған нұсқаулар жиынтығының (RISC) жобалары, осы ақпаратты нұсқаудың ішінде кодтайды. Осылайша, соңғы машиналарда бір регистрден екіншісіне көшіру, дереу тұрақтыны регистрге көшіру және жад орнының мазмұнын регистрге көшіру үшін үш түрлі нұсқау коды бар, ал VAX-та тек бір "MOV" нұсқаулы бар. "Адрестік режим" терминінің өзі әртүрлі интерпретацияларға ие: "жад адресін есептеу режимі" немесе "операндқа қол жеткізу режимі". Бірінші интерпретация бойынша, жадтан оқымайтын немесе жадқа жазбайтын нұсқаулар ("регистрге дереу қосу" сияқты) "адрестік режимге" ие емес деп есептеледі. Екінші интерпретация VAX сияқты, операнд режимінің биттерін пайдаланатын машиналарға регистрге немесе дереу операндқа қол жеткізуге мүмкіндік береді. Тек бірінші интерпретация "тиімді адресті жүктеу" сияқты нұсқауларға қолданылады, ол операндтың өзін емес, операндтың адресін жүктейді. Төменде тізімделген адрестеу режимдері кодты адрестеу және дерек адрестеуге бөлінеді. Көптеген компьютерлік архитектуралар осы айырмашылықты сақтайды, бірақ барлық адрестеу режимдерін кез келген контексте пайдалануға мүмкіндік беретін (немесе болған) кейбір архитектуралар да бар. Төменде көрсетілген нұсқаулар адрестеу режимдерін көрсету үшін ғана бейнелеу болып табылады және нақты компьютерде қолданылатын мнемониканы міндетті түрде білдірмейді. Кейбір компьютерлер, мысалы, IBM 709, RCA 3301, жеке адрестеу режимінің өрісіне ие емес, керісінше, жанама адрестеу және индекстеу үшін жеке өрістерге ие.

Маңызды пайдалану жағдайы

Кейбір нұсқаулар жиынтығы архитектуралары, мысалы Intel x86 және IBM/360 және оның ізбасарлары, жүктеме тиімді мекенжай нұсқауларына ие. Бұл тиімді операнд мекенжайын есептеп, оны тіркелгіге жүктейді, бірақ ол көрсеткен жадқа қол жеткізбейді. Бұл массив элементінің мекенжайын кіші бағдарламаға жібергенде пайдалы болуы мүмкін. Сонымен қатар, бұл бір нұсқау арқылы қалыптыдан көп есептеулер жасаудың тапқыр жолы болуы мүмкін; мысалы, мұндай нұсқауды "негіз+индекс+сырғау" адрестеу режимімен (төменде егжей-тегжейлі сипатталғандай) пайдалану екі тіркелгіні және тұрақтыны бір нұсқау арқылы қосып, нәтижені үшінші тіркелгіде сақтауға мүмкіндік береді.

Кодты қарапайым адрестеу тәсілдері

Код үшін кейбір қарапайым адрестеу режимдері төменде көрсетілген. Атаулар платформаға қарай өзгеруі мүмкін.

Сүрлеуді бірізділікпен жасамайтын процессорлар

Бағдарлама санағын пайдаланбай, ретті орындауды қолданбайтын процессорлар өте сирек кездеседі. Кейбір процессорларда әрбір команда келесі команданың мекенжайын міндетті түрде көрсетеді. Мұндай процессорларда көрсетілген мекенжайды сақтайтын командалық көрсеткіш болады; ол бағдарлама санағы емес, себебі оны автоматты түрде арттыру мүмкіндігі жоқ. IBM 650, SECD машинасы, Librascope LGP 30 және RTX 32P сияқты кейбір барабандық жадтағы компьютерлер осыған жатады. Басқа есептеу архитектуралары одан да әрі барып, фон Нейманның шектеуін айналып өту үшін бағдарлама санағына түрлі баламаларды қолдануға тырысады.

Шартты орындау

Кейбір компьютерлік архитектураларда шартты нұсқаулар бар (мысалы, ARM, бірақ қазіргі 64 биттік режимдегі барлық нұсқаулар үшін емес) немесе шартты жүктеу нұсқаулары (мысалы, x86) болады, олар кейбір жағдайларда шартты тармақталуды қажетсіз етеді және нұсқау құбыржолын тазарту қажеттілігінен сақтайды. "Салыстыру" сияқты нұсқау шарт кодысын орнату үшін пайдаланылады, ал келесі нұсқаулар осы шарт кодын тексеріп, орындалуға тиіс пе, әлде назарға алынбау керек пе, соны анықтайды.

Деректерді қарапайым адрестеу тәсілдері

Деректерге арналған кейбір қарапайым адрестеу режимдері төменде көрсетілген. Атаулар платформаға қарай өзгеруі мүмкін.

Жадының жанама немесе кейінге қалдырылған

Осы мақалада айтылған адрестеу режимдерінің кез келгенінде, жанама адрестеуді көрсету үшін қосымша бит болуы мүмкін, яғни, қандай да бір режимді пайдалану арқылы есептелген мекенжай, шын мәнінде, нақты тиімді мекенжайды сақтайтын жад ұясының мекенжайы (әдетте толық сөз) болады. Жанама адрестеу код пен деректер үшін қолданылуы мүмкін. Ол көрсеткіштерді, сілтемелерді немесе идентификаторларды жүзеге асыруды жеңілдетеді, сондай-ақ, басқаша адрестеуге болмайтын кіші бағдарламаларды шақыруды да жеңілдетеді. Бірақ, жанама адрестеу, қосымша жадқа жүгінуге байланысты, өнімділіктің төмендеуіне әкелуі мүмкін. Кейбір ертедегі мини-компьютерлерде (мысалы, DEC PDP 8, Data General Nova) тек бірнеше регистр және шектеулі тікелей адрестеу диапазоны (8 бит) болды. Сондықтан, жад арқылы жанама адрестеуді пайдалану, жадтың кез келген маңызды көлеміне сілтеме жасаудың дерлік жалғыз жолы болды. DEC PDP 11-нің сегіз адрестеу режимінің жартысы кейкелгенге қалдырылған. Register deferred @Rn, жоғарыда анықталған register indirect режимімен бірдей. Предекрементпен кейкелгенге қалдырылған @(Rn), пост-инкрементпен кейкелгенге қалдырылған @(Rn)+ және индекстелген кейкелгенге қалдырылған @nn(Rn) режимдері, параметрдің мекенжайын табу үшін оқылатын жадтағы мекенжайларға сілтеме жасайды. PDP 11-нің кейкелгенге қалдырылған режимдері, бағдарламалық тіркелгішпен (program counter) біріктірілгенде, абсолютті және бағдарламалық тіркелгішке қатысты адрестеу режимдерін қамтамасыз етеді.

Ескірген адрестеу режімдері

Мұнда тізімделген адрестеу режимдері 1950–1980 жылдар аралығында қолданылған, бірақ қазіргі көптеген компьютерлерде қолданылмайды. Бұл тізім толық емес; тарихта әртүрлі уақытта көптеген қызықты және ерекше адрестеу тәсілдері пайдаланылған, мысалы, екі немесе үш индекс тіркелгісінің логикалық «ЖӘНЕ» операциясынан алынған айырма.

Көп деңгейлі жады

Егер сөздің мөлшері адрестен үлкен болса, жадтағы жанама адрестеу үшін сілтеме жасалған сөздің өзі, тағы бір жадтағы жанама циклді көрсету үшін жанама белгісіне ие болуы мүмкін. Бұл белгі жанама бит деп аталады, ал нәтижесіндегі көрсеткіш – таңбаланған көрсеткіш, жанама бит тікелей көрсеткіш пе, әлде жанама көрсеткіш пе екенін көрсетеді. Жанама мекенжайлар тізбегінің өзіне сілтеме жасамайтынына көз жеткізу қажет; егер жасаса, мекенжайды анықтауға тырысқанда шексіз цикл пайда болуы мүмкін. IBM 1620, Data General Nova, HP 2100 сериясы және NAR 2 машиналарында мұндай көп деңгейлі жадқа жанама адрестеу мүмкіндігі бар және олар мұндай шексіз мекенжай есептеу циклына түсуі мүмкін. Nova машинасының жадтағы жанама адрестеу режимі жанама желілік кодты ойлап табуға ықпал етті. 18 биттік адрестері мен 36 биттік сөздері бар DEC PDP 10 компьютері әр кезеңде индекс тіркегішін пайдалану мүмкіндігімен бірнеше деңгейлі жанама адрестеуге мүмкіндік берді. Кез келген мекенжай сөзін декодтау алдында басымдық үзіліс жүйесі тексерілетін. Сондықтан, жанама мекенжай циклы құрылғыларға қызмет көрсету процедураларын орындауға кедергі келтірмейді, соның ішінде алдын ала көп тапсырмалы жоспарлаушының уақыт тілімі аяқталуын басқарушысы да. Айналымдық команда кез келген басқа есептеу жұмысы сияқты қарастырылады.

Жадымен сәйкестендірілген регистрлер

Кейбір компьютерлерде негізгі жад емес, тіркелімдерге немесе оларды іске асыру үшін қолданылатын негізгі жадқа сілтеме жасайтын мекенжайлар болды. Алғашқы компьютерлердің кейбіреулерінде, мысалы, IBM 650, IBM 7070, мекенжайлық диапазонның жоғарғы шегінде тіркелімдердің мекенжайлары болғанмен, кейіннен тек төменгі шегінде тіркелімдердің мекенжайларын пайдалану және жадтың алғашқы 8 немесе 16 сөзін ғана қолдану қалыптасты (мысалы, ICL 1900, DEC PDP 10). Бұл "тіркелімді тіркелімге қосу" деген жеке нұсқаудың қажеттілігін жойды – "жадты тіркелімге қосу" нұсқауын қолдануға болады. PDP 10 модельдерінің алғашқы нұсқаларында кэш жады болмағандықтан, жадтың алғашқы бірнеше сөзіне жүктелген (егер орнатылған болса, жылдам тіркелімдерге мекенжай тағайындалған) тығыз ішкі цикл магниттік ядролық жадтағыдан әлдеқайда жылдам жұмыс істеді. DEC PDP 11 сериясының кейінгі модельдері тіркелімдерді кіріс/шығыс аймағындағы мекенжайлармен байланыстырды, бірақ бұл негізінен қашықтан диагностика жүргізу үшін жасалған. Қызығы, 16 биттік тіркелімдер тізбектелген 8 биттік байт мекенжайларымен байланыстырылды.

Жадыны жанама және автоматты түрде көбейту

DEC PDP 8 миникомпьютерінде сегіз арнайы жад орны болды (8-ден 15-ке дейінгі мекенжайларда). Егер жад арқылы жанама адрестеу арқылы қол жеткізілсе, бұл орындар пайдаланылмас бұрын автоматты түрде өседі. Бұл аккумуляторды пайдаланып мекенжайды өсіру қажеттілігін жойды, жад арқылы циклмен өтуді жеңілдетті. Data General Nova миникомпьютерінде 16-дан 31-ге дейінгі мекенжайларда 16 арнайы жад орны болды. Егер жад арқылы жанама адрестеу арқылы қол жеткізілсе, 16-дан 23-ке дейінгі орындар пайдаланылмас бұрын автоматты түрде өседі, ал 24-тен 31-ге дейінгі орындар пайдаланылмас бұрын автоматты түрде кемиді.

Нөлдік бет

Data General Nova, Motorola 6800 және MOS Technology 6502 процессорлар отбасыларының ішкі тіркелімдері өте аз болды. Арифметикалық және логикалық нұсқаулар көбінесе ішкі тіркелімдерге қарағанда жадтағы мәндермен орындалды. Сәйкесінше, көптеген нұсқаулар жадта екі байттық (16 биттік) орынды қажет етті. Бұл процессорлардағы операциялық кодтардың (опкодтар) ұзындығы бір байтты (8 бит) құрағандықтан, жад адрестері код көлемінің маңызды бөлігін құрауы мүмкін. Осы процессорларды жасаушылар «нөлдік бет» адрестеуі деп аталатын жартылай шешімді енгізді. Жадының алғашқы 256 байты ($0000 – $00FF; басқаша айтқанда, «0» беті) бір байттық абсолютті немесе индекстелген жад адресі арқылы қолжеткізуге болатын. Бұл нұсқауды орындау уақытын бір тактылік циклға және нұсқау ұзындығын бір байтқа қысқартты. Жиі қолданылатын деректерді осы аймақта сақтау арқылы бағдарламаларды кішірейтуге және жылдамдатуға болады. Нәтижесінде, нөлдік бет тіркелімдер жинағына ұқсас қолданылды. Дегенмен, көптеген жүйелерде операциялық жүйе мен пайдаланушы бағдарламалары нөлдік беттің жад аймағын көп пайдаланды, бос орын шектеулі болғандықтан оның қолданылуына шектеу қойды.

Тікелей бет

0 беттік адрестеу режимі бірнеше 8 биттік процессорларда, соның ішінде WDC 65816, CSG 65CE02 және Motorola 6809 процессорларында жақсартылды. "Тікелей бет" деп аталатын жаңа режим, 256 байттық 0 беттік жад терезесін жадтың басынан (оффсет адресі $0000) жадтың алғашқы 64 КБ ішіндегі жаңа орынға жылжыту мүмкіндігін қосты. CSG 65CE02 тікелей бетті жаңа базалық бет (B) тіркелімінде 8 биттік офсет мәнін сақтау арқылы алғашқы 64 КБ жадтың ішіндегі кез келген 256 байттық шекараға жылжытуға мүмкіндік берді. Motorola 6809 өзінің тікелей бет (DP) тіркелімімен осылай істей алады. WDC 65816 одан да бір қадам басып, тікелей бетті жаңа тікелей (D) тіркелімінде 16 биттік офсет мәнін сақтау арқылы алғашқы 64 КБ жадтың ішіндегі кез келген орынға жылжытуға мүмкіндік берді. Осының нәтижесінде, тек 0 беттік адрестеу режимін қолдайтын ескі процессорлармен салыстырғанда, көптеген бағдарламалар жақсартылған тікелей бет адрестеу режимін пайдалана алды.

Шектіліктерді тексерумен масштабталған индекс

Бұл индекстік масштабтауға ұқсас, бірақ команданың екі қосымша операндысы (көбінесе тұрақты шамалар) болады, және аппараттық құрал индекс мәні осы шектер аралығында екенін тексереді. Тағы бір түрі шектерді сақтау үшін векторлық сипаттамаларды пайдаланады; бұл динамикалық түрде бөлінген массивтерді жүзеге асыруды жеңілдетеді және толық шектерді тексеруді сақтайды.

Word ішіндегі бит өрісіне жанама

Кейбір компьютерлерде сөздердің ішкі тармақтары үшін арнайы жанама адрестеу режимдері болды. GE/Honeywell 600 сериялы машиналардың символдарды жанама түрде атаулары 36 биттік сөз ішінде 6 немесе 9 биттік символдар тармағын көрсететін. DEC PDP 10, сондай-ақ 36 биттік, жадты 1 биттен 36 битке дейінгі кез келген мөлшердегі биттік тармақтар немесе байттар тізбегі ретінде қарауға мүмкіндік беретін арнайы командаларға ие болды. Жадтағы бір сөздік тізбек сипаттамасы, "байт көрсеткіші" деп аталатын, тізбектегі ағымдағы сөз мекенжайын, сөз ішіндегі бит позициясын және әр байттың мөлшерін сақтайды. Осы сипаттама арқылы байттарды жүктеу және сақтау, сондай-ақ сипаттаманы келесі байтқа бағыттау үшін арттыру командалары болды (байттар сөз шекараларында бөлінбеді). Көптеген DEC бағдарламалық құралдары бір сөздікке 5 7 биттік байтты (қарапайым ASCII символдары) пайдаланды, ал сөздің бір биті қолданылмады. C тілінің іске асырылымдары сөздікке төрт 9 биттік байтты пайдалануға тиіс болды, себебі C тіліндегі 'malloc' функциясы int мөлшерінің char мөлшерінің еселігін деп есептейді; нақты еселік жүйеге тәуелді компиляция уақытындағы sizeof операторы арқылы анықталады.

Келесі нұсқауды индекстеу

Elliott 503, Elliott 803 және Apollo Guidance Computer тек абсолюттік адрестеуді қолданды және индекстік тіркелімдері болған жоқ. Сондықтан, жанама секірулер немесе тіркелімдер арқылы секірулер нұсқаулар жиынтығында қолдау көрсетілмеді. Оның орнына, келесі нұсқауға ағымдағы жад сөзінің мазмұнын қосуға бұйырық беруге болады. Келесі орындалатын нұсқауға шағын мәнді қосу арқылы, мысалы, JUMP 0 нұсқауын JUMP 20 нұсқауына өзгертуге болады, осылайша индекстелген секірудің әсерін тудыруға болады. Назар аударыңыз: нұсқау орындалу кезінде өзгереді, бірақ жадыда өзгертілмейді, яғни бұл өзін-өзі өзгертетін код емес. Келесі нұсқауға қосылатын мән жеткілікті түрде үлкен болса, ол сол нұсқаудың операциялық кодын немесе адресін өзгерте алады.