为什么存在 REP LODS AL 指令?

Why REP LODS AL instruction exists?

换句话说,在任何情况下我可能需要这个指令吗?

来自英特尔说明手册,这是指令的作用:

Load (E)CX bytes from DS:[(E)SI] to 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 AXREP LODS EAXREP LODS RAX

在某些情况下,从内存中读取可能会产生副作用。例如,如果内存映射到硬件寄存器,就会发生这种情况。确切的副作用将取决于硬件。因此,rep lodsb 在极少数情况下非常有用,您需要发生副作用,但不需要读取的值。

...is there any case I might need this instruction?

你可能不需要它本身,但在 16 位世界中编码,space 保护很重要,我不止一次更喜欢

rep lodsb

越长(以字节为单位)

add si, cx
mov al, [si-1]

当然这完全取决于具体情况。

请注意,您在没有循环的情况下获取的替换指令实际上是 mov al, byte[esi + ecx -1]