1、传送指令
A通用。B累加器专用。C地址。D标志
A:通用传送指令
①:最基本的传送指令 MOV
MOV 目的 源 #目的:OPRD1。源:OPRD2。
实现:
MOV AX,4234H
MOV AX,BX
MOV AL,[1000H]
注:①:可以传送16位的数据,也可以传送8位的数据
②:不能在两个内存单元之间直接传送
MOV [BX],[1000H] 错误的
③:CS和IP不能作为目的操作数,可作为源操作数
MOV CS,1000H 错误的
④:不能将立即数直接传送到段寄存器中
⑤:段寄存器之间不能互相传送
MOV DS,2000H 错误的
应该变为两句话传输 MOV AX,2000H
MOV DS,AX
MOV ES,DS 错误的
变为两句话传输:MOV AX,DS
MOV ES,AX
②:堆栈操作指令:PUSH和POP
堆栈:一段内存区域,可用于保存中间数据,运算结果或某些寄存器的值,需要时可以从堆栈中将数据取出,按照先进后出的原则使用数据
注:微机把内存的一段区域作为堆栈使用,即堆栈段SS,段内的物理地址由SS和SP决定,SP始终指向栈顶(栈顶是最底下)
PUSH OPRD(数据) 叫做压栈
POP OPRD 叫做出栈
对PUSH和POP的说明:
①:堆栈操作总是按字运行的
②:PUSH AX AX为1122H
注:每进入一个字,SP要减2(SP-2)
高字节放在较高地址,低字节放在较低地址
弹出一个字的时候,SP要加二(SP+2) #SP+2就是在回到所谓的栈底.
③:CS可以压栈,但是不能出栈。
③:交换指令XCHG
XCHG 目的 源
寄存器 <-> 寄存器(双向)
或 寄存器 <--> 内存(双向)
注:①:目的和源操作数,都不能是立即数或段寄存器,并且不能同时为内存单元
XCHG [BX] [DI] 错误的 (同时都是内存单元,中括号表示内存单元)
②:CS 和IP不能为源操作数,目的操作数
③:目的和源操作数,取值范围要相同,同为8位或16位
XCHG BL,DL 对的(同时8位)
XCHG AX,SI 对的(同时16位)
④:换码指令XLAT:用于编码制转换
注:使累加器中的某个值转换为内存表格中对应的某个值,使用该指令前内存表的首地址,赋给BX,AL中存放表格某一项,与表格首地址的位移量,执行BX+AL得到该表格中的一个地址,再将该地址所对应的值传送到AL中
补充:使用XLAT换码指令时,内存中必须有一个码表
⑤:输入/输出指令 IN、OUT
注:输入指令用于CPU从外设端口接收数据,输出指令用于CPU向外设端口发送数据
端口:CPU与外设之间通过接口进行数据交换,一个端口通常对应接口中的一个或几个寄存器,每8位端口有一个地址叫做端口号,两个相邻的8位组成16位端口
端口数:最多为65536个,端口号0000H~FFFFH
分类:直接输入/输出
前256端口直接输出(2^8,00H~FFH)
IN 累加器,端口号
out 端口号,累加器
IN AL,50H #510H是端口号
IN AX,70H #AX里存放的是70H与71H
OUT 44H,AL
直接输入/输出
IN 累加器,DX
IN AX,DX #这两句话完成
地址传送指令
LEA:取有效地址指令
LEA 目的,源
注:源操作数为内存单元地址,目的操作数为16位的寄存器
LEA AX,[2782H]
LEA BX,[BP+SI]
LDS:取地址指针,放入DS中,和其它寄存器的指令
注:将四个字节的内存单元地址送到两个目的寄存器中,其中后两个字节为段地址,送到DS中
LES:取地址指针,放入ES和其他寄存器的指令
LES DI,[2130H]
标志传送指令
LAHF:读取标志指令
SAHF:设置标志指令
二、算术运算指令
加法
ADD:不带进位的加法指令
ADC:带进位的加法指令、
注:①:无符号和有符号加法,减法可以使用同一个指令,无符号和有符号的乘法和除法,不能使用同一个指令
②:无符号运算产生溢出指的是CF=1时会设置进位,对于多字节运算中使用,要利用进位向高字节传递数值
INC:增量加1
注:IAC一般用在循环中,修改指针或修改循环次数
减法
SUB:不考虑错位的减法指令
SUB BX,CX
SBB:考虑借位的减法的指令
DEC:减1
乘法:无符号乘法指令和有符号乘法指令
无符号:MUL
1、①:MUL BL
②:MUL CX
注:乘法隐含的一个操作数为AL或AX
伪指令
2、MUL BYTE PTR[DI]
MUL WORD PTR[SI]
有符号:IMUL
IMUL CL
IMUL CX
除法
无符号:DIV
注:除法隐含的也是AX或AL
DIV CL
DIV CX
DIV BYTE PTR[DI]
有符号:IDIV
二、逻辑运算
AND 与
OR 或
NOT 非
XOR 异或
TEST 检测(类似于AND)
AND:在与运算中,与0运算就是置0,与1运算就是原值不变。
OR:与1运算为1,与0运算不变。
XOR:①:取反功能。②:寄存器清0
AND一般用于指定位数清零
OR一般用于指定位置置1
XOR一般用于某个寄存器清0
TESE:用于测定指定寄存器中某个位置是0还是1
三、位移指令
①:SAL:非循环算术左移指令
注:左移低位补0,高位进入CF标志位
②:SHL:非循环逻辑左移指令
③:SAR:非循环算术右移指令
注:高位不变向前填充,低位进入CF标志位
④:SHR:非循环逻辑右移指令
注:以0填充,低位进入CF标志位
ROL:不带进位的循环左移指令
ROR:不带进位的右移指令
RCL:带进位的左移指令
RCR:带进位的右移指令
四、串操作指令
注:①串操作指令要通过重复前缀来实现串操作
②:以SI作为源操作数的指针寄存器,默认段为DS段,以DI 作为目的操作数的指针寄存器,默认段在ES 段
[DS:SI]à[ES:DI]
注:将DS段,SI所指出的字节或字,传送到ES段,DI所指的存储单元,自动修改地址DI和SI
字符串比较指令
CMPSB CMPSW
注:REPE/REPZ(功能:找不同的字符)表示CX !=0且比较的字节相等(ZF=1时)这个时候继续比较,当ZF=0时,结束比较
REPNE/REPNZ(功能:找相同字符)表示CX !=0且比较的字符不等(ZF=0时),这个时候继续比较,当ZF=1时,结束比较
字符串检索指令
SCASB/SCASW
前缀:REPE/REPZ 当CX不等于0且AL(AX)内容相等,表示ZF=1,继续检索(找不一样)
前缀:REPNE/REPNZ 当CX不等于0且与AL(AX)内容不等,ZF=0.继续检索(找一样)
取字符串指令
LODSB/LODSW
存字符串指令
STOSB/STOSW
注:取字符串指令,不使用前缀,存字符串指令,使用REP前缀表示可以使一个字符串填充到内存单元中
控制转移指令
①:段内直接转移指令
JMP 1000H
②:段内间接转移指令
JMP CX
JMP[CX]
③:段间直接转移指令
JMP B000H:0100H
④:段间间接转移指令
JMP DW ORD PRT[BX+ SI]
CALL 和RET 子程序调用和返回指令
条件转移指令
注:满足条件时执行指定的目标,不满足条件时执行下一条指令,判断条件根据CF、SF、OF、PF、ZF、CX
条件跳转指令分为有符号数的跳转和无符号跳转,有符号的叫大于、小于,无符号的叫高于、低于。
JE/JZ 等于/为0 时跳转(ZF=1)à这里计算机判断
JNE/JNZ 不为0时转移(ZF=0时判断)
有符号的:
JG/JNLE 大于/不小于等于
JNG/JLE 不大于/小于等于
JL/JNGE 小于/不大于等于
JNL/JGE 不小于/大于等于
无符号的:
JB/JNAE 低于/不高于等于
JNB/JAE 不低于/高于等于
JA/JNBE 高于/不低于等于
JNA/JBE 不高于/低于等于
JS 当SF为1时跳转
JNS 当SF为0时转移
JO 当OF为1时跳转
JNO 当OF为0时转移
JP 当PF为1时跳转
JNP 当PF为0时转移