指令系统
数据传输类
指令
算术运算类指令
逻辑运算
类指令
控制转移
类指令
串操作类指令
处理器控制
类指令
MOV
XCHG
I/O指令(源操作数必须是AL,AX)有两种寻址方式直接寻址和间接寻址
LEA
只有存储器和存储器之间不能进行直接的数据传输,段寄存器CS只能做源操作数
交换数据,reg与reg,mem与reg,reg与mem(只有这三种)
IN
OUT
AX,AL类似于仓库,IN AX,21H从8位端口地址21H中输入一个字节的数据进入AL中
OUT DX,AX,将AX中一个字节送到DX的内容作为地址的端口中
注意事项,若输入端口地址大于8位,则采用间接寻址,传送的数据取决于接受数据
的寄存器类型 MOV DX,35AH IN AX,DX OUT DX,AL(传送12位端口地址,8位数据)
传输数据的的位数取决于,存放数的寄存器
LEA BX,[SI+2000H],将EA也就是偏移地址(有效地址)送到BX中去
栈操作指令(必须操作16位数)
PUSH
POP
SP指向栈顶,栈顶地址比栈低的小,先将SP-2,再压入堆栈
先弹出,再SP+2,高位高地址,即靠近栈低
注意事项(可以随便PUSH和POP,但不能POP CS)
全部通用寄存器压栈出栈指令
PUSHA进栈的顺序AX,CX,DX,BX,SP,BP,SI,DI
POPA
32位通用寄存器压栈出栈指令
PUSHAD
POPAD
标志位传送指令
LAHF(load AH from F)
SAHF
PUSHF
POPF
将FR的低8位,SF ZF AF PF CF分别传送到AH的7 6 4 2 0位
将AH中的7 6 4 2 0位传送到FR的低8位中,SF ZF AF PF CF
16位将FR各个标志位压入堆栈
弹出一个字,作为FR
加
减
乘
除DIV src AX/src
ADD
ADC
(啥都可以相加,立即数,存储器,寄存器都可以)ADD [BP][SI],BX
影响标志位:最高位和次高位一个有进位一个无进位时,OF=1,都有或都没有
OF=0 而且结果送回目的操作数(推荐直接转成10进制计算)
平常的数字都是用补码BCD码表示的,例如0A8H,10进制表示168显然超出了表示
范围,10101000(最开始的1一定是标志位,表示负数)真正的补码是
0101000,-1后0100111,再取反1011000为88,所以原数为-88
SUB
SBB和加同理
INC(影响SF AF OF ZF PF 不影响CF)
NEG求补AL
NEG AL(0-AL留在AL里)(Only当AL=0时 CF=0 其余情况CF=1)(Only当
AL=80H,8000H ,OF=1)
比较指令CMP(还是只有存储器与存储器之间不能直接操作)
MUL
IMUL
MUL CL,被乘数隐含在累加器中(AL,AX,EAX),OP1为乘数。字节运算时乘积返
回到AX;字(非比特)运算时乘积返到 DX:AX; 双 字 运 算 时 乘 积 返 回 到
EDX:EAX 若积的高一半(AH或DX )为“0”,则OF、CF清“0”,否则OF、CF置1
若积的高字节、字或双字不是积的符号位扩展,则OF、CF置“1”,否则OF、CF
清“0”
运算调整类指令(将数据转成BCD码一般是对AL进行操作,除了AAD)
XLAT(translate)查表指令 将数据送入AL中
默认在数据段中,即隐含在DS段,BX+AL默认是偏移地址,寻找DS:(BX+AL)存
储区域里的数据(DS:BX首地址+AL偏移地址)例 MOV BX,30 MOV AL,8 XLAT
对标志位有影响(对SF,PF,ZF有影响,AF随意,OF=CF=0)
逻辑运算与移位指令只有NOT对标志位无影响,取反再送回,不能为立即数
AND
OR
XOR
TEST(唯一一个按位相与且不计入结果的,执行完指令后通过标志位来判断结果)
通过SF ZF PF 来判断AL状态
无条件转移指令JMP 【目标处的地址信息】
无符号数除法,若为字节数据,商放AL,余数放AH,若(DX,AX)商放AX,余数放
DX,同理商放EAX,余数放EDX
有符号数同理
DEC(影响SF AF OF ZF PF 不影响CF)
条件转移指令(判断符号位
JX都是判断符号位是否为1,
同理JNX判断符号位是否为0)
单个条件转移
无符号数(A/B)条件转移指令(用CF ZF来判断)
有符号数(G/L)条件转移指令(用 SF OF,ZF来判断)
JC/JNC
JZ=JE,JNE=JNZ
JS/JNS(判断SF)
JP/JNP
JO/JNO
关于两个数比较之后的结果用来跳转的都要CMP
JAE 大于等于0转移(CF=0跳转),JA 大于0转移(CF=0且或ZF=0跳转)
JBE 小于等于0跳转(CF=1 或ZF=1),JB 小于0转移(CF=1转移)
JGE 大于等于0转移(SF=OF则转移)JG 大于0转移
JLE 小于等于0转移,JE小于0转移
循环控制转移
LOOP 执行(1)CX=CX-1 (2)判断CX是否为0,
为0则跳出,不为0则继续循环
Test指令 按位逻辑相与,TEST AL,80H 提取最高位 不把结果送回,仅仅影响标志位
若为单操作数 源操作数不能为立即数
任何跳跃寻址方式都必须通过修改PC的来实现下条指令的转移
LOOPZ 若CX不等于0且ZF=1则跳转
LOOPNZ 若CX不等于0 且ZF=0跳转
加法(必须放在加法指之后DAA压缩性的 AAA非压缩形的)
减法必须放在减法指令之后DAS AAS
子主题
子主题
标志位操作指令
NOP(不进行任何操作,至占用三个时钟周期)
HLT(CPU暂停不进行任何工作,只有当CPU复位后才可以正常工作)
要求源操作数指针为SI,为DS段偏移地址
目的操作数指针为DI,为ES段偏移地址
所以有串操作指令,一定要定义ES段,而且地址指针自动加一减一或加二减2
子程序调用CALL
CALL 后面加的就是地址本身
段内调用 CS不变
直接寻址:CALL dest(目标地址)
将CS:IP送入堆栈中,SP=SP-2, IP送SS:[SP]
送堆栈后的IP=子程序目前地址
段间调用 CS IP均会变
间接寻址 :CALL dest(寄存器或存储器操作数)
将CS:IP送入堆栈,SS:[SP]=IP
IP=寄存器操作数和存储器操作数的内容
同理 CALL dest(给出明确的段基地址和偏移地址)
保护断点 SP=SP-2,CS送SS:[SP],SP=SP-2,IP送SS:[SP]
此时CS=CS' IP=IP’(CS先入栈)
CALL dest(存储器双字操作数)
SP=SP-2,CS送SS:[SP],SP=SP-2,IP送SS:[SP]
将断点地址的第一个字送入IP(低位),第二个字送入CS(高位)
RET(恢复断点,返回调用前的状态)
段内CS不变,不带参数返回RET,带参数RETN
SS:【SP】=IP,SP=SP+2(+n)
段间,同理IP先出栈,之后再CS
SP=SP+2(+n)
INT中断
1号中断,将键盘输入的字符显示输出
并将字符的ASCII码存入AL中
2号中断 单显示输出字符
MOV DL,'字符'(DL中有字符的ASCII码)
MOV AH,02H
INT 21H(无键盘输入)
9号中断,字符串显示输出
MOV DX,存放字符串的偏移量
MOV AH,09H
INT 21H
0A号中断,字符串输入
MOV DX,缓冲区偏移量
MOV AH,0AH
INT 21H
此时的缓冲区定义的第一字节用户给定能够存放的最大字符个数
第二个字节为系统填写实际输入的字符个数(不包括回车键)
第三个字节开始存放输入的字符串,最后键入回车键,代表字符串结束,
同时回车键也占用了一个字节
所以缓冲区的字节空间为实际字节数+2
有符号数都是用补码来表示数据从而进行加减的
首先将将BCD码拆成变成0101的格式,计算数据,如果大于127
说明为负数(因为正数的补码还是源码最大表示127)
将符号位摘除,通过对后续的编码-1再取反
得到原来的数据
对操作数没有影响,只对标志位有影响
移位和循环类指令
移位指令(对于立即数,只可以移动”1“,
若为非1的数,则MOV CL,3,SHL AX,CL)用CL
非循环移位
算数移位(针对有符号数)
逻辑移位(针对无符号数)
SAR
算数右移(算数就是移动的时候高位补的是符号位)
在左移位数为1的情况下,移位后,如果最高位和CF不同,则溢出标志OF=1,这对
带符号数可由此判断移位前后的符号位不同;反之,若移位后的最高位和CF相同,则
OF=0,这表示移位前后符号位没有改变。
SHL=SAL
SHR 逻辑右移,最低位进入CF,最高位补0
逻辑、算数左移原理相同(CF=符号位,最低位补零)
循环移位
只影响OF、CF位。
特点
循环移位指令在执行一次时,移位结果使最高位发生变化,则OF=1;若循环移位多
位时,OF无效。
逻辑左右移动,可以让数值乘2 或除2 ,
但要注意数的原始长度,不能无限制的左右移
带进位
不带进位(移动8次一循环)
ROL
ROR
最高位移到CF的同时,同时移动到最低位
最低位移到CF同时,移动到最高位
RCL
RCR
将CF中原来的值移到最低位,数的最高位移到CF
将CF中原来的值移到最高位,数的最低位移到CF
8号中断 键盘输入符号的ASCII码存入AL
但不显示在键盘上
6号中断 直接控制台I/O
(DL)=0FFH,键盘输入
否则DL内容输出