8086 инструкций памяти в память. Для чего они существуют?

Насколько я знаю, инструкция 8086 имеет 3 типа набора инструкций по перемещению данных:

  1. память для регистрации
  2. записать в память
  3. зарегистрироваться для регистрации

Однако вчера я нашел набор инструкций, таких как мовсб и аутсб,
При использовании этих инструкций возможна операция память в память(M2M)!

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

  • Эти инструкции потребляют много циклов ЦП,
  • Эти инструкции требуют использования сегментного регистра в качестве операнда.

И эти операции M2M также можно выполнять с комбинацией вышеперечисленных 1,2,3 типов инструкций.

Вопрос:
Мне трудно согласиться с существованием этих M2M-инструкций.
Они существуют только для создания более коротких ассемблерных кодов?

Архитекторы рассудили, что некоторые общие функции более высокого уровня могут поддерживаться аппаратно. Таким образом, movsb предназначен для реализации memcpy и друзей, а outsb очень полезен при выполнении ввода-вывода на тупых устройствах, которым не хватает вспомогательного оборудования (что было обычным случаем в те далекие времена). Конечно, это не было оригинальной идеей или чем-то подобным - до появления RISC-движения такого рода инструкции были довольно распространены повсюду (кроме действительно маленьких 8-битных "микро").

oakad 08.04.2019 09:34

Обратите внимание, что у 8088/8086 есть перемещение памяти, чип 8237 DMA со времен первых ПК включает функцию передачи памяти в память, используя канал 0 для источника и канал 1 для назначения.

rcgldr 08.04.2019 12:41

@rcgldr Ого, я этого не знал. Кто-нибудь реально использовал эту функцию?

fuz 08.04.2019 17:17

@fuz - я не использовал его. Кажется, я припоминаю, что его тестировали в компании, в которой я работал, возможно, проверяя перемещение памяти dma и/или перемещение памяти процессора на различных настольных компьютерах еще в 1980-х, чтобы получить представление о пропускной способности памяти.

rcgldr 08.04.2019 17:55

@fuz Нет, это было слишком медленно. Обычно контроллер DMA для ПК использовался только для гибких дисков и звуковых карт, для всего остального он был слишком медленным.

Ross Ridge 09.04.2019 01:54

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

Ross Ridge 09.04.2019 02:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
1 146
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Инструкции movs* и cmps* очень удобны, поскольку позволяют выполнять такие распространенные задачи, как копирование данных и сравнение данных.

ins* и outs* по своей природе аналогичны movs*, они просто перемещают данные между памятью и устройствами ввода/вывода. Они особенно полезны для чтения/записи на диск целыми секторами (обычно 512 байт). Конечно, DMA стирают их, поскольку ввод-вывод на основе DMA даже более эффективен, но раньше они не были так распространены, как сегодня.

Моделирование этих инструкций (особенно их повторяющихся форм (ищите префикс rep)) потребовало бы больше кода и было бы медленнее. Отсюда их существование.

Кстати, инструкция xchg и любая другая инструкция чтения-изменения-записи (например, add) с местом назначения в памяти также эффективно являются инструкциями памяти в память. Не все ЦП имеют их, многие в основном предлагают инструкции, которые либо читают из памяти, либо записывают в память, но не оба (исключение составляют инструкции, которые используются для реализации монопольного/атомарного доступа к памяти, подумайте xchg, xadd, cmpxchg8/16). Процессоры с такими наборами инструкций относятся к так называемым архитектурам загрузки-сохранения.

Кроме того, инструкции push и pop могут иметь свой явный операнд, обозначающий ячейку памяти. Это еще одна форма инструкций памяти в память.

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

Связано: Какие инструкции x86 требуют двух (или более) операндов памяти? перечисляет инструкции с двумя операндами памяти отдельный, а не RMW того же операнда.

Peter Cordes 08.04.2019 19:09

Некоторые ISA с загрузкой и хранением также имеют атомарную подкачку (например, Устаревшая инструкция swp для 32-битных ARM) и/или CAS, но большинство ISA RISC поддерживают только Связанный с загрузкой / Store-Conditional, поэтому lock add преобразуется в цикл повторных попыток. (Только для compare_exchange_weak не требуется цикл, потому что допускается сбой из-за конкуренции, а не только из-за различий в данных).

Peter Cordes 08.04.2019 19:10

LL/SC имеет преимущества для задержки прерывания, потому что в основном делает атомарную транзакцию прерываемой. Вы можете реализовать любую атомарную операцию (в одном месте), но вы можете сделать то же самое с циклом повторных попыток CAS. LL/SC помогает избежать проблем с ABA... В любом случае, отойдем от темы. LL/SC — это по-прежнему 2 отдельные инструкции, каждая из которых только загружает или только сохраняет. Но они связаны вместе для фиксации как транзакция RMW, поэтому да, они решают ту же проблему, что и 8086 xchg или более поздняя версия x86 lock cmpxchg / lock add / lock xadd / и т. д.

Peter Cordes 08.04.2019 19:15

Сегменты: строковые инструкции пишутся es:di, что упрощает работу с двумя сегментами одновременно, не загромождая код префиксами переопределения сегментов. Размер кода был критическим для производительности 8086.

Peter Cordes 08.04.2019 19:18

Другие вопросы по теме