一、汇编标志位:
CF: 进位标志
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
PF: 奇偶标志
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
AF: 辅助进位标志
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
ZF: 零标志
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
SF: 符号标志
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
OF: 溢出标志
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
TF: 追踪标志
当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。
IF: 中断允许标志
(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求
DF: 方向标志
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
二、常见寄存器
寄存器 16位 32位 64位
累加寄存器 AX EAX RAX
基址寄存器 BX EBX RBX
计数寄存器 CX ECX RCX
数据寄存器 DX EDX RDX
堆栈基指针 BP EBP RBP
变址寄存器 SI ESI RSI
堆栈顶指针 SP ESP RSP
指令寄存器 IP EIP RIP
三、汇编指令集
(1) 数据传送指令。
1. 通用数据传输指令:MOV
格式:MOV DEST,SRC
功能:把一个字节,字或双字从源操作数SRC传送至目的操作数DEST。
2. 扩展传送指令: MOV SX, MOV ZX
格式:MOV SX DEST,SRC
MOV ZX DEST,SRC
功能:将源操作数由8位扩展到16位送目的操作数,或由16位扩展到32位送目的操作数。
MOV SX是按有符号数扩展
MOV ZX是按无符号数扩展。无符号数或正数高位扩展为0,负数高位扩展为全“1”。
例: MOV BL,80H ; -128
MOV SX AX,BL ; 将80H扩展为FF80H后送AX中。
MOV BL,80H ; 128
MOV ZX AX,BL ; 将80H扩展为0080H后送AX中
3. 交换指令:XCHG BSWAP
格式:XCHG OPR1,OPR2
BSWAP REG
功能:XCHG :交换操作数OPR1和OPR2的值,操作数数据类型为字节、字或双字。
BSWAP :将32位通用寄存器中,第1个字节和第4个字节交换,第2个字节和第3个字节交换。
4. 压栈指令:PUSH PUSHA PUSHAD
格式:PUSH SRC
功能:将源操作数压下堆栈,源操作数允许为16位或32位通用寄存器、存储器和立即数以及16位段寄存器。当操作数数据类型为字类型,压栈操作使SP值减2;当数据类型为双字类型,压栈操作使SP值减4。
PUSHA将16位通用寄存器压入堆栈,压栈顺序为AX,CX,DX,BX,SP,BP,SI,DI。
PUSHAD将32位通用寄存器压入堆栈,压栈顺序为EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。
5. 出栈指令:POP POPA POPAD
格式:POP DEST
功能:从栈顶弹出操作数送入目的操作数。
POPA从堆栈移出16字节数据,
POPAD从堆栈移出32字节数据
6. 地址传送指令:LEA
格式:LEA REG,MEM
功能:将源操作数的有效地址传送到通用寄存器,
7. 查表指令:XLAT
8. 符合扩展指令 CBW CWD CWDE CDQ
格式:CBW :将AL中8位带符号数,进行带符号扩展为16位,送AX中。
CWD :将AX中16位带符号数,进行带符号扩展为32位
CWDE:将AX中16位带符号数,进行带符号扩展为32位,送EAX中。
CDQ:将EAX中32位带符号数,进行带符号扩展为64位,送EDX和EAX中。低32位送EAX中,高32位送EDX中。
(2) 算术运算指令。
1. 加法指令:ADD
交互相加指令:XADD
格式:ADD DEST,SRC
XADD DEST,REG
功能:ADD是将源操作数与目的操作数相加,结果传送到目的操作数。
2. 减法指令:SUB
格式:SUB DEST,SRC
功能:SUB将目的操作数减源操作数,结果送目的操作数。
3. 自增自减指令:INC DEC
格式:INC DEST
DEC DEST
功能:INC指令将目的操作数加1,结果送目的操作数。
DEC指令将目的操作数减1,结果送目的操作数。
4. 比较指令:CMP
格式:CMP DEST,SRC
功能:目的操作数减源操作数,结果不回送。
结果:两个正数比较,使用SF标志位判断。
SF=0,则AX>BX,若ZF=1,则AX=BX
SF=1,则AX<BX
两个无符号数比较,使用CF标志位判断。
CF=0,则AX>BX,若ZF=1,则AX=BX
CF=1,则AX<BX
两个负数比较,使用SF标志位判断。
SF=0,则AX>BX,若ZF=1,则AX=BX
SF=1,则AX<BX
两个异符号数比较。
如果OF=0,仍可用SF标志判断大小。
如果OF=1,说明结果的符号位发生错误,所以
SF=0,则AX<BX
SF=1,则AX>BX
5. 求补指令:NEG
格式:NEG DEST
功能:对目的操作数求补,用零减去目的操作数,结果送目的操作数。
6. 乘法指令:MUL IMUL
格式:MUL SRC
IMUL SRC
功能:MUL为无符号数乘法指令,IMUL为带符号数乘法指令。目的操作数缺省存放在ACC(AL,AX,EAX)中,乘积存AX,DX:AX,EDX:EAX中。
格式:IMUL DEST,SRC
功能:将目的操作数乘以源操作数,结果送目的操作数。
格式:IMUL DEST,SRC1,SRC2
功能:将源操作数SRC1与源操作数SRC2相乘,结果送目的操作数。
7. 除法指令:DIV IDIV
格式:DIV SRC
IDIV SRC
功能:DIV为无符号数除法,IDIV为带符号数除法。被除数缺省在目的操作数AX,DX:AX,EDX:EAX中。
8. BCD算术运算 DAA DAS
格式:DAA
功能:将存放在AL中的二进制和数,调整为压缩格式的BCD码表示形式。
格式:DAS
功能:将存放在AL中的二进制差数,调整为压缩的BCD码表示形式。
例: SUB AL,BL
DAS
9. ASCII算术运算
AAA:将存放在AL中的二进制和数,调整为ASCII码表示的结果。
AAS:将存放在AL中的二进制差数,调整为ASCII码表示形式
AAM:将存放在AL中的二进制积数,调整为ASCII码表示形式。
AAD:将AX中两位非压缩BCD码(一个字节存放一位BCD码),转换为二进制数的表示形式。
(3) 逻辑运算指令。
1. 逻辑与指令:AND
格式:AND DEST,SRC
功能:目的操作数和源操作数按位进行逻辑与运算,结果存目的操作数中。
2. 逻辑或指令:OR
格式:OR DEST,SRC
功能:目的操作数和源操作数按位进行逻辑或运算,结果存目的操作数中。
3. 逻辑异或指令:XOR
格式:XOR DEST,SRC
功能:目的操作数和源操作数按位进行逻辑异或运算,结果送目的操作数。
4. 逻辑非指令:NOT
格式:NOT DEST
功能:对目的操作数按位取反,结果回送目的操作数。目的操作数可以为通用寄存器或存储器。
5. 测试指令:TEST
格式:TEST DEST,SRC
功能:目的操作数和源操作数按位进行逻辑与操作,结果不回送目的操作数。
TEST指令常用于测试操作数中某位是否为1,而且不会影响目的操作数。如果测试某位的状态,对某位进行逻辑与1的运算,其它位逻辑与0,然后判断标志位。运算结果为0,ZF=1,表示被测试位为0;否则ZF=0,表示被测试位为1。
6. 算术/逻辑左移指令:
格式:SAL DEST,OPRD
SHL DEST,OPRD
功能:按照操作数OPRD规定的移位位数,对目的操作数进行左移操作,最高位移入CF中。每移动一位,右边补一位0。
7. 算术右移指令:SAR
格式:SAR DEST,OPRD
功能:按照操作数OPRD规定的移位次数,对目的操作数进行右移操作,最低位移至CF中,最高位(即符号位)保持不变。
8. 逻辑右移指令:SHR
格式:SHR DEST,SRC
ROR DEST,OPRD
功能:按照操作数OPRD规定的移位位数,对目的操作数进行右移操作,最低位移至CF中。每移动一位,左边补一位0。
9. 循环移位指令:ROL ROR
格式:ROL DEST,OPRD
功能:循环左移指令ROL,目的操作数左移,每移位一次,其最高位移入最低位
循环右移指令 ROR, 目的操作数右移,每移位一次,其最低位移入最高位,
10. 双精度移位指令
格式:SHLD DEST,SRC,OPRD
SHRD DEST,SRC,OPRD
功能:对于由目的操作数DEST和源操作数SRC构成的双精度数,按照操作数OPRD给出的移位位数,进行移位。SHLD是对目的操作数进行左移,SHRD是对目的操作数进行右移
(4) 串操作指令。
串操作允许程序对连续存放大的数据块进行操作。
1. 字符串传送指令 MOVSB MOVSW MOVSD
格式:MOVS DESTS, SRCS
功能:将规定的源串元素复制到规定的目的串单元中
2. 字符串比较指令 CMPSB,CMPSW,CMPSD
格式:CMPS DESTS, SRCS
功能:由规定的源串元素减去指出的目的串元素,结果不回送,仅影响标志位CF,AF,PF,OF,ZF,SF。
3. 字符串搜索指令 SCASB,SCASW
格式:SCAS DESTS
功能:由AL,AX或EAX的内容减去规定的目的串元素,结果不回送,仅影响标志位CF,AF,PF,SF,OF,ZF。
(5) 控制转移指令。
计算机执行程序一般是顺序地逐条执行指令。但经常须要根据不同条件做不同的处理,有时需要跳过几条指令,有时需要重复执行某段程序,或者转移到另一个程序段去执行。用于控制程序流程的指令包括转移、循环、过程调用和中断调用。
1. 无条件转移指令:JMP
格式:JMP TARGET
功能:使程序无条件地转移到指令规定的目的地址TARGET去执行指令。
2. 单标志位条件转移指令
格式:JZ NEXT;
功能:若标志ZF=1则转移到标号NEXT处执行。(结果为0(或相等)则转移)
3. 无符号数比较条件转移
格式:JA NEXT;
功能:无符号数A与B比较,若A>B则转移到标号NEXT处执行程序
4. 带符号数比较条件转移
格式: JG NEXT;
功能:若A>B则转移到标号NEXT。
5. JS(结果为负则转移)
6. JNS(结果为正则转移)
7. JP(奇偶位为1则转移)
8. JNP(奇偶位为0则转移)
9. 循环指令集
格式: LOOP 地址
功能: 循环指令集
10. CALL,RET
格式:CALL 地址 RET RET n
功能: 子程序调用,返回指令
(6) 处理器控制指令。
1. 空操作:NOP
功能:空操作,除使IP/EIP增1外,不做任何工作。该指令不影响标志位。
2. 处理器等待指令:WAIT
功能:检查BUSY引脚状态,等待协处理器完成当前工作。
3. 处理器暂停指令:HLT
功能:暂停程序的执行。当产生一个外部中断或非屏蔽中断时,才继续执行下一条指令。
4. 中断指令:INT
格式:INT n
功能:功能:产生中断类型码为n的软中断,该指令包含中断操作码和中断类型码两部分,中断类型码n为8位,取值范围为0~255(00H~FFH)。
(7) 保护方式指令。