汇编网首页登录博客注册
zouhehui的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  没有什么不可以
  • 『姓名』:QINGYUAN
  • 『性别』:男『发送消息
  • 个人说明:生活中本来就有很多的无奈,幼稚在老练面前当然显得那么的无能为力;谦虚谨慎与自命不凡那或许是两种不同的境界;珍重、爱惜自己才会懂得如何去关心、在乎别人;很多事情没必要再去记起,听说快乐只源于卓有成效的工作后,我有一点点的诧异!
  • 详细信息『加为好友』
学习动态

[2009-12-29 10:40] 8086/8088指令系统

一、8086/8088指令系统的功能
1.数据传送
2.算术运算
3.逻辑运算
4.串操作
5.程序控制
6.处理器控制
说明:对于每一条指令程序员应该注意一下几个方面的内容
a.指令的功能
b.适用于指令的操作数寻址方式
c.指令对标志位的影响
d.指令的长度与执行时间
二、指令功能详解
1.MOV DST,SRC
该指令是数据传送指令,此指令的功能是把一个字或者一个字节从源操作数SRC送至目的操作数DST中,该指令对标志位没有影响。
具体的功能:
(1)cpu内部寄存器之间的数据传送,如:
MOV AH,BH ;8位的寄存器数据传送
MOV AX,BX ;16位的通用寄存器数据传送
MOV AX,CX ;段寄存器与通用寄存器之间的数据传送
MOV BP,SP ;源变址寄存器与基址寄存器之间的数据传送
说明:就cpu内部寄存器之间的数据传送下列情况是不允许的
a.源操作数SRC与目的操作数DST同时是段寄存器
b.代码段CS不能作为目的操作数DST
c.指令指针寄存器IP既不能作为目的操作数也不能作为源操作数
上述3种情况在8088/8086指令系统中没有例外.
(2)立即数与通用寄存器或立即数与内存单元之间的数据传送
MOV AL,03H ;立即数与8位的寄存器之间的数据传送)
MOV SI,1122H ;立即数与16位的通用寄存器之间的数据传送
MOV VARB,2233H ;立即数与变量之间(也就是内存单元)
                 ;之间的数据传送
MOV [SI],6543H ;立即数与内存单元中的数据传送
说明:在立即数永远不能作为目的操作数DST,这在MOV指令中也不例外
(3)寄存器与内存单元之间的数据传送
MOV AX,VARW ;VARW是一个字变量,存储器的操作为直接寻址
MOV BH,[DI] ;存储器操作数为寄存器间接寻址
MOV [BP],AX ;目的操作数使用寄存器间接寻址
说明:在使用MOV指令时不仅要注意上面提到的规定还要注意一下两个方面
其一,源操作数与目的操作数类型要一致,即同时为字或字节,不能一个是字另一个是字节,
例如下面的指令时错误的
MOV AX,BL
MOV BL,AX
MOV BL,4466H
MOV [SI],AX
其二,除串操作外,源操作数与目的操作数不能同时是内存单元
例如下面的指令时错误的:
MOV VARW1,VARW2 ;VARW1与VARW2都是两个变量
MOV [AX],VARW   ;同样是两个内存单元的之间的数据传送
注意:如果要进行两个内存单元之间的数据传送可以用一下几种办法
假设要把VARW1中的内容传送VARW2中
指令可以写成:
MOV AX,VARW1
MOV VARW2,AX
也可以写成:
XCHG AX,VARW1
XCHG VARW2,AX
还可以写成:
PUSH VARW2
POP  VARW1
总之MOV传送指令数据传送方向如下图所示(竖线代表向下传递):
  段寄存器                        
DS,ES,CS,SS<---------------->通用寄存器
    ^ 立即数<---------------->AX,BX,CX,DX
    |   |
 存  储  器 <----------------->BP,SP,BI,DI
2.XCHG OPRD1,OPRD2 ;交换指令
功能:该指令是把操作数OPRD1的内容与OPRD2内容进行交换,操作数同时是字或者是字节。该指令可以方便的实现通用寄存器与通用寄存器之间的数据交换,但是该指令的两个操作数不能同时是内存单元,操作数也不能为立即数也不能是段寄存器。
XCHG AH,BH
XCHG AX,BX
XCHG [SI],AX
XCHG AX,[SI]
以上指令时正确的,下面的指令时错误的
XCHG [SI],VRAW
XCHG  AX,0001H
XCHG  AX,DS
3.LEA REG,OPRD (有效地址传送指令)
功能:该指令是把操作数OPRD的有效地址传送给操作数REG。因为传送的是有效地址所以操作数OPRD必须是存储单元操作数,操作数REG也必须是一个16位的通用寄存器。
例如:
LEA AX,BUFFER
LEA AX,[SI]
LEA AX,[BP+DI+4]
下面的指令时错误的:
LEA AX,1000H
LEA DS,[SI]
LEA AH,BUFFER
4.LDS REG,OPRD(传送32位的地址指针)
功能:该指令是把操作数OPRD中所含的一个32位的地址指针的段值部分送到数据段寄存器DS中,把偏移部分也就是有效地址送到通用寄存器REG中。所以操作数OPRD必须是一个32位的存储器操作数,低16位存放偏移地址,高16位存放段地址,而且操作数REG是一个16位的通用寄存器。
例如:
LDS DI,[BX]
LDS SI,FARPOINTER
5.LES REG,OPRD
功能:该指令的功能是把OPRD中一个32位的地址指针的段值部分送到附加段ES中,把偏移部分送到16位的通用寄存器REG中。其他说明同指令LES。
6.PUSH SRC(入栈指令)
功能:该指令是把源操作数SRC压入堆栈。SRC可以是通用寄存器,也可以是段寄存器,还可以是字存储单元。
例如:
PUSH SI
PUSH DS
PUSH VARW
PUSH [SI]
7.POP DST (出栈指令)
功能:该指令是从栈顶弹出一个字数据到目的操作数DST中。目的操作数可以是通用寄存器,段寄存器(CS除外),也可以是字存储单元。
例如:
POP [SI]
POP VARW
POP ES
POP SI
而指令 POP CS ;是错误的指令
8.LAHF(load AH with Flags)
功能:该指令采用固定的寻址方式,就是把标志寄存器的低8位(包括符号标志位SF,零标志位ZF,辅助进位标志AF,奇偶标志位PF和进位位标志CF)传送到寄存器AH中。该指令本身不影响标志位。
9.SAHF(Store AH into Flags)
功能:该指令与指令LAHF指令功能刚好相反就是把AH中的内容送到标志寄存器的低8位中,所以标志位的内容可能受到影响也可能不变,但是该指令不影响益处标志OF,方向标志DF,中断标志IF和追踪标志TF,也就是不影响标志寄存器的高8位。
10.PUSHF
功能:该指令的功能就是把标志寄存器的值压入堆栈中,该指令不影响标志位。
11.POPF
功能:该指令的功能是把当前堆栈的一个字传送到标志寄存器,同时修改相应的指针。显然该指令影响标志位的值。
12.CLC(进位标志清零指令)
功能:该指令是让进位标志位CF为0.
13.STC(置进位标志指令)
功能:该指令使得进位标志位CF为1 
14.CMC(进位标志取反指令)
功能:该指令的功能就是让进位制标志位CF取反,如果以前为1,则执行玩CMC后CF变成0,如果以前为1 则执行CMC后,CF变成0.
15.CLD(清方向标志位DF)
功能:该指令的功能就是让方向标志位DF的值为0,从而,在执行串操作时按地址递增方式变化。
16.STD(置方向标志位DF)
功能:该指令的功能就是让DF的值为1 ,从而在执行串操作时按地址递减的方式变化。
17.CLI(清中断标志位)
功能:该指令的功能就是让中断允许标志位IF的值为0 ,于是CPU不响应外部装置的中断响应。
18.STI(置中断允许标志)
功能:该指令的功能是让中断也内需标志的值为1,从而CPU可以响应可屏蔽中断。
19.ADD OPRD1,OPRD2(普通加法指令,被带进位的加法指令)
功能:该指令实现两个数相加,结果送至目的操作数OPRD1中。ADD影响标志寄存器的各状态标志位。
20.ADC OPRD1 ,OPRD2(带进位的加法指令)
功能:该指令的功能与ADD类似,但是还要Ibanez标志位CF的现行值加进去。该指令影响标志位。
21.INC OPRD(加1 指令)
功能:该指令完成度操作数OPRD加1,然后把结果送回到OPRD中。该指令的目的操作数可以是通用寄存器,也可以是存储单元。这条指令的结果影响标志位ZF,SF,OF,AF但是它不影响CF。
22.SUB OPRD1,OPRD2(普通减法指令即不到借位的减法指令)
功能:这条指令完成两个操作数想减,从OPRD1中减去OPRD2,然后把结果送至目的操作数OPRD1中,该指令影响标志位。
23.SBB OPRD1,OPRD2(带借位的减法指令)
功能:该指令的与SUB指令类似,在操作数OPRD1中减去OPRD2的同时还要减去借位位的现行值,该指令影响标志位。
24.DEC OPRD
功能:该指令实现减1操作,操作数OPRD可以是通用寄存器,也可以是存储单元。在想减时把操作数作为一个无符号数对待。这条指令影响标志位AF,ZF SF,PF和OF但是不影响CF。
25.NEG OPRD(取补指令)
功能:该指令就是对操作数取补,就是用0减去操作数OPRD,在把结果送回OPRD。此指令在字节操作时对-128取补,或在对字操作时对-32768取补,则操作数没有变化,但是OF被置位。操作数可以是通用寄存器也可以是存储单元,此指令的执行结果影响CF,ZF,SF,OF,AF和PF,一般总使CF置1.
26.CMP OPRD1,OPRD2(比较指令)
功能:这条指令完成操作数OPRD1减去OPRD2,运算结果不送到OPRD1,但是影响CF,ZF,SF,OF,AF,PF,CF。
27.MUL OPRD(乘法指令)
功能:在乘法指令中,一个操作数总是隐含在寄存器AL(8位数相乘)或在AX中(16位数相乘),另一个操作数可以采用出立即数以外的所有的寻址方式。
   如果OPRD是字节操作,则把AL中的无符号数与OPRD相乘,16位的结果送到AX中,如果OPRD是字操作数,则把AX中的无符号数与OPRD相乘,结果的高16位送至DX中,低16位送至AX中。
     该指令影响标志位,如果乘积的高半部分不等于0,则标志CF=1,OF=1;否则CF=0,OF=0,所以如果CF=1和OF=1表示在AH和DX中含有结果的有效数。该指令对其他标志无定义。
28.IMUL OPRD(有符号数的乘法指令)
功能:这条指令把被乘数和乘数均作为有符号数,此外与指令MUL完全类似。
   该指令影响标志位,如果乘积的结果的高半部分不是低半部分的符号的扩展,则标志位CF=1,OF=1;否则CF=0,OF=0.
29.DIV OPRD(无符号数除法指令)
功能:在除法指令中,被除数总是隐含在寄存器AX(除数是8位)或者DX和AX中(除数是16位),8位的商送到AL中,8位的余数送到AH中;如果OPRD是字操作数,则把商送到AX中,余数送到DX中。
注意:如果除数位0,或者8位数除时商超过16位,则认为是除溢出,引起0号中断。除法指令对标识位的影响无定义。
30.IDIV OPRD(有符号数的除法指令)
功能:这条指令把除数与被除数都作为有符号数来处理,此外此指令与DIV完全类似。
31.CBW (字节转化为字指令)
功能:该指令的功能就是把寄存器AL中的符号位扩展到寄存器AH中。即若AL的最高有效位为0;若AL的最高有效位为1 最扩展为0FFH。·
32.CWD(字节转换为双字指令)
功能:纸条指令吧寄存器AX中符号位扩展到寄存器DX中,即若AX符号位为0 则DX=0,若AX的符号位为1则DX0FFFFH。
33.NOT OPRD(取反指令)
功能:这条指令把操作数OPRD取反,然后送回OPRD。操作数OPRD可以是通用寄存器也可以是存储器操作数,该指令对标志位没有影响。
34.AND OPRD1,OPRD2 (逻辑与指令)
功能:该指令把两个操作数进行逻辑与并把结果送到OPRD1中,该指令执行后,标志位CF=0,标志位OF=0,标志位PF,ZF,SF反应运算的结果,对标志位AF没有定义。
说明:某个操作数自己与自己相与,则值保持不变,但是可是使进位位清零。与指令主要用在使一个操作数中的若干位保持不变,而另外的若干位清零的场合。
35.OR OPRD1 ,OPRD2(逻辑或指令)
功能:该指令的把两个操作数OPRD1 与OPRD2进行逻辑或操作,并把结果送至目的操作数OPRD1中该指令是标志位CF=0,OF=0,标志位PF,ZF,SF反应运算的结果,对标志位AF没有定义。
某个操作数自己一自己进行逻辑或操作则保持不变但是可以是进位位CF清零。或操作主要用在让某个操作数的若干位置1,而其他的各位保持不变的情况。
36.XOR OPRD1,OPRD2(异或操作指令)
功能:这条指令对两个操作数进行逻辑异或操作,结果送至目的操作数OPRD1中,该指令执行后,标志位CF-0,标志位OF=0,标志位PF,ZF,SF反应运算结果,标志位AF没有定义。
某个数自己与自己异或则结果为0 ,并可以使进位位CF清零。
37.TEST OPRD1,OPRD2(测试指令)
功能:该指令与指令AND类似只是不传送结果,仅仅影响标志位。该指令执行后,CF与OF清0,SF,PF,ZF,反应运算结果。
评论次数(0)  |  浏览次数(1182)  |  类型(汇编知识总结) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码