MOV----> move
格式:mov 参1,参2
根据参1的大小将参2的数据发送到参1
MOVSX---->extended move with sign data
MOVZX---->extended move with zero data
格式:MOV SX DEST,SRC
MOV ZX DEST,SRC
功能:将源操作数由8位扩展到16位送目的操作数,或由16位扩展到32位送目的操作数。其中MOVSX是按有符号数扩展,MOVZX是按无符号数扩展。无符号数或正数高位 扩展为0,负数高位扩展为全“1”。
格式 push src
将32位|16位数据压入堆栈中,sp-4 ,
POP---->pop
格式: pop (内存单元,寄存器)
将数据出栈到 寄存器,或者内存单元中
PUSHA---->push all
格式:PUSHA
功能:PUSHA将16位通用寄存器压入堆栈,压栈顺序为AX,CX,DX,BX,SP,BP,SI,DI。
格式:popa
功能:POPA从堆栈移出16字节数据,并且按顺序存入寄存器DI,SI,BP,SP,BX,DX,CX,AX中。
PUSHAD---->push all data
格式:PUSHAD
功能:PUSHAD将32位通用寄存器压入堆栈,压栈顺序为EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。
POPAD
格式:POPAD
功能:POPAD从堆栈移出32字节数据,并且按顺序存入寄存器EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX中。
BSWAP---->byte swap
BSWAP REG
功能:将32位通用寄存器中,第1个字节和第4个字节交换,第2个字节和第3个字节交换。
XCHG---->exchange
格式:XCHG OPR1,OPR2
功能:交换操作数OPR1和OPR2的值,操作数数据类型为字节、字或双字。允许通用寄存器之间,通用寄存器和存储器之间交换数据。。
CMPXCHG---->compare and change
CMPXCHG DEST,REG
功能:目的操作数减源操作数,
如果DEST=SRC,则SRC→DEST。
如果DEST≠SRC,则DEST→ACC(AL,AX,EAX)。
源操作数允许为通用寄存器。目的操作数可以为通用寄存器,存储器操作数。
CMPXCHG影响标志位为OF,SF,ZF,AF,PF,CF。
XADD---->exchange and add
格式:XADDDEST,REG
功能:目的操作数加源操作数,结果送目的操作数。原目的操作数内容送源操作数。源操作数允许为通用寄存器。目的操作数允许为通用寄存器、存储器操作数。
XADD指令影响标志位为OF,SF,ZF,AF,PF,CF。
XLAT---->translate
格式:XLAT
功能:将寄存器AL中的内容转换成存储器表格中的对应值。实现直接查表功能。
XLAT指令规定:BX寄存器存放表的首地址,AL寄存器中存放表内偏移量,执行XLAT指令,以段寄存器DS的内容为段基址,有效地址为BX和AL内容之和,取出表中一个 字节内容送AL中。
例子:
·DATA
TABLE DB 11H,22H,33H,44H,55H 某编码表
·CODE
·STARTUP
MOV AL,4 ;AL←4
MOV BX,OFFSET TABLE ;BX←TABLE表首地址
XLAT ;结果在AL中,AL=55H
IN---->input
格式:IN DEST, SRC
功能:根据源操作数SRC给出的端口地址,将操作数从指定端口传送到目的操作数DEST处,其中DEST为AL,AX或EAX,端口地址SRC可以直接形式给出8位端口地址, 或由DX寄存器以间接形式给出。
OUT---->output
格式OUT DEST, SRC
功能:将源操作数SRC送到目的操作数DEST所指定的端口。其中源操作数SRC为AL,AX或EAX,目的操作数可以8位端口地址方式直接给出或以DX寄存器间接方式给出。
使用输入、输出指令应注意:
直接寻址方式端口地址为8位,共有0~255个端口地址;
间接寻址方式,只能用DX作为地址寄存器,寻址范围为64K字节;
每个I/O地址对应的端口的数据长度为8位,传送8位数据占用一个端口地址,传送16位数据占用2个端口地址,传送32位数据占用4个端口地址。
LEA---->load effective address
格式:LEA REG,MEM
功能:将源操作数的有效地址传送到通用寄存器,操作数REG为16位或32位通用寄存器,源操作数为16位或32位存储器操作数。
LDS---->load DS
格式L(ES|FS|GS|SS)REG,MEMORY
功能:根据源操作数指定的偏移地址,在数据段中取出段地址和偏移地址分别送指定的段寄存器和指定的通用寄存器
LAHF---->load AH from flag
格式:LAHF
功能:LAHF将标志寄存器中低8位送AH中。
SAHF---->save AH to flag
格式:SAHF
功能:SAHF将AH中内容送标志寄存器中低8位。
PUSHF---->push flag
格式:PUSHF
功能:PUSHF将标志寄存器低16位内容压入堆栈,SP←SP-2。
POPF---->pop flag
格式:POPF
功能:POPF将当前栈顶一个字传送到标志寄存器低16位中,SP←SP+2。
PUSHD---->push dflag
格式:PUSHD
功能:PUSHFD将标志寄存器32位内容压入堆栈SP←SP-4。
POPD---->pop dflag
格式:POPD
功能:POPFD将当前栈顶一个双字传送到32位标志寄存器中,SP←SP+4。
二、算术运算指令ADD---->add
格式:ADD 参1,参2
功能:参1=参1+参2
ADC---->add with carry
格式:ADC 参1,参2
功能:ADC是将源操作数与目的操作数以及CF(低位进位)值相加,结果传送到目的操作数(参1)。
INC---->increase 1
格式:INC 参1
功能:参1=参1+1
AAA---->ascii add with adjust
格式:AAA
功能:将存放在AL中的二进制和数,调整为ASCII码表示的结果。调整方法:若AL中低4位小于或等于9,仅AL中高4位清0,AF→CF。若AL中低4位大于9或标志AF=1(进位),则AL+6→AL,AH+1→AH,1→AF,AF→CF,AL中高4位清0。AAA指令一般紧跟在ADD或ADC指令之后使用,影响标志位为AF,CF。其它标志位无定义。
DAA---->decimal add with adjust
格式:DAA
功能:将存放在AL中的二进制和数,调整为压缩格式的BCD码表示形式。调整方法:若AL中低4位大于9或标志AF=1(表示低4位向高4位有进位),则AL+6→AL,1→AF,若AL中高4位大于9,或标志CF=1,(表示高4位有进位),则AL+60H→AL,1→CF,DAA指令一般紧跟在ADD或ADC指令之后使用,影响标志位为SF,ZF,AF,PF,CF。OF无定义。
SUB---->substract
格式:sub 参1,参2
功能:参1=参1-参2
SBB---->substract with borrow
格式:SBB 参1,参2
功能:参1=参1-参2-CF
DEC---->decrease 1
格式:DEC 参1
功能:参1=参1-1
NEC---->negativeCMP---->compare
格式:CMP Dest,Src
功能:Dest-Src CMP指令影响标志位为OF,SF,ZF,AF,PF,CF。
AAS---->ascii adjust on substract
格式:AAS
功能:将存放在AL中的二进制差数,调整为ASCII码表示形式
调整方法:若AL中低4位小于等于9,仅AL中高4位清0,AF→CF。若AL中低4位大于9或标志AF=1,则AL-6→AL,AH-1→AH,1→AF,AF→CF,AL中高4位清0。AAS指令 一般紧跟在SUB,SBB指令之后使用,影响标志位为AF,CF。其它标志位无定义。
DAS---->decimal adjust on substract
格式:DAS
功能:将存放在AL中的二进制差数,调整为压缩的BCD码表示形式。
调整方法:若AL中低4位大于9或标志AF=1(表示低4位向高位借位),则AL-6→AL,1→AF若AL中高4位大于9或标志CF=1(表示高4位向高位借位),则AL- 60H→AL,1→CFDAS指令一般紧跟在SUB或SBB指令之后使用,影响标志位为SF,ZF,AF,PF,CF。OF无定义。
MUL---->multiplication IMUL---->integer multiplication
功能:MUL为无符号数乘法指令,IMUL为带符号数乘法指令。源操作数为通用寄存器或存储器操作数。目的操作数缺省存放在ACC(AL,AX,EAX)中,乘积存AX,DX: AX,EDX:EAX中。
字节乘:ALSRC→AX
字乘:AXSRC→DX∶AX
双字乘:EAXSRC→EDX∶EAX
MUL,IMUL指令执行后,CF=OF=0,表示乘积高位无有效数据;CF=OF=1表示乘积高位含有效数据,对其它标志位无定义。
AAM---->ascii adjust on multiplication
格式:AAM
功能:将存放在AL中的二进制积数,调整为ASCII码表示形式。
调整方法:AL/10商→AH,余数→AL
AAM指令一般紧跟在MUL指令之后使用,影响标志位为SF,ZF,PF。其它标志位无定义。
DIV---->divide
IDIV---->integer divide
格式:DIV SRC IDIV SRC
功能:DIV为无符号数除法,IDIV为带符号数除法。源操作数作为除数,为通用寄存器或存储器操作数。被除数缺省在目的操作数AX,DX:AX,EDX:EAX中。
字节除法:AX/SRC商→AL,余数→AH
字除法:DX·AX/SRC商→AX,余数→DX
双字除法:EDX·EAX/SRC商→EAX,余数→EDX
由于被除数必须是除数的双倍字长,一般应使用扩展指令进行高位扩展。当进行无符号数除法时,被除数高位按0扩展为双倍除数字长。当进行有符号数除法时,被除数 以补码表示。可使用扩展指令CBW,CWD,CWDE,CDQ进行高位扩展。例如:
MOV AX,BLOCK
CWD;被除数高位扩展
MOV BX,1000H
IDIV BX 对于带符号除法,其商和余数均采用补码形式表示,余数与被除数同符号。当除数为零或商超过了规定数据类型所能表示的范围时,将会出现溢出现象,产生一 个中断类型码为“0”的中断。执行除法指令后标志位无定义。
AAD---->ascii adjust on divide
格式:DAA
功能:将存放在AL中的二进制和数,调整为压缩格式的BCD码表示形式。
调整方法:若AL中低4位大于9或标志AF=1(表示低4位向高4位有进位),则AL+6→AL,1→AF,若AL中高4位大于9,或标志CF=1,(表示高4位有进位),则 AL+60H→AL,1→CF,DAA指令一般紧跟在ADD或ADC指令之后使用,影响标志位为SF,ZF,AF,PF,CF。OF无定义。
转换命令
CBW---->change byte to word
格式:CBW
功能:将AL中8位带符号数,进行带符号扩展为16位,送AX中。带符号扩展是指对正数高位扩展为全“0”,对负数高位扩展为全“1”。
例 3.25AL=55H 经CBW扩展后 AX=0055H
AL=A5H 经CBW扩展后 AX=FFA5H
CWD---->change word to double word
格式:CWD
功能:将AX中16位带符号数,进行带符号扩展为32位,送DX和AX中。高16位送DX中,低16位送AX中。
CWDE---->change word to double word with sign to EAX
格式:CWDE
功能:将AX中16位带符号数,进行带符号扩展为32位,送EAX中。
格式:CDQ
功能:将EAX中32位带符号数,进行带符号扩展为64位,送EDX和EAX中。低32位送EAX中,高32位送EDX中。
三、逻辑运算指令
———————————————————————————————————————
AND---->and 与
OR---->or 或XOR---->xor 异或
NOT---->not 取反
TEST---->test 与 不写入目标操作位
SHL---->shift left
SAL---->arithmatic shift left
格式:SAL DEST,OPRD
SHL DEST,OPRD
功能:按照操作数OPRD规定的移位位数,对目的操作数进行左移操作,最高位移入CF中。每移动一位,右边补一位0。如图312(a)所示。目的操作数可以为通用寄存器或存储器操作数。
SAL,SHL指令影响标志位OF,SF,ZF,PF,CF。
SHR---->shift right
格式:SHR DEST,SRC
功能:按照操作数OPRD规定的移位位数,对目的操作数进行右移操作,最低位移至CF中。每移动一位,左边补一位0。如图312(c)所示,目的操作数可以为通用寄存器或存储器操作数。
SHR指令影响标志位OF,SF,ZF,PF,CF。
SAR---->arithmatic shift right
算术右移指令。
格式:SAR DEST,OPRD
功能:按照操作数OPRD规定的移位次数,对目的操作数进行右移操作,最低位移至CF中,最高位(即符号位)保持不变。如图312(b)所示。目的操作数可以为通用寄存器或存储器操作数。
SAR指令影响标志位OF,SF,ZF,PF,CF。
ROL---->rotate left
ROR---->rotate right
RCL---->rotate left with carry
RCR---->rotate right with carry
功能:循环左移指令ROL,见图313(a)所示,目的操作数左移,每移位一次,其最高位移入最低位,同时最高位也移入进位标志CF。循环右移指令 ROR见图313(b)所示,目的操作数右移,每移位一次,其最低位移入最高位,同时最低位也移入进位标志CF。带进位循环左移指令RCL,见图313(c)所示,目的操作数左移,每移动一次,其最高位移入进位标志CF,CF移入最低位。带进位循环右移指令RCR,见图313(d)所示,目的操作数右移,每移动一次,其最低位移入进位标志CF,CF移入最高位。
四、串指令
———————————————————————————————————————
MOVS---->move string
基本格式:[REP]MOVS DESTS, SRCS
[REP] MOVSB/MOVSW/MOVSD
功能:将DS:(E)SI规定的源串元素复制到ES:(E)DI规定的目的串单元中,
该指令对标志位无影响。
如果加重复前缀REP,则可以实现连续存放的数据块的传送,直到(E)CX=0为止。
在16位指令模式下,使用SI,DI,CX寄存器;在32位指令模式下,使用ESI,EDI,ECX寄存器。
CMPS---->compare string
基本格式:[REPE/Z] [REPNZ/NE] CMPS DESTS, SRCS
[REPE/Z] [REPNZ/NE] CMPSB/CMPSW/CMPSD
功能:由DS:(E)SI规定的源串元素减去ES:(E)DI指出的目的串元素,结果不回送,仅影响标志位CF,AF,PF,OF,ZF,SF。当源 串元素与目的串元素值相同时,ZF=1;否则ZF=0。每执行一次串比较指令,根据DF的值和串元素数据类型自动修改(E)SI和(E)DI。在串比较指令前加重复前缀REPE/Z,则表示重复比较两个字符串,若两个字符串的元素相同则比较到(E)CX=0为止,否则结束比较。在串比较指令 前加重复前缀REPNE/NZ,则表示若两个字符串元素不相同时,重复比较直到(E)CX=0为止,否则结束比较。
SCAS---->scan string
格式①: [REPE/Z] [REPNE/NZ] SCAS DESTS
格式②: [REPE/Z] [REPNE/NZ] SCASB/SCASW/SCASD
功能:由AL,AX或EAX的内容减去ES:(E)DI规定的目的串元素,结果不回送,仅影响标志位CF,AF,PF,SF,OF,ZF。当AL, AX或EAX的值与目的串元素值相同时,ZF=1;否则ZF=0。每执行一次串扫描指令,根据DF的值和串元素数据类型自动修改(E)DI。在串扫描指令前加重复前缀REPE/Z,则表示目的串元素值和累加器值相同时重复扫描,直到CX/ECX=0为止,否则结束扫描。若加重复前缀 REPNE/NZ,则表示当目的串元素值与累加器值不相等时,重复扫描直到CX/ECX=0时为止,否则结束扫描。
该指令影响标志位为CF,AF,PF,SF,OF,ZF。
LODS---->load string
格式:LODS SRCS
LODSB/LODSW/LODSD
功能:将DS:SI/ESI所指的源串元素装入累加器(AL,AX,EAX)中,每装入一次都按照DF值以及串元素类型自动修改地址指针SI/ESI,该指令一般不须加重复前缀,并且不影响标志位。
STOS---->store string
格式:[REP] STOS DESTS
[REP] STOSB/STOSW/STOSD
功能:将累加器/[AL,AX,EAX/]中值存入ES:DI/EDI所指的目的串存储单元中,每传递一次,都按DF值以及串元素类型自动修改地址指 针DI/EDI。若加重复前缀REP,则表示将累加器的值连续送目的串存储单元,直到CX/ECX=0时为止。
该指令不影响标志位。
REP---->repeat
格式:[REP] STOS DESTS
[REP] STOSB/STOSW/STOSD
功能:将累加器/[AL,AX,EAX/]中值存入ES:DI/EDI所指的目的串存储单元中,每传递一次,都按DF值以及串元素类型自动修改地址指 针DI/EDI。若加重复前缀REP,则表示将累加器的值连续送目的串存储单元,直到CX/ECX=0时为止。
该指令不影响标志位。
REPE---->repeat when equal
REPZ---->repeat when zero flag
REPNE---->repeat when not equal
REPNZ---->repeat when zero flag
REPC---->repeat when carry flag
REPNC---->repeat when not carry flag
基本格式:[REPE/Z] [REPNZ/NE] CMPS DESTS, SRCS
[REPE/Z] [REPNZ/NE] CMPSB/CMPSW/CMPSD
功能:由DS:(E)SI规定的源串元素减去ES:(E)DI指出的目的串元素,结果不回送,仅影响标志位CF,AF,PF,OF,ZF,SF。当源 串元素与目的串元素值相同时,ZF=1;否则ZF=0。每执行一次串比较指令,根据DF的值和串元素数据类型自动修改(E)SI和(E)DI。
在串比较指令前加重复前缀REPE/Z,则表示重复比较两个字符串,若两个字符串的元素相同则比较到(E)CX=0为止,否则结束比较。在串比较指令 前加重复前缀REPNE/NZ,则表示若两个字符串元素不相同时,重复比较直到(E)CX=0为止,否则结束比较。
五、程序转移指令
———————————————————————————————————————
1>无条件转移指令(长转移)
JMP---->jump
CALL---->call
RET---->return
RETF---->return far
2>条件转移指令(短转移,-128到+127的距离内)
JAE---->jump when above or equal
JNB---->jump when not below
JB---->jump when below
JNAE---->jump when not above or equal
JBE---->jump when below or equal
JNA---->jump when not above
JG---->jump when greater
JNLE---->jump when not less or equal
JGE---->jump when greater or equal
JNL---->jump when not less
JL---->jump when less
JNGE---->jump when not greater or equal
JLE---->jump when less or equal
JNG---->jump when not greater
JE---->jump when equal
JZ---->jump when has zero flag
JNE---->jump when not equal
JNZ---->jump when not has zero flag
JC---->jump when has carry flag
JNC---->jump when not has carry flag
JNO---->jump when not has overflow flag
JNP---->jump when not has parity flag
JPO---->jump when parity flag is odd
JNS---->jump when not has sign flag
JO---->jump when has overflow flag
JP---->jump when has parity flag
JPE---->jump when parity flag is even
JS---->jump when has sign flag
3>循环控制指令(短转移)
LOOP---->loop
LOOPE---->loop equal
LOOPZ---->loop zero
LOOPNE---->loop not equal
LOOPNZ---->loop not zero
JCXZ---->jump when CX is zero
JECXZ---->jump when ECX is zero
4>中断指令
INT---->interrupt
INTO---->overflow interrupt
IRET---->interrupt return
5>处理器控制指令
HLT---->halt
WAIT---->wait
ESC---->escape
LOCK---->lock
NOP---->no operation
STC---->set carry
CLC---->clear carry
CMC---->carry make change
STD---->set direction
CLD---->clear direction
STI---->set interrupt
CLI---->clear interrupt