栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

IA-32指令(三)——Instruction Prefixes(指令前缀)

IA-32指令(三)——Instruction Prefixes(指令前缀)

指令前缀共分为4类,对于每条指令,最多只有一个前缀有效。

(1) Lock and repeat prefixes
  • LOCK指令前缀为0xF0, 用于互斥操作

  • REPNE/REPNZ前缀采用F2H编码。重复非零前缀仅适用于字符串和输入/输出指令。(F2H也被用作某些指令的强制前缀)

  • REP或REPE/REPZ采用F3H编码。重复前缀只适用于字符串和输入/输出指令。(F3H也被用作某些指令的强制前缀)

    操作码指令说明
    F3 6CREP INS r/m8, DX将 (E)CX 个字节从端口 DX 输入到 ES:[(E)DI]
    F3 6DREP INS r/m16,DX将 (E)CX 个字从端口 DX 输入到 ES:[(E)DI]
    F3 6DREP INS r/m32,DX将 (E)CX 个双字从端口 DX 输入到 ES:[(E)DI]
    F3 A4REP MOVS m8,m8将 (E)CX 个字节从 DS:[(E)SI] 移到 ES:[(E)DI]
    F3 A5REP MOVS m16,m16将 (E)CX 个字从 DS:[(E)SI] 移到 ES:[(E)DI]
    F3 A5REP MOVS m32,m32将 (E)CX 个双字从 DS:[(E)SI] 移到 ES:[(E)DI]
    F3 6EREP OUTS DX,r/m8将 (E)CX 个字节从 DS:[(E)SI] 输出到端口 DX
    F3 6FREP OUTS DX,r/m16将 (E)CX 个字从 DS:[(E)SI] 输出到端口 DX
    F3 6FREP OUTS DX,r/m32将 (E)CX 个双字从 DS:[(E)SI] 输出到端口 DX
    F3 ACREP LODS AL将 (E)CX 个字节从 DS:[(E)SI] 加载到 AL
    F3 ADREP LODS AX将 (E)CX 个字从 DS:[(E)SI] 加载到 AX
    F3 ADREP LODS EAX将 (E)CX 个双字从 DS:[(E)SI] 加载到 EAX
    F3 AAREP STOS m8使用 AL 填写位于 ES:[(E)DI] 的 (E)CX 个字节
    F3 ABREP STOS m16使用 AX 填写位于 ES:[(E)DI] 的 (E)CX 个字
    F3 ABREP STOS m32使用 EAX 填写位于 ES:[(E)DI] 的 (E)CX 个双字
    F3 A6REPE CMPS m8,m8在 ES:[(E)DI] 与 DS:[(E)SI] 中查找不匹配的字节
    F3 A7REPE CMPS m16,m16在 ES:[(E)DI] 与 DS:[(E)SI] 中查找不匹配的字
    F3 A7REPE CMPS m32,m32在 ES:[(E)DI] 与 DS:[(E)SI] 中查找不匹配的双字
    F3 AEREPE SCAS m8从 ES:[(E)DI] 开始查找非 AL 字节
    F3 AFREPE SCAS m16从 ES:[(E)DI] 开始查找非 AX 字
    F3 AFREPE SCAS m32从 ES:[(E)DI] 开始查找非 EAX 双字
    F2 A6REPNE CMPS m8,m8在 ES:[(E)DI] 与 DS:[(E)SI] 中查找匹配字节
    F2 A7REPNE CMPS m16,m16在 ES:[(E)DI] 与 DS:[(E)SI] 中查找匹配字
    F2 A7REPNE CMPS m32,m32在 ES:[(E)DI] 与 DS:[(E)SI] 中查找匹配双字
    F2 AEREPNE SCAS m8从 ES:[(E)DI] 开始查找 AL
    F2 AFREPNE SCAS m16从 ES:[(E)DI] 开始查找 AX
    F2 AFREPNE SCAS m32从 ES:[(E)DI] 开始查找 EAX
(2) Segment override prefixes

段寄存器的作用:早期8086cpu寻址范围小,Inter遍通过段寄存器来拓展内存.即通过段寄存器基址+偏移的方式来寻址。

[]中的地址为有效地址(Effect Address),有效地址+段寄存器基址才是实际地址LA(线性地址 Line Address)。

线性地址 = 段基址 + 有效地址

在后来的80386时,cpu的寻址范围大大提升,这些段寄存器便被用作了其他用途。但是DS:[]类似这种寻址格式却被保留了下来。

实际上操作码已经决定了寻址时使用哪个段寄存器作为基址,不需要其他字节描述。

  • 如果没有特别说明,[]前为DS,即DS:[]

  • PUSH POP指令,以及在[]中使用ESP/EBP的,使用SS段

  • 在[base + Index*2Scale + I]中,以base为判断条件,没有特别说明,用DS。如果base为ESP/EBP,则用SS段.

  • 串操作指令一般使用ES。MOV ES:[EDI] DS:[ESI]中,目标EDI使用ES段,其他使用DS段.

  • EIP指向当前指令,EIP取指令时使用的是CS段.

  • 如果指令加段寄存器前缀,则该条指令一律用这个段,如果加多个段寄存器前缀,默认只看op前的那个.

    段寄存器段寄存器覆盖前缀
    CS2E
    SS36
    DS3E
    ES26
    FS64
    GS65

例如:

本来默认是ds,但是加上了CS的段寄存器覆盖前缀后,所有寻址都在cs段内了

(3) Operand-size override prefix

0x66 将操作数改为16字节

例如:

(4) Address-size override prefix

0x67 允许程序在16位寻址和32位寻址之间切换

例如:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/663409.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号