第四章 汇编指令系统 (Pro)
考点1:指令的格式功能及用法
一、指令格式
操作码 操作码 地址码
二、地址码的个数
二级指令
MOV LEA XCHG IN OUT
ADD ADC SUB SBB CMP
AND OR XOR TEST SHL SHR SAL SAR
一地址指令
PUSH POP INC DEC NEG MUL DIV
NOT JMP标号 JZ JC JS JA JB JG TL
零地址指令:XLAT CBW CWD
一地址指令
INC BX; 寄存器寻址
INC [BX]; 间接寻址
DEC X; 变量X对应的内容加1
二地址指令
MOV DST(destination),SRC(source code)
立即数可以出现在source code
DST,SRC 的长度要一致 8/8 16/16
ADC DST,SRC ;三个数求和SHL AL,1/CL ;左移指令 要注意寻址方式
PUSH AX; 把 AX入栈
POP BX; 把当前桟顶的字给BX SP堆栈栈顶
(乘法指令)
MUL DL; AL*DL——AX 隐含寻址
MUL BX; AX*BX——DX,AX
(求补)
NEG AL; 0——AL——AL
条件转移指令
JC L1 ;转移到一个标号
单地址用标号来表示,条件转移只有短转移(short)寻址方式 段内字节偏移
转移范围在 -128JZ 【SI】 ;转移到一个位置
无 条件转移指令
JMP DONE ;直接用标号 段内转移 远 字/字节 近
JMP FAR PTR DONE
零地址指令
CBW CWD
set {STC CF=1} | STI IF=1clear {CLC CF=0} | CLI IF=0
三 指令类型
(一)传送类型
数据传送 MOV PUSH POP
地址传送 LEA LDS LES
外设传送 IN OUT
通用寄存器之间可以互相传送,但是 数据的长度要一致
立即数只能作为SRC
存储器不能互传
段寄存器 不能互传
MOV DL,AX 类型不匹配
MOV 1020,AX 立即数不能作为目的操作数
MOV DS,0200 立即数不能传给目的操作数
MOV 【BX],[1200] 存储器之间不能相互传送
MOV IP,0FFH; IP不能做为目的操作数,也不能作为源操作数
MOV [BX+si+3】,IP; 同上
MOV AX,[BX][BP]; 基址需要和变址搭配使用
MOV AL,ES:[BP];正确, 格式为 前缀:【强制使用】
MOV DL,[si][di] ; 需基变 交互使用
MOV AX,OFFSET ; OFFSET 取有效地址
MOV AL,OFFSET TABLE 标号 ; 16位
MOV CL,30 ;格式不对应
MOV CS,AX CS不能作为目的操作数
MOV BX,DL; 数据类型不匹配
MOV ES,1000H 立即数不能传给寄存器
MOV ES,DS ; 如果要传送段寄存器之间的传送,需要mov ax,ds mov ds,ax
________________________________________________________________________
MOV 传的是数值 LEA 传的是地址
IN/OUT指令
外设与主机之间的传送 IN AX/AL .PONT (口地址)
OUT PONT(口地址) AX/AL
mov AX,1000H 直接将内容放入 内存单元中
mov AX,【1000H】 从1000H地址取一字的数据
mov 【1200】,AL 从1200地址取一字节单元内容 传送给AL
2、LEA
MOV AX,[1000H] ; AX=5678H ;取内容
LEA BX,[1000H]; BX=1000H ;取地址
PUSH/POP
OPR 字:{sp-2——sp
OPR 字 ——栈中(顶sp)}
OPR 字:{桟顶字——OPR 底字
sp+2——Sp
}
AX=5678H BX=1234H
push AXpush BX
pop CXpop DX
出栈后 CX= 3412 DX=7856H
顶
34H 12H 78H 56H 底
换码指令 XLAT、
LDS,LES
(二)算数运算
加法指令
双 ADD ADC 单 INC ADD DST,SRC ; DST+SRC——DST
ADC DST,SRC ; DST+SRC+CF ——DST
INC 8/16; 不能是 Immediate Data ——不影响CF
减法指令
SUB DST,SRC; DST-SRC——DST
SBB DST,SRC; DST-SRC-CF——DST
乘法指令
MUL
IMUL
除法指令
DIV
IDIV
符号扩展
CBW 字节扩字
MOV AL,65H;
CBW AL; AL=0065H
CWD 字扩双字
已知 XYZ S 字变量—— (X*Y+Z——S)
MOV AX,X ;
MOV BX,Y ;
MUL BX ;
ADD AX,S ;
ADC DX,0 ;
已知 XYZ S 存字节变量—— (X*Y+Z——S)
MOV AX,X;
MUL Y; ——x*y——ax
MOV BX,AX; x*y_______BX
MOV AL,2;
CBW
ADD AX,BX;
MOV A,AX;
乘法
IMUL OPR;
AL*OPR——AX
AX*OPR——DX,AX
除法
AX/OPR ——AL 商
AH 余
DX,AX —— AX商
DX余
AL=37H BL=95H 执行指令 IMUL BL后,AX=
!!! 80H以上是负数 80以下是正数
AL*BL=37HX95H=负——AX
1 去负号 BL=95; 利用NEG 去负号 =100-95=6B
2 相乘 37Hx6BH=16FDH
3 加负号 0000H-16FDH=-16FDH
(三) 位操作
逻辑
AND OR XOR TEST, NOT(取反)
清0 置1 取反 与(不返回结果q)
(清0)本身异或本身
移位
SHL SAL 左移
SHR SAR 右移动
循环移 CLROL RCL 循环左移
ROR RCR 循环右移
(四)控制转移异或本身
无条件转移
JMP 标号条件转移
判断 CMP AX.BX ;AX-BX=0
JZ/JE L1 ;当AX-BX=0 时转 L1
CMP CX,0
JZ L2 当CX=0时,转L2
CMP AX,BX
JC L3 ;当AX<BX || CF=1时转L3
CMP AX,BX
JNC L4 ;当AX>BX || CF=0时转L4
TEST AX,8000H
JZ L5
SAL AL,1
JNC L6 ;当CF=0时转 L6
TEST AL,01H (D0) ;AL最低位为1时,为奇数转L7
JNC L7 ;当CF=0时 转 L7
SHR AL,1 ;当CF为1时 转L8判断奇偶性
JC L8 ;
正数 OR AX,AX; 相或不变
JNS L7 ; SF为0 ,AX为正数转L7
负数 AND AX,AX;根本身相与不变
JS L8 当SF为1时转L8
偶数 TEST AL,01H
JZ L7 偶
SHR AC,1
JNC L8
无符号数的转移
JA 大于转 JB小于转
JAE 大于等于 JBE 小于等于
有符号数转移
JG 大于 JL 小于
JGE 大于等于 JLE 小于等于
循环转移
LOOP 标号 CX-1—— CX等于0时退出
LOOP2/LOOPE ;CX-1—— CX,CX不等于0且ZF=1时循环
LOOPI/LOOPNE; CX-1—— CX,CX不等于0且ZF=0时循环
程序中断指令
STI SLI
INT 21H (4种功能号) 保护三个字 FR、CS、IP
恢复三个字 IP、CS、FR(IRET)
⑤ 子程序调用和返回指令
call:保护1个(2个字)(CS)IP 段内调用 保护 IP
RET: 段间调用 保护 CS:IP
(五)处理机类
CLC CF=0
STC CF=1
CMC CF_CF取反
CLD DF_0 低——高
CTD DF——1 高——低
CLI IF=0
STI IF=1
六 数据传操作类
传送:从源存储区到目的存储区 MOVSB/MOVSW
存入串:将AX的数寄存入存储区 STOSB/STOSW
从串取 :将源存储区的内容送AX LODSB/LODSW
比较 源和目的的串 CMPSB/CMPSW
串扫描 将AX的内容与目的串的 一个数据 比较 SCASB/SCASW
⑥REP
CX——CX-1
判断CX是否,如CX=0,退出。
⑦REPE/REPZ
CX——CX-1
判断CX=0或ZF=0则退出
⑧串重复前缀REPNE/REPNZ
CX——CX-1
判断CX=0或ZF=1则退出
零地址指令
源串DS:[SI],目的串ES:[DI]
源串首/末地址——SI,目的串首、末地址——DI
指令执行后,SI/DI + 1/2
_
5地址递增(CLD/DF=0) =MOVSB
地址递减 (STD/DF=1)=MOVSW
串存储
源存信息AL/AX
目的串首地址(末地址)——DI
串长度——CX
设置方向标志位(CLD使DF=0,STD使DF=1)
STOSB:AL———【DI】,DI+-1
stosw:AX——【DI】,DI+-1
从串读取(ODSB)(ODSW)
目的AL/AX
源串首地址(末地址)——SI
串长度——CX
设置方向标志(CLD使 DF=0,STD使DF=1)
LODSB:[SI]——AL,SI+-1
LODSW:[SI]——AX,S1+-2
比较字符串 cmpsb/cmpsw
源串首地址(末地址)——SI
目的串首地址(末地址)——DI
串长度——CX
方向(CLD:DF=0),STD:DF=D
考点1 总结
1、操作数的个数
2:指令功能
OR AX,0FFH; 立即数
OR AX,【OFFH】;直接寻址
MOV AX,BX 寄存器寻址
MOV AX,[BX] 间接寻址
MOV AL,0 清0的功能
XOR AL,AL; CF=OF=0
LEA BX,MESS 取地址
MOV BX,MESS 取内容
ADD AX,AX
功能相等
SAL AX,1
ADD AL.1 SU
INC AL ;
SUB AX,CX; AX=AX-CX;
CMP AX,CX; AX-CX 不保留数值
3、隐含寻址
1 MUL/DIV AL,AX,DX
2 CBW/CWD AL,AX,DX
3 LOOP :CX
4 DOS中断调用 入口/出口 {AH,AL=隐含 AHL,DL AHG,DX=DX}
固定使用
IN/OUT :AX/AL,DX 位移次数 >=2时,用CL
位移次数——=2时,用CL
考点2:指令执行后对标志位的影响
一、INC和DEC
不影响CF,其他状态位影响
二、MUL
CF=OF=0;乘积的高一半为0
CF=OF=1;乘积的高一半不为0
IMUL
CF=OF=0 ;乘积的高一半为低一半的符号扩展
三、AND、OR、XOR、TEST
CF=OF=0, AF无定义
四、位移指令
CF:移出的位
OF:移位数为1时,移位后最高位与CF不同,则OF=1,否则为0
五、传送类指令,符号扩展,无条件,条件转移,循环转移,INT,NOT
不影响任何标志位
考点3:指令的寻址方式
寻址方式:
指令寻址
段内:IP
段间:CS:IP
数据寻址
操作数{CPU中:寄存器中
主存中{
立即数
寄存器寻址
存储器}}
立即数:
只能出现在源操作数位置,数值\字符\表达式(在代码段存放,当前的下一个)
MOV AL,5 MOV AL,'5' MOV AL,2+3
AL=05 AL=35H
双,在src单,不允许出现1地址
寄存器寻址
14个中:IP、CS DS ES SS
不能用、不能放目的 源操作数不能是立即数
存储器寻址
直接寻址 mov AX,[1000H] PA=DS+0+EA
EA=1000H
寄存器寻址 BXBPSIDI DSX16+[DXSIDI]
PA=SSX16+[BP]
基址变址寻址 MOV AX,[BX+SF] MOVAX,[BX][Si] EA=BX+SI PA=SSX16+BP+SD
寄存器相对寻址 可以是变量/数值 MOV AX,[BX+]
相对基址变址寻址 MOV AX,[BX+SI+I]
存储器寻址方式中的变量
变量的定义
org 0010H
Buf DW 1234H
单独用变量名 是 直接寻址方式
MOV AX,BUF ;AX=1234H
LEA BX,BUF ;BX=0010H
相对寻址中,变量名表示其偏移地址
回顾
传送 MOV LEA PUSH POP
算术 ADD ADC INC SUB SBB DEC CMP MUL IMUL SBW CWD
位 AND OR XOR TEST NOT
转移 JMP,JZ/S JC JA/B JG/Z