Адрес доступа RISC больше наибольшего целочисленного регистра

Допустим, вы используете 32-битную RISC-систему. Какие инструкции вы бы использовали для доступа к 64-битному адресу памяти?

В наборе инструкций CISC вы можете просто передать дополнительное слово, используя инструкцию, состоящую из нескольких слов. Например:

1a) JMP
1b) loAddress
1c) hiAddress

Учитывая, что каждая инструкция RISC состоит только из одного слова, как бы вы получили доступ к адресу, состоящему из нескольких слов?

Предположим, что ALU является 32-битным и имеет флаг переноса.

Кроме того, в системе CISC (например, 8080) слова loAddress и hiAddress будут хранится в памяти программ. т.е. инструкция JMP знает, что нужно искать следующий элемент в программной памяти, чтобы получить loAddress, и элемент после этого, чтобы получить hiAddress. Что происходит в RISC?


person Jet Blue    schedule 07.06.2018    source источник
comment
Если ваши регистры только 32-битные, вам, вероятно, нужна специальная инструкция, использующая пару регистров. В качестве альтернативы вы можете выбрать банк памяти в зависимости от архитектуры, например. запись в контрольный регистр. Опять же, в вашем примере используется JMP, так что это означает, что по крайней мере ваш PC является 64-битным, поэтому, возможно, у вас есть 64-битные регистры, где вы можете просто использовать косвенный переход.   -  person Jester    schedule 07.06.2018
comment
Также ваш заголовок не имеет для меня особого смысла, ваш адрес явно не больше, чем адресное пространство.   -  person Jester    schedule 07.06.2018
comment
Что касается JMP, я думал о чем-то вроде команды JMP в 8-битном 8080. Она загружает hiAddress (один байт) в один регистр, а loAddress (один байт) в другой.   -  person Jet Blue    schedule 07.06.2018
comment
Я обновил заголовок. Кроме того, я спрашиваю в общем смысле, поскольку я больше знаком с инструкциями CISC, чем с RISC.   -  person Jet Blue    schedule 07.06.2018
comment
@downvoter, было бы неплохо объяснить отрицательное голосование. Я более чем готов принять любой совет, необходимый для улучшения вопроса.   -  person Jet Blue    schedule 07.06.2018
comment
Ваш вопрос основан на ложном предположении. Архитектуры RISC могут иметь инструкции переменной длины (например, ARM в режиме Thumb), а архитектуры CISC могут иметь инструкции фиксированной длины.   -  person    schedule 08.06.2018
comment
@duskwuff Я не знал об этом. У меня сложилось впечатление, что RISC поместил все необходимое для выполнения инструкции (например, JMP) в одно слово (это ключевое отличие между ним и CISC).   -  person Jet Blue    schedule 08.06.2018
comment
@JetBlue Нет, совсем нет. Хотя верно то, что во многих проектах RISC используется командное слово фиксированной длины, это не обязательно.   -  person    schedule 08.06.2018


Ответы (2)


Даже на CISC то, что вы описываете, довольно необычно. Это не из-за того, что это CISC, а из-за того, что адреса используются шире, чем регистры. Обычно это встречается только в 8-битных процессорах. (Хотя сегментация x86 также подходит, с непрямыми дальними переходами, принимающими указатель на пару сегмент/смещение m16:32. Или в 16-битном режиме, m16:16. Поскольку используется обратный порядок байтов, смещение идет первым.) Вне 64-битного режима jmp ptr16:32 также кодируется с абсолютным сегментом: смещение как часть потока инструкций.)

Обычно, когда вы хотите спроектировать ЦП с большим адресным пространством, вы также расширяете регистры, чтобы можно было эффективно работать с адресами. Это только на самом низком уровне, когда вы хотите сэкономить транзисторы, используя в основном 8-битные регистры / ALU, но не можете ограничить свое адресное пространство 256 байтами, где вы найдете такой дизайн.


Здесь существует реальная проблема, даже когда размер адреса совпадает с размером слова. Создание произвольных 32-битных (или 64-битных) констант — это проблема, которую разные ISA решают по-разному. ARM часто использует относительную для ПК загрузку из соседнего «буквального пула», в то время как другие часто используют lui или эквивалент для установки старших 16 бит и обнуления остальных, затем ori с 16-битным немедленным. (У ARM есть несколько изящных приемов для кодирования немедленных данных с несколькими установленными битами с использованием сдвинутых/повернутых непосредственных данных.)

Как правило, в RISC, если вам нужно перейти далеко, вам может потребоваться создать адрес в регистре с использованием нескольких инструкций. Затем используйте инструкцию перехода к регистру.

Инструкции ветвления MIPS интересны: у него есть относительные ветвления, которые добавляют смещение со знаком к счетчику программ с довольно большим диапазоном, и инструкции абсолютного перехода, которые заменяют младшие 28 бит PC новым адресом. (Построен из 26-битного непосредственного сдвига влево, потому что MIPS требует выравнивания инструкций, поэтому младшие 2 бита не нужно сохранять.) Как рассчитать целевой адрес перехода и целевой адрес перехода?. Но когда цель недоступна из текущего местоположения с ними, вам нужно jr с адресом в регистре.

В x86-64 также отсутствует 64-битная инструкция относительного перехода. Если вам нужно прыгнуть дальше, чем на +-2 ГБ (не far, как в новом сегменте CS), вам нужен непрямой переход. Обычные инструкции перехода/ветвления по-прежнему используют смещения rel8 или rel32, сохраняя компактность машинного кода. Единственная инструкция, которая может выполнять 64-битную немедленную обработку, это mov-to-register. Нормальная модель кода предполагает, что весь код в одной библиотеке или исполняемом файле находится в пределах 2 ГБ друг от друга, поэтому компоновщик сможет заполнить 32-битные смещения.


8-битный RISC

Единственная известная мне RISC ISA с программным счетчиком шире, чем регистры, — это AVR, микроконтроллер с 8-битными регистрами. Он может обрабатывать пары регистров как 16-битные адреса, а его ПК 16-битный. Он IJMP (косвенный переход) инструкция устанавливает PC = Z (где Z представляет собой пару 8-битных регистров). На AVR с 22-битными программными счетчиками вместо 16 он обнуляется PC(21:16).

EIJMP (расширенный непрямой переход) берет регистр EIND из ввода/вывода место для старших битов ПК, а младшие биты по-прежнему исходят от Z.

Почти все инструкции AVR имеют длину 2 байта, но некоторые версии имеют 4-байтовый jmp Инструкция, которая принимает абсолютный адрес 0..4M для цели перехода.


Обычные RISC-машины с 32-битными регистрами также имеют 32-битные программные счетчики и виртуальные адресные пространства. (Возможно наличие более 4 ГБ физической памяти, но вы не можете отобразить ее все одновременно в одном процессе).

Большинство из них сильно ориентированы на слова по своему дизайну, поэтому все, что им нужно, это jr reg (MIPS) или что-то подобное для перехода к любому возможному адресу, потому что он помещается в один регистр. Это часть уменьшенной сложности, за которую буквально выступает RISC.


В обычном RISC, таком как MIPS, SPARC или PowerPC, 64-битные адреса доступны только в 64-битном расширении ISA, где у вас есть 64-битные целочисленные регистры. Таким образом, вы должны использовать такие инструкции, как MIPS ld $2, 0($3), чтобы выполнить 64-битную загрузку (двойное слово), используя $3 в качестве 64-битного базового адреса. См. этот MIPS- IV Руководство по ISA. (MIPS-III добавил 64-битные расширения с такими инструкциями, как ld и daddu. По-видимому, MIPS-I оставил большую часть своего пространства для кодирования кода операции неиспользованным, поэтому было достаточно места для новых кодов операций для выполнения полных 64-битных операций ALU.)

Некоторые 32-разрядные процессоры добавили расширения для поддержки больших физических адресов без увеличения виртуального адресного пространства. Например, PAE x86 определил новый формат таблицы страниц с 36-битными физическими адресами. Но даже при сегментации один процесс не может одновременно обращаться к более чем 4 ГБ виртуальной памяти. (база + смещение сегмента x86 происходит перед преобразованием virt->phys, создавая 32-битный линейный адрес. Таким образом, это все еще полезно для локального хранилища потока, например, когда [fs:0] является другим линейным адресом в зависимости от этого база сегмента fs потока.)


Расширенная адресация на 32-битных RISC ISA

Пол Клейтон комментирует:

PA-RISC имел «пространственные регистры», которые обеспечивали расширенную адресацию. 32-битный PowerPC имел сегментные регистры, которые выбирались на основе старших 4 битов эффективного адреса из таблицы с 16 элементами (обеспечивая 52-битное виртуальное адресное пространство). Для PA-RISC «SR с 5 по 7 могут быть изменены только кодом, выполняющимся на самом привилегированном уровне». Для PowerPC любой регистр сегмента изменяет требуемую привилегию.

Таким образом, очевидно, что некоторые RISC ISA расширили свою адресацию, прежде чем полностью перейти на 64-битную версию. Но я не знаю подробностей и не планирую тратить время на изучение этого вопроса. Другие ответы приветствуются!

person Peter Cordes    schedule 07.06.2018
comment
Спасибо за ответ. Я не знаком с ISA AVR. Как будет установлен регистр Z? Скажем, например, чтобы сохранить значение 65535 (0xFFFF в обоих байтах). Существуют ли отдельные инструкции для установки каждого члена пары или специальная инструкция для одновременной установки обоих? - person Jet Blue; 08.06.2018
comment
Поиск в Google дал LD ZH, hiByte и LD ZL, loByte - person Jet Blue; 08.06.2018
comment
@JetBlue: на страницах документации AVR есть оглавление. Я немного осмотрелся, и LDI (load-immediate) показывает пример установки Z: clr r31 (zhigh=0)/ldi r30, $F0(zlow=0xF0)/lpm (загрузить константу из памяти программы, используя Z как указатель). Итак, Z равно r31:r30. Несколько инструкций могут работать с целым словом, например adiw ZH:ZL, 63. Так что это ОЧЕНЬ похоже на то, как 8080 может использовать пару 8-битных регистров для некоторых 16-битных операций и в качестве указателя. - person Peter Cordes; 08.06.2018
comment
@JetBlue: я добавил еще кое-что, подумав о том, о чем вы на самом деле спрашивали. Даже полный 32-битный адрес представляет собой проблему в 32-битном командном слове! - person Peter Cordes; 08.06.2018
comment
Спасибо за всю эту дополнительную информацию! =) Придется перечитать пару раз, чтобы все понять. Да, это проблема, которая у меня была. Я пытаюсь получить доступ к большему объему памяти, чем то, что RISC-подобный (инструкции из одного слова) ЦП (16-разрядный доморощенный), который я использую, может напрямую адресовать. - person Jet Blue; 08.06.2018
comment
PA-RISC имел пространственные регистры, обеспечивающие расширенную адресацию. 32-битный PowerPC имел сегментные регистры, которые выбирались на основе старших 4 битов эффективного адреса из таблицы с 16 элементами (обеспечивая 52-битное виртуальное адресное пространство). Для PA-RISC SR с 5 по 7 можно изменить только с помощью кода, выполняющегося на самом привилегированном уровне. Для PowerPC любой регистр сегмента изменяет требуемую привилегию. - person Paul A. Clayton; 08.06.2018
comment
@JetBlue: посмотрите, как AArch64 кодирует непосредственные объекты с поддержкой повторения битового шаблона в 2/4/8/16/32-битных фрагментах или поворота нескольких битов в произвольную позицию. Но, по-видимому, для перемешивания/вращения требуется значительное оборудование, а 32-битные константы с 16-битными инструкциями не имеют большого значения. Но, тем не менее, непосредственные значения ARM32 можно чередовать, а mvn (mov-negated) позволяет создавать 0xff1fffff в одной 16-битной инструкции большого пальца. Немедленное кодирование в режиме большого пальца (16-битные инструкции) может быть поучительным, и, возможно, также MIPS16 (который все еще использует 32-битные регистры) - person Peter Cordes; 08.06.2018
comment
@PaulA.Clayton: Если у вас есть время, это можно расширить до ответа. Пока я скопировал ваш комментарий в свой ответ, но я ничего не знаю о PA-RISC и только немного о PowerPC (например, достаточно, чтобы пожелать, чтобы x86 имел rlwinm для распаковки битовых полей и узких целых чисел). - person Peter Cordes; 08.06.2018

Учитывая, что инструкции RISC состоят только из одного слова

Это неправда. Большинство современных RISC-архитектур имеют набор инструкций переменной ширины или, по крайней мере, специальный режим переменной ширины (ForwardCom, SuperH, MIPS16e, thumb2 в ARM, набор инструкций C в RISC-V... ), хотя в основном они предназначены для сжатия и повышения плотности кода. Это по-прежнему означает, что вы можете сделать так, чтобы ваша RISC-архитектура использовала многословные инструкции.

Даже тогда это не поможет вам, если вы не можете использовать инструкции, которые шире 64 бит (которые слишком велики, чтобы быть практичными). Имея всего два 32-битных слова, вы по-прежнему будете ограничены некоторым смещением вокруг базового адреса вместо полного 64-битного адресного пространства. Но это не должно быть проблемой, потому что почти ни одна отдельная программа не может использовать обширное 64-битное адресное пространство. Вот почему в x86-64 нет инструкций, получающих 64-битный непосредственный адрес, поскольку 32-битного смещения уже достаточно. Таким образом, вы можете сделать то же самое: использовать небольшое непосредственное смещение для большинства ситуаций и использовать пару из 2 регистров, когда вам нужен полный 64-битный адрес.

Как сказал Питер, адреса шире размера слова в основном встречаются только в 8-битных микроконтроллерах. Помимо AVR, он также используется в 8-битных PIC, где счетчик программ равен 13 или 14- немного долго. Инструкции обычно содержат только младшие биты адреса, старшие биты берутся из регистра PC или PCLATH. Если вы не хотите использовать смещение, как указано выше, то замена младших бит напрямую, как это, является альтернативным способом. Очевидно, вам по-прежнему нужен отдельный регистр для старших битов. Но если вас не волнует ортогональность, тогда просто используйте специальный огромный регистр для адресации, например в 8051, 6502 или других старых архитектурах CISC

Существует много других способов поддержки более широкого диапазона адресов, чем размер регистра, как я описал здесь Как 8-битный процессор может поддерживать более 256 байт оперативной памяти?. Одним из них является ограничение виртуального адреса только размером регистра (например, ARM LPAE или x86 PAE), в то время как физический адрес может быть 64-битным. Страницы будут отображены в TLB, и вам не нужно использовать 2 регистра для адресации. Если вы хотите получить доступ к более чем 4 ГБ памяти в этом режиме, просто используйте API, похожий на Windows AWE или использовать несколько процессов (например, как в Adobe Premiere CS4)

person phuclv    schedule 14.02.2020
comment
Я не думаю, что ForwardCom претендует на статус RISC. Идея состоит в том, что ISA может легко декодировать и конвейеризировать, сохраняя при этом преимущества плотности кода CISC (в байтах и ​​в работе на инструкцию). Первый пункт основных моментов заключается в том, что это не RISC и не CISC. Таким образом, он определенно не является вашей первой записью в списке RISC ISA! Но в любом случае, все эти компактные кодировки переменной длины существуют в основном потому, что рынок RISC переместился на встроенные/микроконтроллеры, где размер кода имеет значение, а короткие узкие конвейеры делают декодирование переменной длины дешевым. - person Peter Cordes; 14.02.2020
comment
Таким образом, кодирование переменной длины для RISC - это, по сути, функция, не относящаяся к RISC, которую добавили в реальном мире изначально чистые RISC-процессоры, потому что чистота RISC не продает чипы напрямую. (ARM32 является хорошим примером других функций, не относящихся к RISC, таких как микрокодирование push/pop с растровым изображением регистров.) Обратите внимание, что AArch64 не имеет (AFAIK) режима переменной длины; вы можете получить это, только если запустите код Thumb в 32-битном режиме (на чипах, которые вообще поддерживают 32-битный режим; некоторые из Apple отказались от этого IIRC). Таким образом, для относительно высокой производительности фиксированная длина по-прежнему была выбором в ~ 2010 после многолетнего опыта Thumb. - person Peter Cordes; 14.02.2020