指令系统主要考虑以下几个方面:
①对PSW影响 影响/不影响/不定义
②B/W 字节还是字操作
③寻址方式
④功能
⑤格式
一、数据传送指令
1.通用数据传送指令
(1) MOV DST,SRC <–> (DST)<–(SRC)
注:1.二者不能同时为段寄存器,不能同时为存储器寻址
2.立即数不能直接送段寄存器
3.目的操作数不允许用立即数方式,也不允许用CS寄存器。
4.MOV指令不影响标志位
(2) PUSH SRC POP DST
16位指令:(SP) <-- (SP)–2 (DST) <-- ((SP)+1,(SP))
((SP)+1,(SP)) <-- (SRC) (SP) <-- (SP)+2
注意:1.PUSH和POP只能作字或双字操作。
2.不允许PUSH、POP指令使用立即数寻址方式。
3.POP指令的目的为段寄存器时,不允许使用CS寄存器。
4.PUSH和POP不影响标志位。
(3) XCHG OPR1,OPR2 --> (OPR1) <–> (OPR2)
注意:1.两个操作数必须有一个在寄存器中。
2.不允许使用段寄存器。
3.可用除立即数外的任何寻址方式,不影响标志位。
2.累加器专用传送指令(限用EAX,AX,AL)
(1)IN AL,DX(字节) --> (AL)<-- ((DX))
IN AX,DX(字) --> (AX)<-- ((DX+1,(DX))
IN EAX,DX(双字) --> (EAX)<-- ((DX+3,(DX)+2,(DX)+1,(DX))
(2)OUT DX,AL --> ((DX)) <-- (AL)
OUT DX,AX --> ((DX+1,(DX)) <-- (AX)
这里的端口号或DX的内容均为地址,而传送的是端口中的信息。
例:MOV DX,3FCH
IN EAX,DX
从端口03FCH送一个双字到EAX寄存器。
例:OUT 5,AL
从AL寄存器输出一个字节到端口5。
(3)XLAT 换码指令
建立一个字节表格,表格的首地址提前存入BX寄存器,相对于表格首地址的位移量也提前存入AL寄存器中,表格的内容则是要换取的代码,该指令执行后就可在AL中得到转换后的代码。
XLAT / XLAT OPR --> (AL) <-- ((BX)+(AL))
例: MOV AL,X
LEA BX,TABLE
XLAT TABLE
3.地址传送指令
LEA REG,SRC --> (REG) <-- SRC
将源操作数的有效地址送到指定寄存器中。
例: (假设存储单元地址为0100H,存储单元内容为3412H)
MOV AX,BUF -->AX=3413H
MOV BX,OFFSET BUF -->BX=0100H
LEA BX,BUF -->BX=0100H
注意:1.不能使用段寄存器。
2.可使用除立即数和寄存器外的任一种存储器寻址方式。
3.不影响标志位。
4.类型转换指令
CBW CWD
字节转换为字指令 字转换为双字指令
例如:MOV AL,80H
CBW
则AX=0FF80H
二、算术指令
1.加法指令
(1)ADD DST,SRC --> (DST)<–(SRC)+(DST)
(2)ADC DST,SRC --> (DST)<–(SRC)+(DST)+CF
DX AX <-- SRC ADD BX,AX
+
CX BX <-- DST ADC CX,DX
————————————
CX BX
(3)INC OPR --> (OPR)<–(OPR)+1
注意:需准确说明是字还是字节
例:INC AX (√)
INC [BX] (×)
INC BYTE PTR [BX] (√)
INC WORT PTR [BX] (√)
2.减法指令
(1)SUB DST,SRC --> (DST) <-- (SRC)+(DST)
(2)SBB DST,SRC --> (DST) <-- (SRC)-(DST)-CF
(3)DEC OPR --> (OPR) <-- (OPR)-1
(4)NEG OPR --> (OPR) <-- -(OPR) 求补指令
(5)CMP OPR1,OPR2 --> (OPR1)-(OPR2)
3.乘法指令
(1)MUL 无符号数乘法
(字节)(AX)<–(AL)×(SRC)
(字) (DX,AX)<–(AX)×(SRC)
(2)IMUL 带符号数乘法
8位SRC 16位SRC
× AL × AX
—————— ——————
AH AL DX AX
注意:(1) MUL 1234H(×)
IMUL DS (×)
IMUL [BX] (×)
(2)不能与立即数相乘
(3)乘数寄存器:AL(AX) 乘积寄存器:AX(DX,AX)
(4)乘法指令对除CF位和OF位以外的条件码位无定义。
4.除法指令
(1)DIV SRC
(2)IDIV SRC
字节操作:(AL) <-- (AX)/(SRC)的商
(AH) <-- (AX)/(SRC)的余数
字操作:(AX) <-- (DX,AX)/(SRC)的商
(DX) <-- (DX,AX)/(SRC)的余数
注意: AX(DX,AX) <-- 被除数寄存器
AL(AX) <-- 商寄存器
AH(DX) <-- 余数寄存器
三、逻辑指令
1.逻辑运算指令
(1)AND DST,SRC–>(DST)<–(DST)∧ (SRC)
(2)OR DST,SRC–>(DST)<–(DST)∨ (SRC)
(3)NOT OPR(OPR不能为立即数)
(4)XOR DST,SRC
(5)TEST OPR1,OPR2–>(OPR1)∧(OPR2)
2.移位指令
(1)SHL OPR,CNT 逻辑左移指令
(2)SHR OPR,CNT 逻辑右移指令
(3)SAL OPR,CNT 算术左移指令
(4)SAR OPR,CNT 算术右移指令
(5)ROL OPR,CNT 循环左移指令
(6)ROR OPR,CNT 循环右移指令
(7)RCL OPR,CNT 带进位循环左移指令
(8)RCR OPR,CNT 带进位循环右移指令
这里最高有效位右移,同时再用它自身的值填入,即如果原来是0,则仍为0,原来是1则仍为1。
算术移位指令用于带符号数运算,SAL用来乘以2,SAR用来除以2;
逻辑移位指令用于无符号数运算,SHL用来乘以2,SHR用来除以2;
有多少次,则乘多少次或除多少次。
注意:OPR:用除立即数以外的任何寻址方式。
移位次数由CNT决定,可以为1或CL,若移位次数大于1,则可以在该移位指令前把移位次数置于CL寄存器中,而移位指令中的CNT写为CL即可。
例:MOV AX,62H 或 MOV AL,62H
SHR AX,1 MOV CL,4
SHR AL,CL
3.串处理指令
①SI<–源串地址(DS)
②DI<–串长度地址(ES)(DI是相匹配字符的下一个地址)
③CX<–串长度
④设置DF=0 CLD,DF=1 STD
⑤串指令(REP)
(1)REP string primitive
其中string primitive可为MOVS (串传送)、LODS(从串取)、STOS(存入串)、INS(串输入)和OUTS(串输出)指令。
与REP重复串操作直到计数寄存器的内容为0为止。
例:LEA SI,X
LEA DI,Y
MOV CX,count
CLD
REP MOVSB
(2)REPE/REPZ string primitive当相等/为零时重复串操作
其中string primitive可为CMPS(串比较)或SCAS(串扫描)指令
(3) REPE/REPZ string primitive当不相等/不为零时重复串操作
其中string primitive可为CMPS(串比较)或SCAS(串扫描)指令
串比较指令:
CMPS SRC,DST
CMPSB、CMPSW、CMPSD
指令由源变址寄存器指向的数据段中的一个字节,字或双字与由目的变址寄存器所指向的附加段中的一个字节、字或双字相减。
串扫描指令:
SCAS DST
SCASB(字节)、SCASW(字)、SCASD(双字)
指令把AL、AX或EAX的内容与由目的变址寄存器指向的在附加段中的一个字节,字或双字进行比较。
串传送指令:
MOVS ES:BYTE PTR[DI],DS:[SI]
把源变址寄存器指向的数据段中的一个字(字节或双字)传送到由目的变址寄存器指向的附加段中的一个字(字节或双字)中去。
MOVSB(字节)、MOVSW(字)、MOVSD(双字)
该指令与REP联用时,则可将数据段中的整串数据传送到附加段中。(源串必须在数据段中、目的串必须在附加段中)还须先把数据串的长度值送入计数寄存器中。
存入串指令:
STOS DST
把AL、AX或EAX的内容存入由目的变址寄存器指向的附加段的某单元中。
STOSB(字节)、STOSW(字)、STOSD(双字)
与REP联用时,可把AL、AX或EAX的内容存入一个长度为(Count Reg)的缓冲区中。
STOS指令在初始化某一缓冲区时很有用。
从串取指令:
LODS SRC
该指令把由源变址寄存器指向的数据段中某单元的内容送到AL、AX或EAX中
LODSB(字节)、LODSW(字)、LODSD(双字)
一般来说,该指令不和REP联用。有时缓冲区中的一串字符需要逐次取出来测试时,可采用本指令。
4.控制转移指令
(1)JMP 无条件转移指令
①JMP SHORT OPR 段内直接短转移(CS不变,IP变)
相对寻址方式 操作码 操作数 (IP=现行IP+8位位移量)
(2B机器码): XX XX
②JMP NEAR PTR OPR 段内直接近转移(CS不变,IP变)
相对寻址方式 操作码 操作数 (IP=现行IP+16位位移量)
(3B机器码): XX XX,XX
③JMP WORD PTR OPR 段内间接近转移(CS不变,IP变)
等价于JMP OPR(寄存器或存储器)
IP从操作数中获得
④JMP FAR PTR OPR 段内直接远转移(CS,IP变)
直接寻址方式 操作码 IP CS
(5B机器码): XX XX XX,XX XX
⑤JMP DWORD PTR OPR 段间间接远转移(CS,IP变)
OPR为存储器操作数。
IP从操作数中获得前两字节的内容。
CS从操作数中获得后两字节内容。
(2)条件转移指令
①JZ(JE) OPR 结果为零(或相等)则转移
②JNZ(JNE) OPR 结果不为零(或不相等)则转移
③JS OPR 结果为负 则转移
④JNS OPR 结果为正则转移
⑤JO OPR 溢出则转移
⑥JNO OPR 不溢出则转移
⑦JP(JPE) OPR 奇偶位为1则转移
⑧JNP(JPO) OPR 奇偶位为0则转移
⑨JB(JNAE、JC) OPR
低于,或者不高于或等于,或进位为1则转移
⑩JNB(JNE、JNC) OPR
不低于,或者高于或等于,或进位为零则转移
比较两个无符号数,并根据比较的结果转移:
①JB(JNAE、JC) OPR
低于,或者不高于或等于,或进位为1则转移
②JNB(JNE、JNC) OPR
不低于,或者高于或等于,或进位为零则转移
③JBE(JNA) OPR 低于或等于,或不高于则转移
④JNBE(JA) OPR 不低于或等于,或高于则转移
比较两个无符号数,并根据比较的结果转移:
①JL(JNGE) OPR
低于,或者不高于或等于,或进位为1则转移
②JNL(JGE) OPR
不低于,或者高于或等于,或进位为零则转移
③JLE(JNG) OPR
低于或等于,或不高于则转移
④JNLE(JG) OPR
不低于或等于,或高于则转移
5.循环指令
LOOP OPR(CX中存放循环次数)