Почему существует инструкция 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]