第三章
3.1指令格式
- 操作码 [目标地址],[源操作数]
3.2寻址方式
1. 立即寻址: 对立即数进行的操作
- 如:MOV AX,1200H
2. 寄存器寻址: 数据存放在指令规定的寄存器中.目标一般为通用寄存器.
- 如:MOV AX,BX
3. 直接寻址: 段内偏移地址在指令码中,默认段地址在DS中
- 如: MOV AX, [1200H] ;其中1200H:十六位段内偏移地址,[]表示取地址
4. 寄存器间接寻址
- 如:MOV AX,[BX];把BX作为偏移地址,以DS作为基地址,将计算得到得物理地址放到AX寄存器中.
- 如: MOV [BP],AX; 把AX的值放入以BP为偏移地址,以SS为段地址通过计算得到的物理地址中.
-
- 注意: 1. 寄存器间接寻址只针对BX,SI,DI, BP;
-
- 2. BX,SI,DI的默认地段寄存器为DS;BP的默认地段寄存器为SS.
5.寄存器相对寻址 :有效地址是一个8位或16位的位移量与一个基址寄存器或变址寄存器的内容之和.
- 如:MOV [SI + 10H],AX;把AX的内容放到以DS为段地址,以SI+10H为偏移地址计算出来的物理地址中
6.基址变址寻址 : 有效地址是一个基址寄存器和一个变址寄存器内容之和.
- 如: MOV [BX + DI ],AX; 将AX的内容放到以DS为段地址,以BX+DI为偏移地址计算出的物理地址中.
7. 基址变址且相对寻址:有效地址是一个8位或16位的位移量,一个基址寄存器,和一个变址寄存器内容三部分之和.
8. 隐含寻址: 隐藏操作数地址的部分,字符串操作类就属于这种寻址.
3.3指令系统
3.3.1数据传输指令
1. 通用数据传输指令:
- MOV :
- 格式: MOV DST,SRC;
- 注意:
- DST,SRC不能同时为存储器操作
- DST,SRC数据类型须一致
- DST,SRC不能同时为段寄存器
- SRC为立即数时,DST不许为段寄存器
- 总结:MOV指令可类似C语言中的赋值命令“=”。
- 交换指令XCHG:
- 格式:XCHG DST,SRC;
- 注意:
- DST,SRC不能同时为存储器操作数;
- 操作数数据类型必须一致;
- 总结:数据的交换发生在通用寄存器和存储器里
- 堆栈操作指令:(单操作数指令)
- 格式:
- 压栈:PUSH SRC;
- 出栈指令:POP DST;
- 格式:
2.地址传送指令
- 取有效地址指令LEA
- 格式:LEA REG,SRC;将SRC的有效地址传送到通用寄存器,REG为16位通用寄存器。
- 指针送寄存器DS指令LDS
- 格式:LDS REG,SRC;根据SRC操作的偏移地址,在数据段中取出段地址和偏移地址作为地址指针分别送到DS和DST中
3.累加器专用传送
- 输入指令IN:
- 格式:
- 直接寻址:IN Acc,Port.经输入端口送入累加器中
- 间接寻址:IN Acc,DX;
- 格式:
- 输出指令OUT:
- 格式:
- 直接寻址:OUT Port, Acc;将累加器中的数据输出到指定的端口
- 间接寻址:OUT DX, Port;
- 格式:
- 查表指令XLAT:
- 格式:XLAT;
- (AL)<----((BX)+(AL)),以DS的内容为段基址,以BX和AL内容之和为有效地址,取出表中的一个字节内容送入AL中。(BX:表头;AL:相对距离)
4.标志寄存器传送指令
- 标志送AH指令:LAHF
- 格式:LAHF;将PSW中的低八位送AH中,不影响标志位
- AH送标志寄存器指令SAHF
- 格式:SAHF;(PSW)低八位<——(AH)
- 标志进栈指令PUSHF
- 格式:PUSHF;将PSW压栈
- 标志出栈指令
- 格式:POPF;将当前栈顶的一个字传送到PSW中,影响标志位。
5.算术运算指令
- 加法指令:ADD DST,SRC;(DST)<—(DST)+(SRC)
- 注意:DST和SRC都不能为段寄存器
- 带进位加法指令:ADC DST,SRC;(DST)<—(DST)+(SRC)+CF
- 注意:DST和SRC都不能为段寄存器
- 减法指令: SUB DST,SRC;(DST)<—(DST)-(SRC)
- 注意:DST和SRC都不能为段寄存器
- 带借位减法指令: SBB DST,SRC;(DST)<—(DST)-(SRC)-CF
- 注意:DST和SRC都不能为段寄存器
- 增量指令: INC DST;(DST)<—(DST)+1
- 注意:DST不能为立即数和段寄存器
- 减量指令: DEC DST;(DST)<—(DST)-1
- 注意:DST不能为立即数和段寄存器
- 比较指令: CMP DST,SRC;(DST)- (SRC)
- 不返回结果,影响标志位
- 注意:
- 两个无符号数比较,看CF位,CF=0,A-B>0;CF=1,A-B<0;
- 两个有符号数比较,看OF位
- 求补指令: NEG DST;(DST)<—0-(DST)
- DST不能为立即数和段寄存器,该指令可影响标志位
- 无符号数乘法指令: MUL SRC;BYTE: (AX)<—(AL)X(SRC); WORD: (DX:AX)<—(AX)X(SRC)
- 有符号数乘法指令: IMUL SRC;BYTE:(AX)<—(AL)X(SRC);WORD:(DX:AX)<—(AX)X(SRC)
- 乘法指令的积采用补码表示,指令执行后,CF=OF=0 乘积高位无效;CF=OF=1 乘积高位有效
- 无符号数除法指令: DIV SRC;BYTE: (AL)<—(AX/SRC) 商; (AH)<—余数
WORD:(AX)<—(DX:AX/SRC) 商; (DX)<—余数 - 有符号数除法指令: IDIV SRC;(同上)
- 除法指令的商和余数采用补码表示,余数与被除数同符号
6.符号扩展指令
- 字节转换字指令CBW: (AL)>>>>(AX)
- 字转换双字指令CWD: (AX)>>>>>(DX:AX)
- 对标志位无影响
7.逻辑运算指令
-
逻辑与AND DST,SRC;(DST)<— (DST)&(SRC),常用于清零。
-
逻辑或OR DST,SRC;(DST) <— (DST)|(SRC),常用于置一。
-
逻辑异或XOR DST,SRC;(DST) <— (DST)^(SRC),常用于位取反。
-
逻辑非NOT DST;(DST) <— (~DST)
-
测试指令TEST DST,SRC;(DST)&(SRC),常用于检测某位是否为一。注意与比较指令的区别。
-
算术左移指令: SAL DST,CNT.高位进CF,低位补零。
-
逻辑左移指令: SHL DST,CNT;同SAL
-
算术右移指令: SAR DST,CNT;
-
逻辑右移指令: SHR DST,CNT;
-
循环左移:ROL DST,CNT;
-
循环右移: ROR DST,CNT;
-
带进位循环左移:RCL DST,CNT;
-
带进位循环右移: RCR DST,CNT;
8.控制转移指令:
- 无条件转移指令JMP
- 段内直接转移
- JMP SHORT OPR;段内段转移(IP)<—(IP)+D8
- JMP NEAR PTR OPR;段内近转移 ( IP) <—(IP)+D16
- 段内间接转移
- JMP WORD PTR [REG] ; 转到以DS为段地址,以IP中存放的偏移地址计算出来的物理地址,其中IP中存放的偏移地址由[REG]给出。
- 段间直接转移JMP FAR PTR OPR, OPR指定的段地址送CS,偏移地址送IP
- 段间间接转移JMP DWORD PTR [REG]
- 段内直接转移
- 条件转移指令
- 单标志条件转移指令
指令名称 | 代表含义 |
---|---|
JZ | ZF=0JUMP |
JNZ | ZF=1JUMP |
JS | SF=1JUMP |
JNS | SF=0JUMP |
JO | OF=1JUMP |
JNO | OF=0JUMP |
JP | PF=1JUMP |
JNP | PF=0JUMP |
JC | CF=1JUMP |
JNC | CF=0JUMP |
JB | |
JNB | |
JBE | |
JNBE | |
JL | |
JNL | |
JLE | |
JNLE | |
JCXZ |
9.循环控制指令
- LOOP循环指令LOOP OPR;(CX)<—(CX)-1,若CX !=0,则转到OPR。
- LOOPZ/LOOPE为零/相等循环指令 LOOPZ OPR;(CX)<—(CX)-1,IF CX!=0,ZF=1,则转到OPR。
- LOOPNZ/LOOPNE不为零/不相等循环指令
10. 过程调用指令
- 段内直接调用 CALL NEAR OPR;
- 首先将该指令下面一条指令的IP地址压入堆栈;
- 其次将当前OPR段内偏移地址放到IP寄存器中;
- 段内间接调用 同上
- 段间直接调用 CALL FAR PTR OPR;
- 首先将该指令下一条指令的段地址和偏移地址压栈
- 其次将OPR指定的段地址写到CS,偏移地址写到IP;
- 段间间接调用 同上
- 过程返回指令 RET;
11.中断调用指令
- INT指令
- 格式:INT n;
- a)将标志寄存器PSW压栈
- b)清除TF和IF
- c)将当前CS和IP压栈
- d)nX4计算中断矢量表地址
- 格式:INT n;
- 溢出中断 OF=1中断
- INTO 同上
- 从中断返回指令 IRET
- 功能: 返回主程序的中断断点处
- 功能: 返回主程序的中断断点处
12.串操作指令
- 重复前缀指令
- REP: 重复串操作直到CX=0;
- REPE/REPZ: 当相等CX=0/ZF=0为零时退出
- REPNE/REPNZ: 重复串操作直到CX=0或ZF=1;
- 传传送指令 MOVS/MOVSB/MOVSW
- MOVS DST,SRC; (ES:DI)<—(DS:SI)
- MOVS DST,SRC; (ES:DI)<—(DS:SI)
- 串储存指令STOS/STOSB/STOSW 将AX/AL的值存进ES:DI中
- 串装入指令 LODS
- LODS/LODSB/LODSW :将DS:SI所指的源串元素装入寄存器AL或AX中
- 串比较指令
- CMPS/CMPSB/CMPSW DST,SEC; (DS:DI)-(ES:DI),影响标志位
- 串扫描指令
- SCAS/SCASB/SCASW DST;(AX/AL)-(ES:DI),影响标志位
- 方向标指令
- CLD: DF=0(递增方向);清除方向位
- STD: DF=1(递减方向);置一方向位
13.处理器指令
- 标志处理指令
指令名称 | 指令描述 |
---|---|
CLC | CF=0 |
CMC | CF=~CF |
STC | CD=1 |
CLD | DF=0 |
STD | DF=1 |
CLI | IF=0 |
STI | IF=1 |
- 空操作指令NOP,占用三个机器周期