【第一部分】
一、数据传输指令 ─────────────────────────────────────── 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里 ) XLAT 字节查表转换. ── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL ) 2. 输入输出端口传送指令. IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 ) 输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时, 其范围是 0-65535. 3. 目的地址传送指令. LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ESI. LFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FSI. LGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GSI. LSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SSI. 4. 标志传送指令. LAHF 标志寄存器传送,把标志装入AH. SAHF 标志寄存器传送,把AH内容装入标志寄存器. PUSHF 标志入栈. POPF 标志出栈. PUSHD 32位标志入栈. POPD 32位标志出栈. 二、算术运算指令 ─────────────────────────────────────── ADD 加法. ADC 带进位加法. INC 加 1. AAA 加法的ASCII码调整. DAA 加法的十进制调整. SUB 减法. SBB 带借位减法. DEC 减 1. NEC 求反(以 0 减之). CMP 比较.(两操作数作减法,仅修改标志位,不回送结果). AAS 减法的ASCII码调整. DAS 减法的十进制调整. MUL 无符号乘法. IMUL 整数乘法. 以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), AAM 乘法的ASCII码调整. DIV 无符号除法. IDIV 整数除法. 以上两条,结果回送: 商回送AL,余数回送AH, (字节运算); 或 商回送AX,余数回送DX, (字运算). AAD 除法的ASCII码调整. CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) CWD 字转换为双字. (把AX中的字的符号扩展到DX中去) CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去) 三、逻辑运算指令 ─────────────────────────────────────── AND 与运算. OR 或运算. XOR 异或运算. NOT 取反. TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果). SHL 逻辑左移. SAL 算术左移.(=SHL) SHR 逻辑右移. SAR 算术右移.(=SHR) ROL 循环左移. ROR 循环右移. RCL 通过进位的循环左移. RCR 通过进位的循环右移. 以上八种移位指令,其移位次数可达255次. 移位一次时, 可直接用操作码. 如 SHL AX,1. 移位>1次时, 则由寄存器CL给出移位次数. 如 MOV CL,04 SHL AX,CL 四、串指令 ─────────────────────────────────────── DS:SI 源串段寄存器 :源串变址. ESI 目标串段寄存器:目标串变址. CX 重复次数计数器. AL/AX 扫描值. D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量. Z标志 用来控制扫描或比较操作的结束. MOVS 串传送. ( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. ) CMPS 串比较. ( CMPSB 比较字符. CMPSW 比较字. ) SCAS 串扫描. 把AL或AX的内容与目标串作比较,比较结果反映在标志位. LODS 装入串. 把源串中的元素(字或字节)逐一装入AL或AX中. ( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. ) STOS 保存串. 是LODS的逆过程. REP 当CX/ECX<>0时重复. REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复. REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复. REPC 当CF=1且CX/ECX<>0时重复. REPNC 当CF=0且CX/ECX<>0时重复. 五、程序转移指令 ─────────────────────────────────────── 1>无条件转移指令 (长转移) JMP 无条件转移指令 CALL 过程调用 RET/RETF过程返回. 2>条件转移指令 (短转移,-128到+127的距离内) ( 当且仅当(SF XOR OF)=1时,OP1<OP2 ) JA/JNBE 不小于或不等于时转移. JAE/JNB 大于或等于转移. JB/JNAE 小于转移. JBE/JNA 小于或等于转移. 以上四条,测试无符号整数运算的结果(标志C和Z). JG/JNLE 大于转移. JGE/JNL 大于或等于转移. JL/JNGE 小于转移. JLE/JNG 小于或等于转移. 以上四条,测试带符号整数运算的结果(标志S,O和Z). JE/JZ 等于转移. JNE/JNZ 不等于时转移. JC 有进位时转移. JNC 无进位时转移. JNO 不溢出时转移. JNP/JPO 奇偶性为奇数时转移. JNS 符号位为 "0" 时转移. JO 溢出转移. JP/JPE 奇偶性为偶数时转移. JS 符号位为 "1" 时转移. 3>循环控制指令(短转移) LOOP CX不为零时循环. LOOPE/LOOPZ CX不为零且标志Z=1时循环. LOOPNE/LOOPNZ CX不为零且标志Z=0时循环. JCXZ CX为零时转移. JECXZ ECX为零时转移. 4>中断指令 INT 中断指令 INTO 溢出中断 IRET 中断返回 5>处理器控制指令 HLT 处理器暂停, 直到出现中断或复位信号才继续. WAIT 当芯片引线TEST为高电平时使CPU进入等待状态. ESC 转换到外处理器. LOCK 封锁总线. NOP 空操作. STC 置进位标志位. CLC 清进位标志位. CMC 进位标志取反. STD 置方向标志位. CLD 清方向标志位. STI 置中断允许位. CLI 清中断允许位. 六、伪指令 ─────────────────────────────────────── DW 定义字(2字节). PROC 定义过程. ENDP 过程结束. SEGMENT 定义段. ASSUME 建立段寄存器寻址. ENDS 段结束. END 程序结束.
【第二部分】
一、常用指令
二、算术运算指令
三、逻辑运算指令
四、串指令
五、程序跳转指令
------------------------------------------
计算机寄存器分类简介:
32位CPU所含有的寄存器有:
4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)
1、数据寄存器
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、 除、输入/输出等操作,使用频率很高;
寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用;
寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,
在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,
而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
2、变址寄存器
32位CPU有2个32位通用寄存器ESI和EDI。
其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,
用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。
3、指针寄存器
其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。
32位CPU有2个32位通用寄存器EBP和ESP。
它们主要用于访问堆栈内的存储单元,并且规定:
EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;
ESP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,
用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
4、段寄存器
段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器:
ECS——代码段寄存器(Code Segment Register),其值为代码段的段值;
EDS——数据段寄存器(Data Segment Register),其值为数据段的段值;
EES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
ESS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
EFS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
EGS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位
微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。
32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简
单描述如下:
实方式: 前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑
地址仍为“段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。
保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。。
5、指令指针寄存器
32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。
在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。
所以,在理解它们的功能时,不考虑存在指令队列的情况。
6、标志寄存器
一、运算结果标志位
1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
2、奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位
。
3、辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
4、零标志ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
5、符号标志SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的
正负号。运算结果为正数时,SF的值为0,否则其值为1。
6、溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否
则,OF的值被清为0。
“溢出”和“进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。
二、状态控制标志位
状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。
1、追踪标志TF(Trap Flag)
当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。
指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。
2、中断允许标志IF(Interrupt-enable Flag)
中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。
但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。
具体规定如下:
(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
CPU的指令系统中也有专门的指令来改变标志位IF的值。
3、方向标志DF(Direction Flag)
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.11节——字符串操作指令——中给出。
在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。
三、32位标志寄存器增加的标志位
1、I/O特权标志IOPL(I/O Privilege Level)
I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。该字段指定了要求执行I/O指令的特权级。
如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。
2、嵌套任务标志NT(Nested Task)
嵌套任务标志NT用来控制中断返回指令IRET的执行。具体规定如下:
(1)、当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回操作;
(2)、当NT=1,通过任务转换实现中断返回。
3、重启动标志RF(Restart Flag)
重启动标志RF用来控制是否接受调试故障。规定:RF=0时,表示“接受”调试故障,否则拒绝之。
在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。
4、虚拟8086方式标志VM(Virtual 8086 Mode)
如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。
计算机寄存器常用指令
一、常用指令
1. 通用数据传送指令.
MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.
PUSH 把字压入堆栈.
POP 把字弹出堆栈.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
BSWAP 交换32位寄存器里字节的顺序
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
XADD 先交换再累加.( 结果在第一个操作数里 )
XLAT 字节查表转换.
BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
2. 输入输出端口传送指令.
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.
3. 目的地址传送指令.
LEA 装入有效地址.
例: LEA DX,string ;把偏移地址存到DX.
LDS 传送目标指针,把指针内容装入DS.
例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
LES 传送目标指针,把指针内容装入ES.
例: LES DI,string ;把段地址:偏移地址存到ESDI.
LFS 传送目标指针,把指针内容装入FS.
例: LFS DI,string ;把段地址:偏移地址存到FSD.
LGS 传送目标指针,把指针内容装入GS.
例: LGS DI,string ;把段地址:偏移地址存到GSDI.
LSS 传送目标指针,把指针内容装入SS.
例: LSS DI,string ;把段地址:偏移地址存到SSDI.
4. 标志传送指令.
LAHF 标志寄存器传送,把标志装入AH.
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
PUSHF 标志入栈.
POPF 标志出栈.
PUSHD 32位标志入栈.
POPD 32位标志出栈.
二、算术运算指令
ADD 加法.
ADC 带进位加法.
INC 加 1.
AAA 加法的ASCII码调整.
DAA 加法的十进制调整.
SUB 减法.
SBB 带借位减法.
DEC 减 1.
NEC 求反(以 0 减之).
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
AAS 减法的ASCII码调整.
DAS 减法的十进制调整.
MUL 无符号乘法.
IMUL 整数乘法.
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
AAM 乘法的ASCII码调整.
DIV 无符号除法.
IDIV 整数除法.
以上两条,结果回送:
商回送AL,余数回送AH, (字节运算);
或 商回送AX,余数回送DX, (字运算).
AAD 除法的ASCII码调整.
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
三、逻辑运算指令
AND 与运算.
OR 或运算.
XOR 异或运算.
NOT 取反.
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL 逻辑左移.
SAL 算术左移.(=SHL)
SHR 逻辑右移.
SAR 算术右移.(=SHR)
ROL 循环左移.
ROR 循环右移.
RCL 通过进位的循环左移.
RCR 通过进位的循环右移.
以上八种移位指令,其移位次数可达255次.
移位一次时, 可直接用操作码. 如 SHL AX,1.
移位>1次时, 则由寄存器CL给出移位次数.
如 MOV CL,04
SHL AX,CL
四、串指令
DS:SI 源串段寄存器 :源串变址.
ES I 目标串段寄存器:目标串变址.
CX 重复次数计数器.
AL/AX 扫描值.
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
Z标志 用来控制扫描或比较操作的结束.
MOVS 串传送.
( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )
CMPS 串比较.
( CMPSB 比较字符. CMPSW 比较字. )
SCAS 串扫描.
把AL或AX的内容与目标串作比较,比较结果反映在标志位.
LODS 装入串.
把源串中的元素(字或字节)逐一装入AL或AX中.
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
STOS 保存串.
是LODS的逆过程.
REP 当CX/ECX0时重复.
REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX0时重复.
REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX0时重复.
REPC 当CF=1且CX/ECX0时重复.
REPNC 当CF=0且CX/ECX0时重复.
五、程序转移指令
1.简单的条件转移指令
JZ(或jE) OPR---------------结果为零转移, 测试条件ZF=1
JNZ(或jNE) OPR --------------结果不为零转移,测试条件ZF=0
JS OPR----------------------结果为负转移, 测试条件SF=1
JNS OPR---------------------结果为正转移, 测试条件SF=0
JO OPR--------------------- 溢出转移, 测试条件OF=
JNO OPR --------------------不溢出转移 , 测试条件SF=0
JP OPR ---------------------结果为偶转移, 测试条件SF=1
JNP OPR --------------------结果为奇转移 , 测试条件SF=0
JC OPR -------------------- 有进位转移 , 测试条件SF=1
JNC OPR --------------------无进位转移, 测试条件SF=0
2.无符号比较条件转移指令(以下指令经常是CMP OPD,OPS后面的指令根据比较结果来实现转移)
JB(或JNAE) opd --------------小于或者不大于等于则转移
JNB(或JAE) opd---------------不小于或者大于等于则转移
JA(或NJBE) OPD---------------大于或者不小于等于则转移
JNA(或JBE) OPD---------------不大于或者小于等于则转移
3.带符号比较条件转移指令
JL(或JNGE) --------------小于或者不大于等于则转移
JNL(或JGE)--------------不小于或者大于等于则转移
JG(或NJLE)---------------大于或者不小于等于则转移
JNG(或JLE)---------------不大于或者小于等于则转移
六、调用子程序与返回指令
CALL 子程序调用指令
RET 子程序返回指令
六、其它指令
OFFSET -------------------- 返回偏移地址
SEG -------------------- 返回段地址
EQU(=) -------------------- 等值语句
PURGE -------------------- 解除语句
DUP -------------------- 操作数字段用复制操作符
SEGMENT,ENDS -------------------- 段定义指令
ASSUME -------------------- 段地址分配指令
ORG -------------------- 起始偏移地址设置指令
$ --------------------地址计数器的当前值
PROC,ENDP -------------------- 过程定义语句
NAME,TITLE,END -------------------- 程序开始结束语句
MACRO, OllyICE反汇编教程及汇编命令详解
内容目录
计算机寄存器分类简介
计算机寄存器常用指令
一、常用指令
二、算术运算指令
三、逻辑运算指令
四、串指令
五、程序跳转指令
------------------------------------------
计算机寄存器分类简介:
32位CPU所含有的寄存器有:
4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)
1、数据寄存器
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、 除、输入/输出等操作,使用频率很高;
寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用;
寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,
在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,
而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
2、变址寄存器
32位CPU有2个32位通用寄存器ESI和EDI。
其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,
用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。
3、指针寄存器
其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。
32位CPU有2个32位通用寄存器EBP和ESP。
它们主要用于访问堆栈内的存储单元,并且规定:
EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;
ESP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,
用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
4、段寄存器
段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器:
ECS——代码段寄存器(Code Segment Register),其值为代码段的段值;
EDS——数据段寄存器(Data Segment Register),其值为数据段的段值;
EES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
ESS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
EFS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
EGS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位
微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。
32位CPU有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简
单描述如下:
实方式: 前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑
地址仍为“段值:偏移量”的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。
保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。。
5、指令指针寄存器
32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。
指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。
在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。
所以,在理解它们的功能时,不考虑存在指令队列的情况。
6、标志寄存器
一、运算结果标志位
1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
2、奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位
。
3、辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
4、零标志ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
5、符号标志SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的
正负号。运算结果为正数时,SF的值为0,否则其值为1。
6、溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否
则,OF的值被清为0。
“溢出”和“进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。
二、状态控制标志位
状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。
1、追踪标志TF(Trap Flag)
当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。
指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。
2、中断允许标志IF(Interrupt-enable Flag)
中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。
但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。
具体规定如下:
(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
CPU的指令系统中也有专门的指令来改变标志位IF的值。
3、方向标志DF(Direction Flag)
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.11节——字符串操作指令——中给出。
在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。
三、32位标志寄存器增加的标志位
1、I/O特权标志IOPL(I/O Privilege Level)
I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。该字段指定了要求执行I/O指令的特权级。
如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。
2、嵌套任务标志NT(Nested Task)
嵌套任务标志NT用来控制中断返回指令IRET的执行。具体规定如下:
(1)、当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回操作;
(2)、当NT=1,通过任务转换实现中断返回。
3、重启动标志RF(Restart Flag)
重启动标志RF用来控制是否接受调试故障。规定:RF=0时,表示“接受”调试故障,否则拒绝之。
在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。
4、虚拟8086方式标志VM(Virtual 8086 Mode)
如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。
计算机寄存器常用指令
一、常用指令
1. 通用数据传送指令.
MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.
PUSH 把字压入堆栈.
POP 把字弹出堆栈.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
BSWAP 交换32位寄存器里字节的顺序
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
XADD 先交换再累加.( 结果在第一个操作数里 )
XLAT 字节查表转换.
BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
2. 输入输出端口传送指令.
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.
3. 目的地址传送指令.
LEA 装入有效地址.
例: LEA DX,string ;把偏移地址存到DX.
LDS 传送目标指针,把指针内容装入DS.
例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
LES 传送目标指针,把指针内容装入ES.
例: LES DI,string ;把段地址:偏移地址存到ESDI.
LFS 传送目标指针,把指针内容装入FS.
例: LFS DI,string ;把段地址:偏移地址存到FSD.
LGS 传送目标指针,把指针内容装入GS.
例: LGS DI,string ;把段地址:偏移地址存到GSDI.
LSS 传送目标指针,把指针内容装入SS.
例: LSS DI,string ;把段地址:偏移地址存到SSDI.
4. 标志传送指令.
LAHF 标志寄存器传送,把标志装入AH.
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
PUSHF 标志入栈.
POPF 标志出栈.
PUSHD 32位标志入栈.
POPD 32位标志出栈.
二、算术运算指令
ADD 加法.
ADC 带进位加法.
INC 加 1.
AAA 加法的ASCII码调整.
DAA 加法的十进制调整.
SUB 减法.
SBB 带借位减法.
DEC 减 1.
NEC 求反(以 0 减之).
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
AAS 减法的ASCII码调整.
DAS 减法的十进制调整.
MUL 无符号乘法.
IMUL 整数乘法.
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
AAM 乘法的ASCII码调整.
DIV 无符号除法.
IDIV 整数除法.
以上两条,结果回送:
商回送AL,余数回送AH, (字节运算);
或 商回送AX,余数回送DX, (字运算).
AAD 除法的ASCII码调整.
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
三、逻辑运算指令
AND 与运算.
OR 或运算.
XOR 异或运算.
NOT 取反.
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL 逻辑左移.
SAL 算术左移.(=SHL)
SHR 逻辑右移.
SAR 算术右移.(=SHR)
ROL 循环左移.
ROR 循环右移.
RCL 通过进位的循环左移.
RCR 通过进位的循环右移.
以上八种移位指令,其移位次数可达255次.
移位一次时, 可直接用操作码. 如 SHL AX,1.
移位>1次时, 则由寄存器CL给出移位次数.
如 MOV CL,04
SHL AX,CL
四、串指令
DS:SI 源串段寄存器 :源串变址.
ES I 目标串段寄存器:目标串变址.
CX 重复次数计数器.
AL/AX 扫描值.
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
Z标志 用来控制扫描或比较操作的结束.
MOVS 串传送.
( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )
CMPS 串比较.
( CMPSB 比较字符. CMPSW 比较字. )
SCAS 串扫描.
把AL或AX的内容与目标串作比较,比较结果反映在标志位.
LODS 装入串.
把源串中的元素(字或字节)逐一装入AL或AX中.
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
STOS 保存串.
是LODS的逆过程.
REP 当CX/ECX0时重复.
REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX0时重复.
REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX0时重复.
REPC 当CF=1且CX/ECX0时重复.
REPNC 当CF=0且CX/ECX0时重复.
五、程序转移指令
1.简单的条件转移指令
JZ(或jE) OPR---------------结果为零转移, 测试条件ZF=1
JNZ(或jNE) OPR --------------结果不为零转移,测试条件ZF=0
JS OPR----------------------结果为负转移, 测试条件SF=1
JNS OPR---------------------结果为正转移, 测试条件SF=0
JO OPR--------------------- 溢出转移, 测试条件OF=
JNO OPR --------------------不溢出转移 , 测试条件SF=0
JP OPR ---------------------结果为偶转移, 测试条件SF=1
JNP OPR --------------------结果为奇转移 , 测试条件SF=0
JC OPR -------------------- 有进位转移 , 测试条件SF=1
JNC OPR --------------------无进位转移, 测试条件SF=0
2.无符号比较条件转移指令(以下指令经常是CMP OPD,OPS后面的指令根据比较结果来实现转移)
JB(或JNAE) opd --------------小于或者不大于等于则转移
JNB(或JAE) opd---------------不小于或者大于等于则转移
JA(或NJBE) OPD---------------大于或者不小于等于则转移
JNA(或JBE) OPD---------------不大于或者小于等于则转移
3.带符号比较条件转移指令
JL(或JNGE) --------------小于或者不大于等于则转移
JNL(或JGE)--------------不小于或者大于等于则转移
JG(或NJLE)---------------大于或者不小于等于则转移
JNG(或JLE)---------------不大于或者小于等于则转移
六、调用子程序与返回指令
CALL 子程序调用指令
RET 子程序返回指令
六、其它指令
OFFSET -------------------- 返回偏移地址
SEG -------------------- 返回段地址
EQU(=) -------------------- 等值语句
PURGE -------------------- 解除语句
DUP -------------------- 操作数字段用复制操作符
SEGMENT,ENDS -------------------- 段定义指令
ASSUME -------------------- 段地址分配指令
ORG -------------------- 起始偏移地址设置指令
$ --------------------地址计数器的当前值
PROC,ENDP -------------------- 过程定义语句
NAME,TITLE,END -------------------- 程序开始结束语句
MACRO,ENDM --------------------宏定义指令
XLAT (TRANSLATE) -------------------- 换码指令----
七、条件标志
ZF 零标志 -- 当结果为负时,SF=1,否则,SF=0.
AF 辅助进位标志---运算过程中第三位有进位值,置AF=1,否则,AF=0
PF 奇偶标志------当结果操作数中偶数个"1",置PF=1,否则,PF=0
SF 符号标志----当结果为负时,SF=1;否则,SF=0.溢出时情形例外
CF 进位标志----- 最高有效位产生进位值,例如,执行加法指令时,MSB有进位,置CF=1;否则,CF=0.
OF 溢出标志-----若操作数结果超出了机器能表示的范围,则产生溢出,置OF=1,否则,OF=0
ENDM --------------------宏定义指令
XLAT (TRANSLATE) -------------------- 换码指令----
七、条件标志
ZF 零标志 -- 当结果为负时,SF=1,否则,SF=0.
AF 辅助进位标志---运算过程中第三位有进位值,置AF=1,否则,AF=0
PF 奇偶标志------当结果操作数中偶数个"1",置PF=1,否则,PF=0
SF 符号标志----当结果为负时,SF=1;否则,SF=0.溢出时情形例外
CF 进位标志----- 最高有效位产生进位值,例如,执行加法指令时,MSB有进位,置CF=1;否则,CF=0.
OF 溢出标志-----若操作数结果超出了机器能表示的范围,则产生溢出,置OF=1,否则,OF=0
【第三部分】
指令 | 功能 | AAA | 调整加 | AAD | 调整除 | AAM | 调整乘 | AAS | 调整减 | ADC | 进位加 | ADD | 加 | AND | 与 | ARPL | 调整优先级 | BOUND | 检查数组 | BSF | 位右扫描 | BSR | 位左扫描 | BSWAP | 交换字节 | BT | 位测试 | BTC | 位测试求反 | BTR | 位测试清零 | BTS | 位测试置一 | CALL | 过程调用 | CBW | 转换字节 | CDQ | 转换双字 | CLC | 进位清零 | CLD | 方向清零 | CLI | 中断清零 | CLTS | 任务清除 | CMC | 进位求反 | CMOVA | 高于传送 | CMOVB | 低于传送 | CMOVE | 相等传送 | CMOVG | 大于传送 | CMOVL | 小于传送 | CMOVNA | 不高于传送 | CMOVNB | 不低于传送 | CMOVNE | 不等传送 | CMOVNG | 不大于传送 | CMOVNL | 不小于传送 | CMOVNO | 不溢出传送 | CMOVNP | 非奇偶传送 | CMOVNS | 非负传送 | CMOVO | 溢出传送 | CMOVP | 奇偶传送 | CMOVS | 负号传送 | CMP | 比较 | CMPSB | 比较字节串 | CMPSD | 比较双字串 | CMPSW | 比较字串 | CMPXCHG | 比较交换 | CMPXCHG486 | 比较交换486 | CMPXCHG8B | 比较交换8字节 | CPUID | CPU标识 | CWD | 转换字 | CWDE | 扩展字 | DAA | 调整加十 | DAS | 调整减十 | DEC | 减一 | DIV | 除 | ENTER | 建立堆栈帧 | HLT | 停 | IDIV | 符号整除 | IMUL | 符号乘法 | IN | 端口输入 | INC | 加一 | INSB | 端口输入字节串 | INSD | 端口输入双字串 | INSW | 端口输入字串 | JA | 高于跳转 | JB | 低于跳转 | JBE | 不高于跳转 | JCXZ | 计数一六零跳转 | JE | 相等跳转 | JECXZ | 计数三二零跳转 | JG | 大于跳转 | JL | 小于跳转 | JMP | 跳转 | JMPE | 跳转扩展 | JNB | 不低于跳转 | JNE | 不等跳转 | JNG | 不大于跳转 | JNL | 不小于跳转 | JNO | 不溢出跳转 | JNP | 非奇偶跳转 | JNS | 非负跳转 | JO | 溢出跳转 | JP | 奇偶跳转 | JS | 负号跳转 | LAHF | 加载标志低八 | LAR | 加载访问权限 | LDS | 加载数据段 | LEA | 加载有效地址 | LEAVE | 清除过程堆栈 | LES | 加载附加段 | LFS | 加载标志段 | LGDT | 加载全局描述符 | LGS | 加载全局段 | LIDT | 加载中断描述符 | LMSW | 加载状态字 | LOADALL | 加载所有 | LOADALL286 | 加载所有286 | LOCK | 锁 | LODSB | 加载源变址字节串 | LODSD | 加载源变址双字串 | LODSW | 加载源变址字串 | LOOP | 计数循环 | LOOPE | 相等循环 | LOOPNE | 不等循环 | LOOPNZ | 非零循环 | LOOPZ | 为零循环 | LSL | 加载段界限 | LSS | 加载堆栈段 | LTR | 加载任务 | MONITOR | 监视 | MOV | 传送 | MOVSB | 传送字节串 | MOVSD | 传送双字串 | MOVSW | 传送字串 | MOVSX | 符号传送 | MOVZX | 零传送 | MUL | 乘 | MWAIT |
| NEG | 求补 | NOP | 空 | NOT | 非 | OR | 或 | OUT | 端口输出 | OUTSB | 端口输出字节串 | OUTSD | 端口输出双字串 | OUTSW | 端口输出字串 | POP | 出栈 | POPA | 全部出栈 | POPF | 标志出栈 | PUSH | 压栈 | PUSHA | 全部压栈 | PUSHF | 标志压栈 | RCL | 进位循环左移 | RCR | 进位循环右移 | RDMSR | 读专用模式 | RDPMC | 读执行监视计数 | RDSHR |
| RDTSC | 读时间戳计数 | REP | 重复 | REPE | 相等重复 | REPNE | 不等重复 | RET | 过程返回 | RETF | 远过程返回 | RETN | 近过程返回 | ROL | 循环左移 | ROR | 循环右移 | RSM | 恢复系统管理 | SAHF | 恢复标志低八 | SAL | 算术左移 | SALC |
| SAR | 算术右移 | SBB | 借位减 | SCASB | 扫描字节串 | SCASD | 扫描双字串 | SCASW | 扫描字串 | SETA | 高于置位 | SETB | 低于置位 | SETE | 相等置位 | SETG | 大于置位 | SETL | 小于置位 | SETNA | 不高于置位 | SETNB | 不低于置位 | SETNE | 不等置位 | SETNG | 不大于置位 | SETNL | 不小于置位 | SETNO | 不溢出置位 | SETNP | 非奇偶置位 | SETNS | 非负置位 | SETO | 溢出置位 | SETP | 奇偶置位 | SETS | 负号置位 | SGDT | 保存全局描述符 | SHL | 逻辑左移 | SHLD | 双精度左移 | SHR | 逻辑右移 | SHRD | 双精度右移 | SIDT | 保存中断描述符 | SLDT | 保存局部描述符 | SMI |
| SMINT |
| SMINTOLD |
| SMSW | 保存状态字 | STC | 进位设置 | STD | 方向设置 | STI | 中断设置 | STOSB | 保存字节串 | STOSD | 保存双字串 | STOSW | 保存字串 | STR | 保存任务 | SUB | 减 | SYSCALL | 系统调用 | SYSENTER | 系统进入 | SYSEXIT | 系统退出 | SYSRET | 系统返回 | TEST | 数测试 | UD0 | 未定义指令0 | UD1 | 未定义指令1 | UD2 | 未定义指令2 | UMOV |
| VERW | 校验写 | WAIT | 等 | WBINVD | 回写无效高速缓存 | WRMSR | 写专用模式 | WRSHR |
| XADD | 交换加 | XBTS |
| XCHG | 交换 | XLAT | 换码 | XOR | 异或 | XSTORE |
|
指令 | 功能 | EMMS | 媒体空MMX状态 | F2XM1 | 浮点栈顶绝对值 | FADD | 浮点加 | FADDP | 浮点加出栈 | FBLD | 浮点加载十数 | FBSTP | 浮点保存十数出栈 | FCHS | 浮点正负求反 | FCLEX | 浮点检查错误清除 | FCMOVB | 浮点低于传送 | FCMOVBE | 浮点不高于传送 | FCMOVE | 浮点相等传送 | FCMOVNB | 浮点不低于传送 | FCMOVNBE | 浮点高于传送 | FCMOVNE | 浮点不等传送 | FCMOVNU | 浮点有序传送 | FCMOVU | 浮点无序传送 | FCOM | 浮点比较 | FCOMI | 浮点比较加载标志 | FCOMIP | 浮点比较加载标志出栈 | FCOMP | 浮点比较出栈 | FCOMPP | 浮点比较出栈二 | FCOS | 浮点余弦 | FDECSTP | 浮点栈针减一 | FDISI | 浮点检查禁止中断 | FDIV | 浮点除 | FDIVP | 浮点除出栈 | FDIVR | 浮点反除 | FDIVRP | 浮点反除出栈 | FENI | 浮点检查禁止中断二 | FFREE | 浮点释放 | FFREEP | 浮点释放出栈 | FIADD | 浮点加整数 | FICOM | 浮点比较整数 | FICOMP | 浮点比较整数出栈 | FIDIV | 浮点除整数 | FIDIVR | 浮点反除 | FILD | 浮点加载整数 | FIMUL | 浮点乘整数 | FINCSTP | 浮点栈针加一 | FINIT | 浮点检查初始化 | FIST | 浮点保存整数 | FISTP | 浮点保存整数出栈 | FISTTP | | FISUB | 浮点减整数 | FISUBR | 浮点反减整数 | FLD | 浮点加载数 | FLD1 | 浮点加载一 | FLDCW | 浮点加载控制器 | FLDENV | 浮点加载环境 | FLDL2E | 浮点加载L2E | FLDL2T | 浮点加载L2T | FLDLG2 | 浮点加载LG2 | FLDLN2 | 浮点加载LN2 | FLDPI | 浮点加载PI | FLDZ | 浮点加载零 | FMUL | 浮点乘 | FMULP | 浮点乘出栈 | FNCLEX | 浮点不检查错误清除 | FNDISI | 浮点不检查禁止中断 | FNENI | 浮点不检查禁止中断二 | FNINIT | 浮点不检查初始化 | FNOP | 浮点空 | FNSAVE | 浮点不检查保存状态 | FNSTCW | 浮点不检查保存控制器 | FNSTENV | 浮点不检查保存环境 | FNSTSW | 浮点不检查保存状态器 | FPATAN | 浮点部分反正切 | FPREM | 浮点部分余数 | FPREM1 | 浮点部分余数二 | FPTAN | 浮点部分正切 | FRNDINT | 浮点舍入求整 | FRSTOR | 浮点恢复状态 | FSAVE | 浮点检查保存状态 | FSCALE | 浮点比例运算 | FSETPM | 浮点设置保护 | FSIN | 浮点正弦 | FSINCOS | 浮点正余弦 | FSQRT | 浮点平方根 | FST | 浮点保存 | FSTCW | 浮点检查保存控制器 | FSTENV | 浮点检查保存环境 | FSTP | 浮点保存出栈 | FSTSW | 浮点检查保存状态器 | FSUB | 浮点减 | FSUBP | 浮点减出栈 | FSUBR | 浮点反减 | FSUBRP | 浮点反减出栈 | FTST | 浮点比零 | FUCOM | 浮点无序比较 | FUCOMI | 浮点反比加载标志 | FUCOMIP | 浮点反比加载标志出栈 | FUCOMP | 浮点无序比较出栈 | FUCOMPP | 浮点无序比较出栈二 | FWAIT | 浮点等 | FXAM | 浮点检查 | FXCH | 浮点交换 | FXTRACT | 浮点分解 | FYL2X | 浮点求L2X | FYL2XP1 | 浮点求L2XP1 | MOVED | 媒体双字传送 | MOVEQ | 媒体四字传送 | PACKSSDW | 媒体符号双字压缩 | PACKSSWB | 媒体符号字压缩 | PACKUSWB | 媒体无符号字压缩 | PADDB | 媒体截断字节加 | PADDD | 媒体截断双字加 | PADDSB | 媒体符号饱和字节加 | PADDSIW | | PADDSW | 媒体符号饱和字加 | PADDUSB | 媒体无符号饱和字节加 | PADDUSW | 媒体无符号饱和字加 | PADDW | 媒体截断字加 | PAND | 媒体与 | PANDN | 媒体与非 | PAVEB | | PCMPEQB | 媒体字节比等 | PCMPEQD | 媒体双字比等 | PCMPEQW | 媒体字比等 | PCMPGTB | 媒体字节比大 | PCMPGTD | 媒体双字比大 | PCMPGTW | 媒体字比大 | PDISTIB | | PMACHRIW | | PMADDWD | | PMAGW | | PMULHRIW | | PMULHRWC | | PMULHW | | PMVGEZB | | PMVLZB | | PMVNZB | | PMVZB | | POR | 媒体或 | PSLLD | 媒体双字左移 | PSLLQ | 媒体四字左移 | PSLLW | 媒体字左移 | PSRAD | 媒体双字算术右移 | PSRAW | 媒体字算术右移 | PSRLD | 媒体双字右移 | PSRLQ | 媒体四字右移 | PSRLW | 媒体字右移 | PSUBB | 媒体截断字节减 | PSUBSB | 媒体符号饱和字节减 | PSUBSIW | | PSUBSW | 媒体符号饱和字减 | PSUBUSB | 媒体无符号饱和字节减 | PSUBUSW | 媒体无符号饱和字减 | PSUBW | 媒体截断字减 | PUNPCKHBW | 媒体字节高位解压 | PUNPCKHDQ | 媒体双字高位解压 | PUNPCKHWD | 媒体字高位解压 | PUNPCKLBW | 媒体字节低位解压 | PUNPCKLDQ | 媒体双字低位解压 | PUNPCKLWD | 媒体字低位解压 |
Delphi 2010 VCL、JCL 源码中用到的汇编指令(只是粗略统计):
按名称排序 | 使用次数 | 按使用频率排序 | 使用次数 | ADC | 15 | MOV | 4053 | ADD | 659 | PUSH | 1505 | AND | 162 | CMP | 1372 | BSF | 8 | POP | 1187 | BSR | 7 | JE | 952 | BSWAP | 12 | CALL | 847 | BT | 13 | JMP | 771 | BTC | 9 | ADD | 659 | BTR | 10 | JNE | 503 | BTS | 10 | TEST | 452 | CALL | 847 | SUB | 400 | CDQ | 6 | DEC | 332 | CLD | 10 | LEA | 288 | CMP | 1372 | RET | 280 | CPUID | 3 | INC | 261 | CWD | 1 | JZ | 252 | DB | 241 | OR | 248 | DD | 189 | DB | 241 | DEC | 332 | DD | 189 | DIV | 40 | JNZ | 167 | DW | 63 | MOVZX | 166 | ELSE | 2 | AND | 162 | END | 2 | FLD | 154 | F2XM1 | 6 | SHR | 131 | FABS | 7 | JB | 101 | FADD | 9 | JG | 92 | FADDP | 15 | JA | 86 | FBSTP | 3 | REP | 83 | FCHS | 5 | JBE | 81 | FCLEX | 5 | XCHG | 79 | FCOM | 7 | JLE | 79 | FCOMP | 7 | FSTP | 76 | FCOMPP | 3 | LODSB | 74 | FCOS | 4 | JL | 72 | FDIV | 11 | FWAIT | 72 | FDIVP | 5 | NEG | 70 | FDIVRP | 11 | DW | 63 | FFREE | 13 | LOCK | 61 | FIADD | 6 | STOSB | 58 | FIDIV | 2 | STOSW | 54 | FILD | 32 | MOVSX | 53 | FIMUL | 4 | FLDCW | 52 | FINCSTP | 1 | FLD1 | 52 | FISTP | 30 | SHL | 48 | FLD | 154 | JAE | 48 | FLD1 | 52 | DIV | 40 | FLDCW | 52 | JGE | 35 | FLDL2E | 6 | REPNE | 33 | FLDLG2 | 2 | LODSW | 33 | FLDLN2 | 9 | IMUL | 32 | FLDZ | 8 | FMUL | 32 | FMUL | 32 | FILD | 32 | FMULP | 26 | JNS | 31 | FNCLEX | 11 | FISTP | 30 | FNINIT | 2 | FXCH | 28 | FNSTCW | 20 | FMULP | 26 | FNSTSW | 6 | JS | 24 | FPATAN | 15 | SBB | 22 | FPREM | 3 | FSTSW | 22 | FPTAN | 4 | LOOP | 20 | FRNDINT | 14 | FNSTCW | 20 | FSCALE | 8 | FSTCW | 18 | FSIN | 3 | NOT | 17 | FSINCOS | 7 | JECXZ | 17 | FSQRT | 15 | FYL2X | 17 | FST | 5 | MUL | 16 | FSTCW | 18 | JNC | 16 | FSTP | 76 | SAHF | 15 | FSTSW | 22 | ROR | 15 | FSUB | 11 | FSQRT | 15 | FSUBP | 5 | FPATAN | 15 | FSUBR | 2 | FADDP | 15 | FSUBRP | 4 | ADC | 15 | FTST | 4 | FRNDINT | 14 | FWAIT | 72 | FFREE | 13 | FXAM | 1 | BT | 13 | FXCH | 28 | SAR | 12 | FXTRACT | 1 | ROL | 12 | FYL2X | 17 | RCL | 12 | FYL2XP1 | 1 | JO | 12 | HLT | 1 | BSWAP | 12 | IMUL | 32 | REPE | 11 | INC | 261 | FSUB | 11 | INT | 8 | FNCLEX | 11 | JA | 86 | FDIVRP | 11 | JAE | 48 | FDIV | 11 | JB | 101 | WAIT | 10 | JBE | 81 | CLD | 10 | JC | 6 | BTS | 10 | JE | 952 | BTR | 10 | JECXZ | 17 | SETC | 9 | JG | 92 | FLDLN2 | 9 | JGE | 35 | FADD | 9 | JL | 72 | BTC | 9 | JLE | 79 | INT | 8 | JMP | 771 | FSCALE | 8 | JNA | 1 | FLDZ | 8 | JNC | 16 | BSF | 8 | JNE | 503 | PUSHFD | 7 | JNG | 2 | FSINCOS | 7 | JNL | 1 | FCOMP | 7 | JNS | 31 | FCOM | 7 | JNZ | 167 | FABS | 7 | JO | 12 | BSR | 7 | JRCXZ | 2 | NOP | 6 | JS | 24 | JC | 6 | JZ | 252 | FNSTSW | 6 | LEA | 288 | FLDL2E | 6 | LEAVE | 1 | FIADD | 6 | LOCK | 61 | F2XM1 | 6 | LODSB | 74 | CDQ | 6 | LODSW | 33 | STOSD | 5 | LOOP | 20 | POPFD | 5 | MOV | 4053 | FSUBP | 5 | MOVSB | 1 | FST | 5 | MOVSX | 53 | FDIVP | 5 | MOVZX | 166 | FCLEX | 5 | MUL | 16 | FCHS | 5 | NEG | 70 | SHRD | 4 | NOP | 6 | PUSHF | 4 | NOT | 17 | POPF | 4 | OR | 248 | FTST | 4 | PAUSE | 3 | FSUBRP | 4 | POP | 1187 | FPTAN | 4 | POPF | 4 | FIMUL | 4 | POPFD | 5 | FCOS | 4 | PUSH | 1505 | RCR | 3 | PUSHF | 4 | PAUSE | 3 | PUSHFD | 7 | FSIN | 3 | RCL | 12 | FPREM | 3 | RCR | 3 | FCOMPP | 3 | REP | 83 | FBSTP | 3 | REPE | 11 | CPUID | 3 | REPNE | 33 | STD | 2 | RET | 280 | SETNZ | 2 | ROL | 12 | SETE | 2 | ROR | 15 | JRCXZ | 2 | SAHF | 15 | JNG | 2 | SAL | 1 | FSUBR | 2 | SAR | 12 | FNINIT | 2 | SBB | 22 | FLDLG2 | 2 | SETC | 9 | FIDIV | 2 | SETE | 2 | END | 2 | SETNC | 1 | ELSE | 2 | SETNZ | 2 | STC | 1 | SHL | 48 | SHLD | 1 | SHLD | 1 | SETNC | 1 | SHR | 131 | SAL | 1 | SHRD | 4 | MOVSB | 1 | STC | 1 | LEAVE | 1 | STD | 2 | JNL | 1 | STOSB | 58 | JNA | 1 | STOSD | 5 | HLT | 1 | STOSW | 54 | FYL2XP1 | 1 | SUB | 400 | FXTRACT | 1 | TEST | 452 | FXAM | 1 | WAIT | 10 | FINCSTP | 1 | XCHG | 79 | CWD | 1 |
|