Инструкции movs*
и cmps*
весьма удобны, поскольку позволяют выполнять такие распространенные задачи, как копирование данных и сравнение данных.
ins*
и outs*
по своей природе аналогичны movs*
, они просто перемещают данные между памятью и устройствами ввода-вывода. Они особенно полезны для чтения / записи на диск в полных секторах (обычно 512 байт). Конечно, DMA стирают их, поскольку ввод-вывод на основе DMA еще более эффективен, но в те времена они были не так распространены, как сегодня.
Имитация этих инструкций (особенно их повторяющихся форм (посмотрите префикс rep
)) потребовала бы больше кода и была бы медленнее. Отсюда и их существование.
Кстати, инструкция xchg
и любая другая инструкция чтения-изменения-записи (например, add
) с адресатом в памяти также фактически являются командами память-в-память. Не все процессоры имеют их, многие в основном предлагают инструкции, которые либо читают из памяти, либо записывают в память, но не оба (исключение составляют инструкции, которые используются для реализации монопольного / атомарного доступа к памяти, подумайте xchg
, xadd
, cmpxchg8/16
). Процессоры с такими наборами команд относятся к так называемым архитектурам хранилища нагрузки.
Кроме того, инструкции push
и pop
могут иметь явный операнд для обозначения места в памяти. Это еще одна форма инструкций памяти в память.
Что касается сегментов, то почти все инструкции, которые читают или записывают память, включают сегменты (некоторые системные инструкции работают по-разному), поэтому управление сегментами и служебные данные не следует избегать, если вы решили не использовать упомянутые вами инструкции. и вместо этого выберите другие инструкции.