assembly 为什么存在REP LODS AL指令?

zzzyeukh  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(92)

换句话说,有没有什么情况下我可能需要这个指令?
从英特尔指令手册中,这是指令的作用:
从DS:[(E)SI]加载(E)CX字节到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

jmo0nnb3

jmo0nnb31#

阅读记忆在某些情况下会产生副作用。例如,如果存储器被Map到硬件寄存器,则可能发生这种情况。确切的副作用取决于硬件。所以rep lodsb在非常罕见的情况下是有用的,你需要副作用发生,但不需要读取的值。

iibxawm4

iibxawm42#

有没有什么情况下我可能需要这个指令?
您可能不需要它本身,但在16位世界中编码,空间节约很重要,我不止一次地选择它

rep lodsb

在较长时间内(以字节为单位)

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

当然,这一切都取决于情况。
请注意,在不使用循环的情况下获取的替换指令实际上是mov al, byte[esi + ecx -1]

相关问题