LODS, LODSB, LODSW, LODSD, LODSQ
装入字符串
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
AC | LODS m8 | ZO | 有效 | 有效 | 对于遗留模式,在地址 DS:(E)SI 中装入 AL。对于地址 (R)SI 中的 64 位模式负载字节,则装入 AL. |
AD | LODS m16 | ZO | 有效 | 有效 | 对于遗留模式,在地址DS:(E)SI加载单词进入AX. 对于地址(R)SI加载64位模式单词进入AX. |
AD | LODS m32 | ZO | 有效 | 有效 | 对于遗留模式,在地址DS:(E)SI中装入EAX. 对于地址(R)SI中64位模式加载dword,则装入EAX. |
REX.W + AD | LODS m64 | ZO | 有效 | 不可编码 | 将地址(R)SI的qword装入RAX. |
AC | LODSB | ZO | 有效 | 有效 | 对于遗留模式,在地址 DS:(E)SI 中装入 AL。对于地址 (R)SI 中的 64 位模式负载字节,则装入 AL. |
AD | LODSW | ZO | 有效 | 有效 | 对于遗留模式,在地址DS:(E)SI加载单词进入AX. 对于地址(R)SI加载64位模式单词进入AX. |
AD | LODSD | ZO | 有效 | 有效 | 对于遗留模式,在地址DS:(E)SI中装入EAX. 对于地址(R)SI中64位模式加载dword,则装入EAX. |
REX.W + AD | LODSQ | ZO | 有效 | 不可编码 | 将地址(R)SI的qword装入RAX. |
实测开销
正在从 arch-data 加载实测数据...
说明
从源操作数装入一个字节,单词,或双词,分别装入AL,AX,或EAX的寄存器. 源操作数是一个内存位置,其地址从DS:ESI或DS:SI注册处读取(取决于指令的地址大小属性,分别为32或16). DS段可能会被覆盖,并带有一个段覆盖前缀.
在组装码级别上,允许此指令的两种形式:"explient-操作数"形式和"nooperands"形式. 明文的-操作数形式(与LODS mnemonic一起指定)允许明确指定源操作数. 在这里,源操作数应该是一个表示源值大小和位置的符号. 然后自动选择目标操作数来匹配源操作数的大小(字节操作数的AL注册,字节操作数的AX,双字节操作数的EAX). 提供这种明确的操作数表格是为了提供文件;然而,请注意,这种表格所提供的文件可能具有误导性。 也就是说,源操作数符号必须指定操作数的正确类型(大小)(字节,单词,或双词),但不必指定正确的位置. 位置总是由DS:(E)SI登记器指定,在执行负载字符串指令前必须正确加载.
No-操作数格式提供了LODS指令的字节,单词和双词版本的"短表". 这里还假定DS:(E)SI为源操作数,而AL,AX,或EAX登记册为目标操作数. 源和 目标操作数 的大小以元音选择 : LODSB(字节装入寄存器 AL),LODSW(字节装入AX),或LODSD(双字装入EAX).
在字节,单词,或双词从内存位置转到AL,AX,或EAX注册后,(E)SI注册会根据EFLAGS注册中DF旗的设置自动递增或递减. (如果DF旗为0,则(E)SI登记册递增;如果DF旗为1,则ESI登记册递减. ) (E)SI登记册递增或递减1个字节操作,2个字节操作,4个字节操作.
在64位模式中,使用REX.W前缀将操作提升到64位. LODS/LODSQ在地址(R)SI上将四字装入RAX. 然后(R)SI寄存器根据EFLAGS寄存器中DF旗的设置自动递增或递减.
LODS,LODSB,LODSW,和LODSD 指令前可以使用REP 前缀,用于块负载的ECX字节,单词,或双词. 然而,更多时候,这些指令是在LOOP构造内使用的,因为通常需要在进行下一次传输之前进一步处理移入登记册的数据。 参见Intel(R)64和IA-32架构软件开发者手册第2B卷中的"REP/REPE/REPZ/REPNE/REPNZ--Repeat字符串操作前缀"第4章中的REP前缀描述.
行动
IF AL := SRC; (* Byte load *)
THEN AL := SRC; (* Byte load *)
IF DF = 0
THEN (E)SI := (E)SI + 1;
ELSE (E)SI := (E)SI 1;
FI;
ELSE IF AX := SRC; (* Word load *)
THEN IF DF = 0
THEN (E)SI := (E)SI + 2;
ELSE (E)SI := (E)SI 2;
IF;
FI;
ELSE IF EAX := SRC; (* Doubleword load *)
THEN IF DF = 0
THEN (E)SI := (E)SI + 4;
ELSE (E)SI := (E)SI 4;
FI;
FI;
ELSE IF RAX := SRC; (* Quadword load *)
THEN IF DF = 0
THEN (R)SI := (R)SI + 8;
ELSE (R)SI := (R)SI 8;
FI;
FI;
FI;受影响的旗帜
None.
异常
保护模式
#GP(0) | 如果 内存操作数 的有效地址位于 CS,DS,ES,FS 或 GS 区段限制之外,如果 DS,ES,FS,或 GS 注册簿中包含 NULL 段选择子. |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |
实地址模式
#GP | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#UD | 如果使用 LOCK 前缀 。 |
虚拟 8086 模式
#GP(0) | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生. |
#AC(0) | 如果启用对齐检查, 并使用不对齐的内存引用 。 |
#UD | 如果使用 LOCK 前缀 。 |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
#SS(0) | 如果引用SS部分的内存地址是非冠状的. |
#GP(0) | 如果内存地址是非冠状的. #PF(fault-code) 如果发生 页面错误. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |