На каком языке написан набор инструкций процессора

Обновлено: 05.07.2024

У каждого компьютера есть ISA (архитектура набора инструкций), которая представляет собой набор регистров, инструкций и других функций, видимых его программистам низкого уровня.

Эту ISA обычно называют как машинный язык, хотя этот термин не совсем точен.

Программа на этом уровне абстракции представляет собой длинный список двоичных чисел, по одному на инструкцию, указывающих, какие инструкции выполнять и каковы их операнды.< /p>

ISA включает инструкции и регистры. Насколько мне известно, инструкция состоит из кода операции (т.е. операции) и операнда(ов). Код операции слишком мал, чтобы быть членом ISA?

Насколько мне известно, язык программирования — это набор некоторых программ. Значит, машинный язык — это тоже набор каких-то программ?

В чем разница между ISA и машинным языком? Дело в том, что машинный язык — это набор программ, а ISA — это не набор программ, а набор более базовых единиц (например, регистров, инструкций), которые вместе образуют программы?


Что вы имеете в виду под «языком программирования — это набор некоторых программ»? Вы имеете в виду набор всех программ, которые можно написать на этом языке? Обратите внимание, что это бесконечный набор, даже если вы удалите предложения-заполнители.

В качестве быстрого конкретного примера, чтобы различить эти два понятия: в машинных языках почти всегда есть псевдоинструкции. Это инструкции, которые на самом деле представляют собой последовательность команд, выполняемых ЦП. Поскольку команды, отправляемые в ЦП (ISA), не идентичны командам, введенным в код (машинный язык), можно сказать, что технически они не совпадают.

3 ответа 3

Похоже, вы позаимствовали некоторые слова из теоретической информатики (относительно слов «множество» и «язык») и попытались использовать их для интерпретации описания в учебнике компьютерных систем более низкого уровня (ЦП и аппаратного обеспечения).< /p>

Слово "набор" в слове "архитектура набора инструкций" относится к набору предопределенных кодов операций, допустимых для данной архитектуры ЦП.

Например, на этой странице (списки инструкций x86 в Википедии) перечислены коды операций, которые можно ожидать в различных поколениях архитектуры IA32. Каждый код операции является членом этого «набора инструкций».

Когда автор говорит ". не совсем точно", я предполагаю, что он имеет в виду тот факт, что не существует грамматики, которую можно было бы ожидать от последовательности машинных инструкций.

Чтобы уточнить, ЦП считывает байты инструкции, и, если это допустимая машинная инструкция, она будет выполнена. В противном случае, как правило, будет сгенерировано аппаратное исключение "недопустимая инструкция", которое остановит текущее выполнение и передаст управление другой программе (возможно, принадлежащей операционной системе).

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

Машинные инструкции, присутствующие в большинстве скомпилированных программ, имеют определенную структуру; однако не все это делают. ЦП с радостью выполнит «спагетти-последовательность машинных инструкций», выполняя безусловные или условные переходы по мере их обнаружения; и до недавнего времени последовательность машинных инструкций могла изменять свои части.

Некоторые инструкции ЦП предназначены для облегчения структурного программирования:

  • регистр стека и инструкции push/pop
  • регистр адреса возврата и инструкции вызова/возврата для выполнения подпрограмм (также известных как процедуры или функции)
  • инструкции цикла (увеличение или уменьшение регистра, проверка предела, а затем переход к указанному адресу, если предел не достигнут)
  • инструкции копирования строки (инструкция цикла, которая многократно копирует байты из одного диапазона адресов в другой диапазон адресов)

Несмотря на то, что некоторые из этих инструкций образуют пары (push vs pop, call vs return), на самом деле правильная последовательность машинных инструкций не обязательно должна соответствовать этим парам. То есть можно было бы записать следующее значение счетчика программы в адрес памяти, на который указывает регистр стека (имитация нажатия), а затем выполнить переход в начало подпрограммы (что вместе с предыдущим нажатием становится имитацией). вызова подпрограммы). Подпрограмма может использовать обычную инструкцию возврата.

Языки ассемблера изначально разрабатывались с учетом однозначного соответствия между мнемоникой и инструкциями машинного языка, как показано в этом примере. 1 Перевод с мнемоники на машинный язык стал задачей системной программы, известной как ассемблер.Со временем ассемблеры были дополнены сложными средствами «расширения макросов», позволяющими программистам определять параметризованные аббревиатуры для общих последовательностей инструкций. Однако соответствие между языком ассемблера и машинным языком оставалось очевидным и явным. Программирование по-прежнему было машиноцентричным предприятием: каждый тип компьютера должен был быть запрограммирован на своем собственном языке ассемблера, и программисты думали с точки зрения инструкций, которые машина фактически выполняла.

Аппаратные ускорители для искусственного интеллекта и машинного обучения

3.4 Архитектура набора команд Quantum (Q-ISA)

В то время как многие компьютерные архитекторы могут интерпретировать функцию архитектуры набора инструкций (ISA) как простой вывод инструкций, которые должны выполняться процессором. В действительности, архитектура набора инструкций фактически отвечает за абстракцию данных. Чем лучше ISA, тем более совершенным является процесс абстракции. Здесь термин лучше относится к ряду аспектов ISA, включая длину инструкции (например, RISC или CISC), ее характер пропускной способности (т. е. находится ли она в домене SIMD, SISD и т. д.), количество требуемых инструкций. для выполнения основных логических операций и многое другое. Все эти характеристики в совокупности определяют понимание данной проблемы вашей системой обработки. В зависимости от требуемого порядка дифференцирования для основных логических операций мы можем рассчитать производительность процессорного блока. Классические логические элементы и схемная модель предназначены для обучения и получения определенных и жестких результатов. Это также указывает на то, что даже классические универсальные ворота не позволят пользователю столкнуться с каждым результатом, поскольку они связаны с точки зрения математики и классической механики. И наоборот, квантовые вентили и модель схемы предназначены для обучения и получения наиболее вероятного результата (при сохранении истинной универсальной природы). Следовательно, природа логических вентилей и моделей цепей ограничивает концепцию универсальности.

Как показано в предыдущих разделах, существует ряд языков высокого уровня, на которых можно выполнять квантовое программирование. Но компиляторы для всех этих языков конвертируют их в какой-то вариант языка квантового ассемблера (QASM) [38]. Подобно эволюции языков программирования в области квантовых вычислений, QASM также необходимо стандартизировать для успешного будущего действия. Некоторые Q-ISA, доступные в настоящее время, включают в себя архитектуру набора виртуальных команд на основе архитектуры фон-Неймана, иерархический QASM с циклами (QASM-HL), Quil от Rigetti Computing [39], язык квантовых физических операций (QPOL) и OpenQASM от IBM и т. д. Поскольку описание их микроархитектуры сильно различается, эти Q-ISA созданы без учета последствий более низкого уровня для взаимодействия с квантовым процессором. Можно четко установить, что в данной Q-ISA отсутствует общая явная структура и принципы управления (этот факт будет дополнительно освещен в разделе, посвященном микроархитектуре).

В настоящее время Quil ISA от Rigetti Computing представляет собой один из наиболее близких Q-ISA, который находится в процессе превращения в идеальный стандарт для справки. Его можно сравнить с OpenQASM 3.0 от IBM, который выйдет в 2021 году. Rigetti Computing назвала эту базовую архитектуру инструкций квантовой абстрактной машиной (QAM). Цель состоит в том, чтобы уловить суть как квантовых вычислений, так и обычной вычислительной логики в уникальном наборе инструкций, чтобы поддержать абстракцию кванта сущностей и дифференцировать его до классического уровня для понимания пользователем. QAM можно рассматривать как квантовую машину Тьюринга (QTM) [40,41], но более практичную для решения реальных задач. Например, давайте разработаем схему квантового преобразования Фурье (КТП) (рис. 11).

Рис. 11 . Схема квантового преобразования Фурье с 4 кубитами. Схема применяет QFT к | 1010 > и меры в расчетной основе. Вывод читается в обратном порядке c[3], c[2], c[1], c[0] [33] .

// квантовое преобразование Фурье

Написание шеллкода I

Джеймс К. Фостер , Майк Прайс , Sockets, Shellcode, Porting, & Coding , 2005 г.

Обзор

Язык ассемблера является ключевым компонентом в создании эффективного шеллкода. Язык программирования C генерирует код, содержащий все виды данных, которые не должны попадать в шелл-код. В языке ассемблера каждая инструкция буквально транслируется в исполняемые биты, понятные процессору.

Выбрав правильный шеллкод для компрометации и бэкдора, хост часто может определить успех атаки. В зависимости от шелл-кода, используемого злоумышленником, эксплойт с гораздо большей (или меньшей) вероятностью будет обнаружен сетевой или хостовой IDS/IPS (системой обнаружения вторжений/системой предотвращения вторжений).

Данные, хранящиеся в стеке, могут в конечном итоге перезаписаться за пределы выделенного пространства и, таким образом, перезаписать значения в регистре, в результате чего изменится путь выполнения. Изменение пути выполнения, указывающего на отправленную полезную нагрузку, может помочь в выполнении команд. Уязвимости безопасности, связанные с переполнением буфера, составляют наибольшую долю уязвимостей в индустрии уязвимостей информационной безопасности. Хотя уязвимости программного обеспечения, приводящие к переполнению стека, в наши дни не так распространены, они все же встречаются в программном обеспечении.

Зная о переполнении стека и понимая, как писать эксплойты с этим знанием, нужно быть достаточно вооруженным, чтобы просматривать опубликованные рекомендации и писать для них эксплойты. Целью любого эксплойта для Windows всегда является получение контроля над EIP (текущий указатель инструкции) и указание его на вредоносный код или шелл-код, отправленный эксплойтом для выполнения команды в системе. Чтобы избежать проблем с нулевыми байтами, можно использовать такие методы, как XOR или переключение битов. Чтобы стабилизировать код и заставить его работать в нескольких версиях операционных систем, можно использовать обработчик исключений для автоматического определения версии и ответа соответствующим шелл-кодом. Функциональность этого мультиплатформенного шеллкода намного превышает добавленную длину и объем кода.

Языки программирования

13.1.1 Язык ассемблера

Язык ассемблера (или ассемблер) — это скомпилированный компьютерный язык низкого уровня. Он зависит от процессора, поскольку он в основном переводит мнемонику Ассемблера непосредственно в команды, понятные конкретному ЦП, на взаимно однозначной основе. Эти мнемоники Ассемблера представляют собой набор инструкций для этого процессора. Кроме того, ассемблер предоставляет команды, которые управляют процессом сборки, обрабатывают инициализацию и позволяют использовать переменные и метки, а также управлять выводом.

На ПК Ассемблер обычно используется только в MS-DOS. При работе в 32-разрядной операционной системе защищенного режима (включая Windows 95/NT и выше) низкоуровневые программы, которые напрямую обращаются к регистрам или ячейкам памяти, вызывают нарушения защиты. Весь низкоуровневый доступ должен осуществляться с помощью соответствующих программных драйверов.

Для ПК с MS-DOS самым популярным языком ассемблера был Microsoft Macro Assembler или MASM. Как и большинство популярных компиляторов, MASM регулярно обновлялся. Большая часть этого обсуждения относится к версии 5.0 или более поздней версии, в которой упрощено использование определенных директив и включена поддержка инструкций, доступных только на процессорах 80286 и 80386.

директива — это команда Ассемблера, которая не преобразуется в исполняемую инструкцию, а предписывает MASM выполнить определенную задачу, облегчающую процесс сборки. Исполняемую инструкцию иногда называют кодом операции, а директиву ассемблера можно назвать псевдокодом операции. Директивы могут сообщать MASM много разных вещей, в том числе о том, к какому сегменту памяти относится ссылка, каково значение переменной или ячейки памяти и где начинается выполнение программы.

Одной из важных директив MASM является .MODEL, которая определяет максимальный размер программы. Помните, что для ЦП семейства 80×86 память адресуется как сегменты длиной до 64 Кбайт. Если используется 16-битная адресация (для кода или данных), будет доступен только один сегмент размером 64 КБ. Модель памяти программы определяет, как различные части этой программы (код и данные) получают доступ к сегментам памяти. MASM для программ DOS поддерживает пять моделей памяти: Small, Medium, Compact, Large и Huge. В модели Small все данные помещаются в один сегмент размером 64 КБ, а весь код (исполняемые инструкции) помещается в другой сегмент размером 64 КБ. В модели Medium все данные помещаются в один сегмент размером 64 КБ, но код может быть больше 64 КБ (многосегментный, требующий 32-битной адресации для сегмента:смещение). В компактной модели весь код помещается в один сегмент размером 64 КБ, но данные могут занимать более 64 КБ (но ни один массив не может превышать 64 КБ). В большой модели размер кода и данных может превышать 64 КБ (тем не менее размер отдельного массива данных не может превышать 64 КБ). Наконец, в модели Huge размер кода и данных может превышать 64 КБ, а массивы данных также могут превышать 64 КБ.

Поскольку более крупные модели требуют больших адресов, они создают более крупные и медленные программы, чем модели меньшего размера. Выбирая модель для программы, постарайтесь оценить максимальный объем памяти, который вам потребуется. Допустим, вы пишете программу быстрого преобразования Фурье, используя 16-разрядную целочисленную математику и максимальный размер выборки 2048 точек. Поскольку для каждой точки требуется два целых числа (действительное и мнимое) и каждое целое число имеет длину 2 байта, вам потребуется 8096 байт только для хранения входных (или выходных) данных. Даже если бы у вас были отдельные массивы для входных и выходных данных, это все равно было бы всего 16 192 байта. В качестве запаса прочности для временного хранения мы удвоим это число до 32 384 байт, что составляет лишь половину сегмента размером 64 КБ.Сложнее оценить размер кода. В этом примере мы начнем с модели Small. Если код оказывался больше 64К (что непросто сделать на ассемблере), мы переходили на модель Medium. Эти же модели памяти применимы и к компиляторам языка высокого уровня для DOS от Microsoft. Если вы пишете программу MASM для работы с другим языком высокого уровня, вы должны использовать одну и ту же модель памяти для обоих.

Вот пример простой программы MASM, которая отображает текстовую строку («Это простая программа MASM») на экране с помощью функции DOS 09h:

< бр />

Здесь используется несколько директив. DOSSEG приказывает MASM позаботиться о порядке различных сегментов (код, данные, стек) — деталь, которую мы предпочли бы проигнорировать. Директива .DATA указывает на начало сегмента данных, а .CODE указывает на начало сегмента кода. На сообщение ссылается метка текст, где директива DB (определяет байты) указывает, что это байтовые данные (кавычки указывают на текст ASCII). Строка должна заканчиваться символом ASCII 24h ("$") для функции DOS 09h. Исполняемые инструкции помещаются в сегмент кода. Ярлык go указывает на начало программы. Адрес текстовой строки загружается в регистры DS:DX. Затем вызывается функция DOS 09h для отображения строки. Наконец, вызывается функция DOS 4Ch для выхода из программы и возврата в DOS. Последняя директива END указывает MASM начать выполнение программы с метки (адреса) go.

MASM называется ассемблером макросов, поскольку он поддерживает использование макросов. макрос – это блок операторов программы, которому дается символическое имя, которое затем можно использовать в обычном программном коде. Макрос также может принимать параметры, когда он вызывается в программе. Когда исходный файл собирается с помощью MASM, все макросы расширяются (переводятся) в исходный текст определения. Это очень удобно, если один и тот же участок кода, например функция, определяемая программистом, используется многократно. Часто предопределенные макросы могут храниться в отдельном файле вместе с другой информацией, такой как инициализация переменных. Директива INCLUDE может считывать этот файл во время сборки.

Этот краткий обзор MASM лишь немного коснулся языка ассемблера. Проверьте библиографию на наличие других книг на эту тему. Опять же, вам следует писать программу на языке ассемблера, только если вы работаете в DOS и язык высокого уровня не подходит для вашей задачи. Даже в этом случае вы обычно можете просто написать наиболее важные разделы в MASM и вызвать их из языка высокого уровня. Далее мы рассмотрим популярный интерпретируемый язык высокого уровня: BASIC.

Оптимизация программного обеспечения DSP

Последовательная реализация

Вывод на языке ассемблера для этого простого цикла показан на рис. 6.29. Это последовательная реализация цикла C на языке ассемблера; последовательный в том смысле, что в коде не происходит настоящего параллелизма (использования других ресурсов процессора). Это легко увидеть по обилию NOP-операций в коде. Эти NOP-инструкции ничего не делают, кроме ожидания и сжигания циклов процессора. Они необходимы и вставляются в код, когда ЦП ожидает завершения выборки или записи памяти. Поскольку операция загрузки занимает пять циклов ЦП, за операцией загрузки слова в строке 4 (LDW) следует NOP длиной 4, указывающий, что теперь ЦП должен ждать четыре дополнительных цикла для поступления данных в соответствующий регистр. прежде чем его можно будет использовать.

Рисунок 6.29. Вывод простого цикла на ассемблере

Эти NOP чрезвычайно неэффективны, и программист должен постараться удалить как можно больше таких слотов задержки, чтобы повысить производительность системы. Один из способов сделать это — воспользоваться преимуществами других функциональных ресурсов DSP.

Введение

Уильям Дж. Бьюкенен (BSc, CEng, PhD) в области разработки программного обеспечения для инженеров, 1997 г.

13.5.2 Шестнадцатеричные и восьмеричные числа

В языке ассемблера двоичные числа представляются с продолжением b, например, 010101111010b и 101111101010b являются двоичными числами. Двоичные цифры часто обычно представляются в шестнадцатеричном (основание 16) или восьмеричном (основание 8) представлении. В таблице 13.2 показано основное преобразование между десятичными, двоичными, восьмеричными и шестнадцатеричными числами. В языке ассемблера шестнадцатеричные числа имеют начало h, а восьмеричное число — O. Например, 4 3 F1h — шестнадцатеричное число, а 4 310o — восьмеричное.

Таблица 13.2. Десятичные, двоичные, восьмеричные и шестнадцатеричные преобразования

< /tr>< td >1110
ДесятичныйДвоичныйвосьмеричныйшестнадцатеричный
0000000
1 000111
2001022
3001133
4010044
5< /td>010155
60110 66
701117 7
81000108
91001119
10101012A
11101113< /td>B
12110014C
13110115D
14 16E
15111117 F

Чтобы представить двоичную цифру в виде шестнадцатеричного значения, двоичные цифры разбиваются на группы по четыре бита (начиная с младшего значащего бита). Шестнадцатеричное эквивалентное значение затем заменяет каждую из двоичных групп. Например, чтобы представить 0111010111000000b, биты разбиты на секции по 4, чтобы получить:

Таким образом, 75C0h представляет собой двоичное число 0111010111000000b . Чтобы преобразовать десятичное число в шестнадцатеричное, десятичное значение рекурсивно делится на 16 и отмечается каждый остаток. Первый остаток дает младшую значащую цифру, а последний остаток — старшую значащую цифру. Например, ниже показан шестнадцатеричный эквивалент десятичного числа 1103:

< бр />

Таким образом, десятичное значение 110 3 эквивалентно 0 4 4 Fh .

В C шестнадцатеричным значениям предшествует 0 (ноль) и символ «x» ( 0x ), а перед восьмеричным числом — ноль 0 (ноль). В Паскале знак доллара используется для обозначения шестнадцатеричного значения, например $C4. В Таблице 13.3 приведены некоторые примеры форматов.

Раздел 404 Закона Сарбейнса-Оксли (SOX) требует, чтобы все публичные компании установили внутренний контроль и процедуры.

Закон о защите конфиденциальности детей в Интернете от 1998 года (COPPA) – это федеральный закон, который налагает особые требования на операторов доменов .

План North American Electric Reliability Corporation по защите критически важной инфраструктуры (NERC CIP) представляет собой набор стандартов.

Взаимная аутентификация, также называемая двусторонней аутентификацией, представляет собой процесс или технологию, в которой оба объекта обмениваются данными .

Экранированная подсеть или брандмауэр с тройным подключением относится к сетевой архитектуре, в которой один брандмауэр используется с тремя сетями .

Метаморфное и полиморфное вредоносное ПО – это два типа вредоносных программ (вредоносных программ), код которых может изменяться по мере их распространения.

Медицинская транскрипция (МТ) – это ручная обработка голосовых сообщений, продиктованных врачами и другими медицинскими работниками.

Электронное отделение интенсивной терапии (eICU) — это форма или модель телемедицины, в которой используются самые современные технологии.

Защищенная медицинская информация (PHI), также называемая личной медицинской информацией, представляет собой демографическую информацию, медицинскую .

Снижение рисков – это стратегия подготовки к угрозам, с которыми сталкивается бизнес, и уменьшения их последствий.

Отказоустойчивая технология — это способность компьютерной системы, электронной системы или сети обеспечивать бесперебойное обслуживание.

Синхронная репликация — это процесс копирования данных по сети хранения, локальной или глобальной сети, поэтому .

Интерфейс управления облачными данными (CDMI) – это международный стандарт, определяющий функциональный интерфейс, используемый приложениями.

Износ флэш-памяти NAND — это пробой оксидного слоя внутри транзисторов с плавающим затвором флэш-памяти NAND.

Выносливость при записи — это количество циклов программирования/стирания (P/E), которое может быть применено к блоку флэш-памяти перед сохранением .

Раздел 404 Закона Сарбейнса-Оксли (SOX) требует, чтобы все публичные компании установили внутренний контроль и процедуры.

Закон о защите конфиденциальности детей в Интернете от 1998 года (COPPA) – это федеральный закон, который налагает особые требования на операторов доменов .

План North American Electric Reliability Corporation по защите критически важной инфраструктуры (NERC CIP) представляет собой набор стандартов.

Взаимная аутентификация, также называемая двусторонней аутентификацией, представляет собой процесс или технологию, в которой оба объекта обмениваются данными .

Экранированная подсеть или брандмауэр с тройным подключением относится к сетевой архитектуре, в которой один брандмауэр используется с тремя сетями .

Метаморфное и полиморфное вредоносное ПО – это два типа вредоносных программ (вредоносных программ), код которых может изменяться по мере их распространения.

Медицинская транскрипция (МТ) – это ручная обработка голосовых сообщений, продиктованных врачами и другими медицинскими работниками.

Электронное отделение интенсивной терапии (eICU) — это форма или модель телемедицины, в которой используются самые современные технологии.

Защищенная медицинская информация (PHI), также называемая личной медицинской информацией, представляет собой демографическую информацию, медицинскую .

Снижение рисков – это стратегия подготовки к угрозам, с которыми сталкивается бизнес, и уменьшения их последствий.

Отказоустойчивая технология — это способность компьютерной системы, электронной системы или сети обеспечивать бесперебойное обслуживание.

Синхронная репликация — это процесс копирования данных по сети хранения, локальной или глобальной сети, поэтому .

Интерфейс управления облачными данными (CDMI) – это международный стандарт, определяющий функциональный интерфейс, используемый приложениями.

Износ флэш-памяти NAND — это пробой оксидного слоя внутри транзисторов с плавающим затвором флэш-памяти NAND.

Выносливость при записи — это количество циклов программирования/стирания (P/E), которое может быть применено к блоку флэш-памяти перед сохранением .

Читайте также: