Почему существует инструкция REP LODS AL?
Другими словами, есть ли какой-нибудь случай, который может понадобиться этой инструкции?
Из инструкций Intel Instructions Manual это инструкция:
Загрузите (E) байты CX из DS: [(E) SI] в AL.
Возьмем следующий пример в NASM:
section .data
src: db 0, 1, 2, 3
section .code
mov esi, src
mov ecx, 4
rep lodsb ; mov al, byte[esi + ecx -1]; ecx++
Пока выполняется команда rep lodsb
, у меня нет никакого контроля над значением, загруженным в al
. Все, что я могу сделать, это ждать, пока инструкция не завершится, чтобы получить последнее значение al
, которое, конечно, я могу получить напрямую, без цикла.
Тот же вопрос касается остальной части семейства: REP LODS AX
, REP LODS EAX
и REP LODS RAX
.
Ответы
Ответ 1
Чтение из памяти может иметь побочные эффекты в некоторых случаях. Например, это может произойти, если память сопоставляется с аппаратными регистрами. Точный побочный эффект будет зависеть от аппаратного обеспечения. Поэтому rep lodsb
может быть полезен в очень редких случаях, когда вам нужен побочный эффект, но не нужны значения, которые были прочитаны.
Ответ 2
... есть ли какой-нибудь случай, который может понадобиться этой инструкции?
Возможно, вам это не понадобится само по себе, но кодирование в 16-битном мире, где сохранение пространства важно, я не раз предпочитал
rep lodsb
более длинный (в байтах)
add si, cx
mov al, [si-1]
Конечно, все это зависит от ситуации.
Обратите внимание, что ваша команда замены для извлечения без цикла на самом деле mov al, byte[esi + ecx -1]