1.指令分类
指令,伪指令,宏指令
2.指令语句
(名称/空格/:)(操作助记符)(空格/操作数)(;注释)
3.常用符号和含义
OPR operator 操作数
SRC source 源操作数
DET destination 目的操作数
REG register 寄存器
REGn register with n bits n位寄存器
MEN memory 存储单元
CNT count 计数值
LABEL label 过程或标签名
PORT8 ports with 8 bits 8位端口名
DISP8 display with 8 bits 偏移量为8位
EA effective address 有效地址
IDATA im data 立即数
4.地址标记方式
eg:
10var1[BX+5][SI+5] 表示的内容
(offset var1 +(BX)+(SI)+5+5+10)
5.指令分类
1.属性操作符
SEG //取出段地址
OFFSET//取出有效地址
SIZE//变量的大小
LENGTH//取出重复的次数
TYPE//取出类型
2.定义变量
变量名 操作符 表达式 db,dw,dd,dq,qt
3.数据传送类
-
通用传送地址 MOV DET SOC //(DST)<-(SOC) 注意:
-
不能直达的路径:存储单元->存储单元,立即数->段寄存器,段寄存器->段寄存器
-
类型匹配:两者类型指定,则必须一致,单个类型,一般认为无措,0个类型,报错
-
取有效地址指令
LEA REG16 MEN//(REG16)<-(MEN的偏移地址)
-
LDS,LES
LDS REG16 MEN;//(DS)<-(MEN+2),(REG16)<-(MEN)
LES REG16 MEN;//(ES)<-(MEN+2),(REG16)<-(MEN)
不允许为段寄存器
-
标记传送指令
LAHF ;//(AH)<-PSW低8位
SAHF;//PSW低8位<-(AH)
-
数据交换指令
XCHG DST SEG;//(DST)<->(SEG)
-
字节转换指令
XLAT;//(AL)<-((AL)+(BX))
-
堆栈操作指令
PUSH DES
POP DES
PUSHF;//push psw to stack
POPF
4.算数运算类
ADD DST,SRC; //(DST)<--(SRC)+(DST)
ADC DST,SRC; //(DST)<--(SRC)+(DST)+(CF)
AAA; //ASCII adjust for addtion
DAA //decimal adjust for addtion
//ADD和ADC都能影响标志位,但ADD只是将src和dst相加,ADC则会将src,dst,cf相加
SUB DST,SRC; //(DST)<--(SRC)-(DST)
SBB DST,SRC; //(DST)<--(SRC)-(DST)-(CF)
AAB;
DAB;
NEG DST; //(DST)<--0-(DST)
CMP DST,SRC; //(DST)-(SEC),并设置psw位
INC DST;
DEC DST;
//自增1,自减一
MUL SRC;
IMUL SRC;
AAM;
//只影响AF和CF
DIV SRC;
IDIV SRC;
AAD;
//不影响psw
5.逻辑运算类
AND DST,SRC; //(DST)<—-(SRC)^(DST),并设置标志位
TEST DST,SRC; //(SRC)^(DST),并设置标志位
OR DST,SRC; //或操作,并设置标志位
XOR DST,SRC; //异或操作,并设置标志位
NOT DST; //取非操作,但不设置标志位·
6.移位类指令
逻辑移位:对无符号数进行的,左移右移都补0
算数移位:对有符号数进行的,符号位不变,对数值位进行移动
CF为取出的那一位
MSB 为DST为高位
LSB 为DST低位
//逻辑移位
SHR DST,CNT; //0——>[MSB—->LSB]—>CF;
SHL DST,CNT; //CF<—-[MSB<—-LSB]<—-0;
//算数移位
SAL DST,CNT;
SAR DST,CNT;
//循环移位
ROR DST,CNT;
ROL DST,CNT;
//带位循环移位
RCL DST,CNT;
RCR DST,CNT;
7.标志位操作指令
//对psw进行CF,DF,IF进行置位,清零或取反操作
//clear 置0
CLC
CLD
CLI
//set 置1
STC;
STD;
STI;
//complement 取反
CMC;
8.转移指令
//无条件指令 段间转移
JMP LABAL;
JMP REG16;
JMP MEN;
//有条件指令 段内转移
对CF,ZF,SF,OF,PF进行状态判定
JC LABLE;
JNC LABLE;
9.循环指令
LOOP LABAL; //(CX)<—-(CX-1),if (CX)!=0,jump label;
LOOPZ/LOOPE LABAL;//(CX)<—-(CX-1),if (CX)!=0 and ZF=1,jump label;
LOOPNZ/LOOPNE LABAL;
JCXZ LABEL;//if CX=0,JUMP LABEL;
10.程序
//子程序调用指令
CALL LABEL;
CALL OPR;
//子程序返回指令
RET;
RETF;
RET n;
//过程定义
procedurename PROC [NEAR/FAR]//NEAR 段内调用,FAR 段间调用
………
RET
procedurename ENDP
//中断调用指令
INT n;
//中断返回指令
IRET;
//中断程序
<name> :
PUSH AX //protect scene
….
PUSH SI
… //body of produre
POP SI //restore scene
…
POP AX
IRET
11.string
//move string
MOVSB;
MOVSW;
MOVS DST,SRC;
//repeat profix
REP ;//similar to loop
REPZ/REPE;
REPNZ/REPNE;
eg:
REP MOVSW;
//CMP
CMPSW;
CMPSB;
CMP DST,SRC;
//比较结果不保存,但设置psw标志位
//scan
SCASB;//将目的操作数与AX(AL)进行比较
SCASW;
SCAS DST,SRC;
//LOAD
LODSB
LODSW
LODS DST,SRC
//store
STOSB
STOSW
STOS DST,SRC
12.other
IN DST,SRC;
OUT DST,SRC;
NOP;//什么都不做,占用3个时钟周期
HLT;//进入暂停状态
WAIT;//
LOCK;
ESC CODE,DATA;//CODE为指令码,data是送给其他处理器的数据
13.宏指令
定义:
name MACAO paraments
...
ENDM
调用
name paraments
14.重复宏
REPT,IRP,IPRC
REPT expression
...
ENDM;
IRP 形参 <具体paraments》
...
ENDM;
IRPC 形参,string
...
ENDM;
6.伪指令
1.段定义
name SEGMENT PAGE/PARA/WORD/BYTE 组合类型 类别 ... name ENDS
2.ASSUME
告诉编译程序各个段寄存器存放的是哪一个段的地址
但不意味着已经存放
ASSUME 段寄存器1:名称1,段寄存器2:名称2
3.END
END 表达式;//表达式的值通常是该程序的启动地址
4.PAGE
PAGE para1,para2;
5.LABEL
name LABLE type;
6.TITLE
TITLE 正文
7.EQU
给表达式一个名称
name EQU expression;
8.ORG
ORG expression
7.汇编程序设计
用户设计的程序常包含3个段:堆栈段,数据段,代码段
汇编源程序会生成3个文件:obj,lst,crf
obj是指令伪指令编译后目标代码文件
lst是列出程序代码,编译地址以及出错信息
crf是标识符标号的引用情况
链接源程序会生成exe和map
exe是可执行文件
map是内存分配文件