2.微处理器的指令系统
1.传送指令
1)通用传送指令MOV
两个操作数位数相同的传送指令MOV,它可实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给内部寄存器或内存单元。
eg: MOV AL,BL
MOV AX,[BX] BX和BX+1所指的两个内存单元的内容送到AX
MOV CX,[1000] 将1000和1001两单元的内容送CX
MOV DX,5040H 立即数5040H送DX
注意:
1.通用传送指令可传送8位、16位或32位数据,具体取决于指令中涉及的寄存器是多少位,也取决于立即数的形式
2.不能在两个内存单元之间直接传送数据
3.不能从一个段寄存器向另一个段寄存器传送数据
4.在通用传送指令中,寄存器既可以作为源操作数,也可以作为目的操作数,但CS/IP/EIP寄存器不能作为目的操作数,这些寄存器的值不能随意修改
5.用EBX,ESI,EDI,BX,SI,DI来间接寻址时,默认的段寄存器为DS,而用EBP,ESP,BP,SP来间接寻址时,默认的段寄存器为SS
6.所有的通用传送指令都不改变标志
2)普通堆栈操作指令PUSH/POP:按照“后进先出,先进后出”的规则存取数据
PUSH指令把一个2字节或4字节的数据推入堆栈,操作数既可以为立即数,也可为寄存器和存储器中的数
eg: PUSH BX;将BX的内容推入堆栈,堆栈指针减2
PUSH [BX+DI];将BX+DI和BX+DI+1所指两单元的内容推入堆栈
PUSH 0870H;将立即数0870H推入堆栈,栈顶单元为70H
同样还有一系列的弹出指令POP
eg: POP BX;将栈顶两单元弹出送BX,栈顶地址加2
注意:1.没有PUSH AH、PUSH BL这样的字节操作指令
2.CS寄存器的值可推入堆栈,但反过来,不能从堆栈中弹出1个值到CS寄存器
3)输入、输出指令IN/OUT
对输入、输出端口的寻址有两种方式:直接寻址和利用DX寄存器的间接寻址
1.直接的I/O指令,这些指令中直接提供了I/O端口号
eg:IN AL,50H 将50H端口的字节读入AL
IN AX,70H
OUT 80H,AX 将AX中的内容输出到80H、81H端口
2.间接的I/O指令,间接I/O指令执行前,,必须在DX寄存器中设置好端口号
eg: IN AL,DX
IN AX,DX
OUT DX,AX
注意:1.FFH是直接I/O寻址中使用最大的端口号,端口号大于255时,只能用间接的I/O指令
2.用间接指令I/O指令时,只能用DX寄存器
3.直接寻址时地址码不加【】
2.算术运算指令
1.加法类寄存器
1)ADD不带进位位的加法指令
eg:ADD CX,1000H;CX中的内容和1000H相加,结果放在CX中
ADD DI,SI;DI和SI的内容相加,结果放在DI中
ADD指令影响OF,SF,ZF,AF,PF和CF标志
2)ADC带进位位的加法指令,将进位标志CF的值加在和中
eg: ADC AX,SI;AX和SI中的内容以及CF的值相加,结果放在AX中
ADC DX,[SI];SI和SI+1所指单元的内容和DX的内容以及CF的值相加,结果放在DX中
ADC BX,3000H;BX中内容和立即数3000H以及CF的值相加,结果放在BX中
ADC指令影响OF,SF,ZF,AF,PF和CF标志
3)增量指令INC
INC指令只有一个操作数,指令在执行时,将操作数的内容加1.这条指令一般用在循环程序中修改指针和循环次数
eg:INC CH;
INC影响标志位AF,OF,PF,SF和ZF;特别注意INC指令不影响进位标志CF。
2.减法类指令
1)SUB不考虑借位的减法指令,完成2个数的相减
eg:SUB BX,CX;将BX中字减去CX中的字,结果放在BX中
SUB SI,5010H;SI中的数减去5010H,结果放在SI中
SUB指令影响标志位OF,SF,ZF,AF,PF,和CF
2)SBB考虑借位的减法指令,在执行减法运算时,还要减去CF的值,SBB主要用在多字节减法运算中,当分布进行减法运算时。
eg:SBB AX,2530H;将AX的内容减去2530H,并减去进位位CF的值
SBB指令影响标志位OF,SF,ZF,AF,PF,和CF
3)减量指令DEC,只有一个操作数,执行时,将操作数的值减1,此指令常用在循环中对计数器进行修改,而不会对循环中的算术运算产生的状态产生干扰
eg:DEC AX;将AX的内容减1,结果再送回AX;
DEC指令影响标志位OF,SF,ZF,AF,PF
4)比较指令CMP,执行两个数的相减操作,但不返回相减的结果,只使结果影响标志位
eg:CMP AX,2000H;将AX的内容和2000H相比较,结果影响标志位
判断结果:ZF=1,两个相比较的操作数相等
如果OF和SF的值相同(均为1或0),则被减数大;若不同,则被减数小。
逻辑运算和移位指令
逻辑运算指令AND/OR/NOT分别执行与、或、非,他们都是双操作数指令
TEST指令不仅执行AND指令的操作,而且把OF和CF标志清0,修改SF,ZF,PF标志。TEST指令比送回操作结果,仅仅影响标志位(执行与运算,返回ZF=1/0)
注:常常用AND指令对指定位清0;用OR指令来对一些指定位设置1
移位指令
非循环移位指令 SAL算术左移指令、SAR算术右移指令、逻辑左移指令SHL和逻辑右移指令SHR
所有的移位指令执行时都会影响标志位CF,OF,PF,SF和ZF。
循环位移指令 ROL不带进位位的循环左移指令、ROR不带进位位的循环右移指令、RCL带进位位的循环左移指令、带进位位的循环右移指令RCR
子程序调用和返回指令
ABC:…………
…………
RET
调用 CALL ABC
无条件转移指令JMP
JMP ABC->标号
条件转移指令
JE/JNE 结果相等/不等,则转移
JZ/JNZ 结果为0/不为0,则转移
循环控制指令
计数循环指令LOOP:执行LOOP指令时,先将CX内容减1,再判断CX中是否为0,如果不为0,则继续循环,如为0,则退出循环,执行下一条指令。在LOOP指令前,一定要对CX寄存器设置初值
中断指令INT和中断返回指令IRET
RET CS、IP
IRET CS、IP、标志寄存器
任何中断处理程序都以IRET作为最后一条指令
标志操作指令
进位标志处理指令:
1.STC使进位标志CF置1
2.CLC使进位标志CF清0
方向标志设置和清除指令
1.STD使DF为1,字符地址进行减量修改;
2.CLD使DF为0,字符地址进行增量修改
中断允许标志设置和清除指令STI/CLI
中断允许标志IF是1还是0决定了系统是否可响应外部可屏蔽中断
STI指令使IF置1,即开放中断(开)
CLI指令使IF清0,屏蔽外部中断(关)