Как 8-битные и 16-битные процессоры получают доступ к большему объему оперативной памяти с помощью двух регистров?

Что меня всегда смущало, так это то, как 8-битные компьютеры получают доступ к более чем 256 байтам ОЗУ. Я знаю, что он должен использовать два регистра, но может ли кто-нибудь показать мне пример того, как это будет выглядеть в ассемблере?

Нравиться:

mov a, [x]   ???

person Sloan Fitzgerald    schedule 02.12.2012    source источник
comment
Обратите внимание также на разрядность шины данных и разрядность адресной шины. Размер шины данных часто используется, когда речь идет о 8/16/32-битном процессоре. Но адресная шина может быть разного размера. Многие старые 8-битные ЦП имеют 16-битную адресную шину и, следовательно, могут получить доступ к более чем 256 байтам ОЗУ.   -  person David J    schedule 03.12.2012


Ответы (4)


Представим, что у нас есть МЛАДШАЯ и СТАРШАЯ 8-битная половина адреса в регистрах L и H. Например, мы хотим прочитать байт с адреса 32770 dec = 8002 hex.

mov l, 02h  ;lower byte of address
mov h, 80h  ;higher byte of address
mov a, [hl] ;a <-- [h*256 + l]

В ЦП существует множество режимов адресации. Таким образом, у нас может быть другой пример, например. всего с одним регистром и непосредственным адресом:

mov h, 80h
mov a, [2]  ;a <-- [h*256 + immediate]

Это всегда зависит от конкретной архитектуры процессора. Например, Zilog Z80 называется 8-битным процессором, но он также содержит множество 16-битных инструкций. Вы можете сделать индексированную адресацию на нем следующим образом:

mov ix, 8002h  ;base address of an array
mov a,[ix+20]  ;a <-- [ix + 20] i.e. read a byte from an array like ix[20] in C

Примечание. Эти старые 8-битные процессоры используют 8-битный аккумулятор, т. е. они могут выполнять математические и другие арифметические операции только в 8-битном регистре, поэтому они являются 8-битными на уровне программных вычислений. . И их модуль доступа к памяти является 8-битным, т.е. он может читать или записывать только один байт памяти за раз, поэтому они также являются 8-битными на аппаратном уровне. Эти 16-битные инструкции медленные, они фактически выполняют пару 8-битных операций подряд.

person Al Kepp    schedule 02.12.2012
comment
Спасибо! Я всегда думал, что если у вас есть две пары регистров, которые составляют слово, то у вас 16-битный процессор, думаю, я ошибался! - person Sloan Fitzgerald; 03.12.2012

Давайте рассмотрим 8080 (Z80 и т. Д.), У него были 8-битные регистры, но он мог объединять регистры, чтобы они действовали как 16-битные регистры. Вероятно, наиболее часто используемой парой была HL, которая была H для 8 старших битов и L для 8 младших битов адреса. Другими парами регистров были BC и DE — опять же, большинство инструкций одновременно работали только с одним регистром из пары, но некоторые могли использовать пару вместе для работы с 16-битными величинами (например, если память не изменяет, по крайней мере, был один, чтобы добавить DE к HL).

Некоторые инструкции также могут напрямую использовать 16-битные адреса:

jmp 01234h

6502 был примерно таким же, но он ограничивал некоторые инструкции работой с первыми 256 байтами ОЗУ (также известными как «Страница 0»). Однако более поздние версии (65816?) поддерживали выбор разных физических адресов, которые будут рассматриваться как страница 0.

person Jerry Coffin    schedule 02.12.2012
comment
65816 также был 16-битным процессором, как только вы очистили биты 4 и 5 в регистре состояния (REP $30). Однако у него был регистр D, IIRC, который он объединял с X или Y для формирования 24-битного адреса. - person cHao; 03.12.2012

Для этого существует множество способов

Intel 8080 — это 8-разрядный ЦП с двумя регистрами H и L для косвенной адресации, что позволяет ему адресовать 16-разрядную память. 16-битный 8086 имеет 20-битный адрес с сегментацией. 80286 использует 24-битный адрес, а старший 16-битный сегмент является индексом в таблице дескрипторов сегментов. 32-битный x86 использует 36-битный адрес с PAE...

Микроконтроллеры PIC имеют 8-битное значение в регистрах, которое объединяется со старшими битами в ПК (или какой-то специальный адресный регистр, насколько я не помню), чтобы сформировать 13-битный адрес (или больше, зависит от архитектуры)

Другим распространенным способом в микроконтроллерах (некоторые микропроцессорные архитектуры) является банкинг, при котором вы меняете "память window», которое ЦП может видеть каждый раз.

  • Intel 8051 имеет 4 банка регистров, общий из которых всегда виден, а остальные могут быть выбраны командой переключения банков. Некоторые версии могут использовать банкинг для кодового адреса, расширяя его до 2 МБ кода.
  • DOS использует банки памяти в EMS и XMS для сопоставления большей памяти с младшими адресами для доступа к более чем 1 МБ или ОЗУ.
  • 32-разрядная версия Windows использует расширения оконной адресации. в режиме PAE, чтобы разрешить 32-разрядным процессам доступ к более чем 2 ГБ ОЗУ.

Для получения дополнительной информации вы можете прочитать здесь

person phuclv    schedule 27.01.2014

У 6502 были индексированные инструкции чтения памяти lda $01200,Y и lda $1413,X, где 16-битный адрес был закодирован как часть инструкции. В любой момент такая инструкция видела окно в 256 байт. Чтобы получить доступ к следующим 256 байтам, сама инструкция была изменена, чтобы читать, например, lda $1300,Y.

Затем 8086 имел сегментированную архитектуру, где каждый доступ к памяти связан с неявным или явным сегментным регистром. mov reg,[bp] и push/pop связаны с сегментом стека ss, [rep] movs связаны с ds:[si], es:[di]; Счетчик программ/переходы связаны с сегментом кода cs.

Физический адрес в режиме 8086 рассчитывается как stack_reg * 16 + offset, где попытка чтения слова в seg_reg:[ffff] вызывает исключение нарушения сегмента.

Графика VGA в архитектуре 8086 была реализована с отображением памяти сегмента 64k на ISA-шину. Кроме того, запрограммировав аппаратное обеспечение с помощью инструкций ввода/вывода, можно было выбрать другую страницу размером 64 КБ на графической плате. Таким образом, можно было выйти за рамки ограничения VGA 320x200x256 цветов до 640x480 SVGA.

person Aki Suihkonen    schedule 03.12.2012
comment
8088 был особенно интересным процессором. 8-битная шина данных, 16-битные регистры, 20-битная адресная шина и (с установленным сопроцессором 8087) 80-битные регистры с плавающей запятой! - person Brian Knoblauch; 03.12.2012