为什么存在 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 AX
、REP LODS EAX
和 REP 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]
换句话说,在任何情况下我可能需要这个指令吗?
来自英特尔说明手册,这是指令的作用:
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 AX
、REP LODS EAX
和 REP 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]