8086指令系统
传送指令
传送指令 MOV
mov dest,src; dest<---src
注意:
- 不能在两个内存单元之间直接传送数据
- CS和IP寄存器不能作为目的操作数
- 用BX、SI、DI来间接寻址时,默认的段寄存器为DS,而用BP来间接寻址时,默认的段寄存器为SS。
- 所有的通用传送指令都不改变标志
交换指令XCHG
XCHG reg,mem/reg
注意:
- 段寄存器和IP不能作为交换指令的操作数
I/O指令
执行的操作:
直接寻址:IN/OUT acc,PORT ;PORT端口号0-255H
间接寻址:IN/OUT acc,DX;DX表示的端口范围达64K
注意:
- 只能用累加器作为执行输入输出的机构
取有效地址指令(LEA)
这里有效地址指地址偏移值
执行的操作: LEA reg,mem
lea ax,[1142] ; (ax) = 1142
LEA AX,VARWORD
MOV AX, OFFSET VARWORD
上述两条指令执行效果相同,前者执行时确定值,后者在编译时确定偏移量。
装入地址指令
执行的操作:LDS/LES reg, mem32 ;
DS:reg←(mem开始的四个内存单元的内容,同时设置段寄存器和偏移量)
LDS DI,[2130H]
;使2130H和2131H中的偏移量送DI,
;2132H和2133H中的段值DS。
类似指令还有 LFS/LGS/LSS
标志传送指令
-
读标志指令LAHF
LAHF把标志寄存器低8位中的5个标志位传送到AH中的指定位

-
设置标志指令SAHF
SAHF的功能与LAHF的功能正好相反,用图来示意,只要将上图中5个箭头方向反一下即可。

-
把标志寄存器推入栈顶指令
PUSHF执行的操作:(SP)-1←标志寄存器高8位
(SP)-2←标志寄存器低8位
(SP)←(SP)-2 -
从栈顶弹出标志寄存器指令POPF
执行的操作:标志寄存器低8位←(SP)
标志寄存器高8位←(SP)+1
(SP)←(SP)+2
PUSHF和POPF指令用于保护和恢复标志寄存器内容。
堆栈操作指令
-
堆栈操作指令
压入堆栈指令PUSH和弹出堆栈指令POP
POP/PUSH dest注意:
- 堆栈操作总是按字进行的
- 允许PUSH CS,但不允许POP CS
-
PUSHA/PUSHAD
将8个通用寄存器全部进栈,进栈顺序为:AX,CX,DX,BX,SP,BP,SI,DI,然后SP 指针寄存减16,不过SP入栈的内容是PUSHA指令执行前的内容 -
POPA/POPAD
弹出堆栈 顶的8 个字,并依序存入DI、SI、BP、SP、DX、CX、BX、AX 里
符号扩展指令
CBW、CWD、CWDE、 CDQ
- CBW:将AL寄存器中的符号位扩展到AH中,AH中各位取与AL的符号位相同的值,即对负数1扩展,正数0扩展。
- CWD:将AX中的被除数扩展成双字,即把AX中的符号位扩展到DX中。
- CWDE:AX(16位)->EAX(32位)
- CWQ:EAX(32位)->EDX+EAX(64位)
执行时,不影响标志位。
算术指令
算术运算指令涉及两种类型的数据
无符号数
8位无符号数的范围为0-255
16位无符号数的范围为0-65 535
有符号数
8位有符号数的范围为-128-+127
16位有符号数的范围为-32 768-+32 767
所有算术运算指令均影响状态标志。
规则:
当无符号数运算产生溢出时,CF为1;
当有符号数运算产生溢出时,OF为1;
如运算结果为0,则ZF=1;
如运算结果为负数,则SF=1;
如运算结果中有偶数个1,则PF=1。
CF和OF是看待数据的两个角度前者是将数据看成无符号数,后者是有符号数。
加法指令
- 不带进位位的加法指令(ADD)
ADD dest, src - 带进位位的加法指令ADC
ADC指令在形式上和功能上与ADD类似,只是相加时还要包括进位标志CF的内容
ADC指令可用于多字节的加法运算中
MOV AX,BUFFER2
ADD BUFFER1,AX ;低字相加
MOV AX,BUFFER2+2
ADC BUFFER1+2,AX ;高字相加,包括低字的进位
ing
979

被折叠的 条评论
为什么被折叠?



