数据传送指令课件_第1页
数据传送指令课件_第2页
数据传送指令课件_第3页
数据传送指令课件_第4页
数据传送指令课件_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据传送指令

存储器I/O接口输入设备I/O接口数据总线DB控制总线CB地址总线AB输入设备CPU寄存器,存储器,I/O端口

数据传送是最基本、最重要的一种操作实际程序中,使用的比例最高

changePROC

LEASI,num+2MOVCL,num+1MOVCH,0MOVAX,0MOVDI,10next:MULDI

MOVBH,0MOVBL,[SI]ANDBL,0FHADDAX,BXINCSILOOPnextzero:MOVBX,AXRETchangeENDP

汇编子程例:寄存器寄存器寄存器内存单元寄存器I/O端口设置寄存器、内存单元的初始值

按传送内容,可分为四类:1.

通用数据传送MOV,PUSH,POP,XCHG,XLAT2.

地址传送LEA,LDS,LES3.

标志传送PUSHF,POPF,LAHF,SAHF4.

输入输出传送IN,OUT(在第五章介绍)

特点:

1.除POPF、SAHF外,其他传送指令对标志位均无影响

2.唯一允许以段寄存器做操作数的指令且只有MOV、PUSH、POP这三条允许1.

通用传送指令

MOV、PUSH、POP、XCHG、XLATreg/mem/segreg←regreg/segreg←memreg/mem←segregreg/mem←data

可实现1)MOV传送指令格式

MOVdst,src执行

(dst)←(src)例:

①reg/mem/segreg←reg通用寄存器/存储器/段寄存器←通用寄存器

MOVAL,BLMOV[BX],ALMOVDS,AX②reg/segreg←mem通用寄存器/段寄存器←存储器

MOVAL,[BX]MOVDS,[BX+SI]

③reg/mem←segreg通用寄存器/存储器←段寄存器

MOVBX,CSMOV[BX],DS

④reg/mem←data通用寄存器/存储器←立即数

MOVAl,9MOVBX,OFFSETbufferMOV[value],0MOVWORDPTR[BX],1MOV指令特点及注意事项:

双操作数指令(注意双操作指令的特点)可进行字节或字传送不允许存储器传送到存储器MOV[BX],valueMOV[DI],[SI]MOVAX,valueMOV[BX],AXMOVAL,[SI]MOV[DI],AL

可对DS、ES、SS赋值但不允许立即数直接传送给段寄存器MOVDS,AXMOVES,[BX]MOVDS,1000HMOVAX,1000HMOVDS,AX

CS不能做目的操作数,不能通过传送指令改变CS的值

MOVCS,AX

不允许段寄存器传送到段寄存器

MOVES,DSMOVAX,DSMOVES,AXD:\MASM>DEBUG-A1693:0100MOVES,DS^Error1693:0100MOVAX,DS1693:0102MOVES,AX1693:0104-2)PUSH入栈操作格式

PUSHsrc执行(SP)←(SP)-2

(SS:SP)←(src)特点:

单操作数指令操作数为16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:CS,DS,ES,SSmem:字类型SS:SP

SS:SP

(src)例:

PUSHAX若执行前:

(SS)=2000H(SP)=1002H(SS:SP)=

2010H

(AX)=1234H3B2A10低高20地址SS:SP2000:1002指令执行前(AX)=1234h则执行后:

(SS)=2000H(SP)=1000H(SS:SP)=1234H(AX)=1234H123410低高20地址SS:SP2000:1000指令执行后(AX)=1234h不变减2变不变

D:\MASM>DEBUG-A;汇编两条指令1693:0100MOVAX,12341693:0103PUSHAX1693:0104-R;显示指令执行前寄存器值AX=0000

BX=0000CX=0000DX=0000

SP=FFEE

BP=0000SI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0100NVUPEIPLNZNAPONC1693:0100B83412MOVAX,1234-T=1002;执行CS:100开始处的两条指令

….AX=1234

BX=0000CX=0000DX=0000

SP=FFEC

BP=0000SI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0104NVUPEIPLNZNAPONC1693:010403C6ADDAX,SI-DSS:FFECL10;查看栈顶内容1693:FFE0341200004...1693:FFF0FFFFFFFFFFFFFFFF-FFFFFFFF............-Q例利用DEBUG学习PUSH指令注意相关寄存器和内存单元内容的变化3)POP出栈操作特点:单操作数指令操作数为16位,可以是reg/segreg/mem,不可以是datareg:AX,BX,CX,DX,SI,DI,BP,BXsegreg:DS,ES,SS,不允许是CSmem:字类型SS:SP

SS:SP

(dst)格式

POPdst执行(dst)←(SS:SP)(SP)←(SP)+2若执行前:

(SS)=2000H(SP)=1000H(SS:SP)=1234H

(BX)=5678H123410低高20SS:SP2000:1000指令执行前地址(BX)=5678h例:

POPBX123410低高20SS:SP2000:1002指令执行后地址(BX)=1234h则执行后:

(SS)=2000H(SP)=1002H

(SS:SP)=2010H(BX)=1234H

不变加2变变

-A1693:0100MOVBP,SP;取当前栈顶地址

1693:0102MOVWORDPTR[BP],1234;用MOV指令使栈顶内容为1234H1693:0107POPBX;出栈指令1693:0108-R;查看指令执行前状态AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0100NVUPEIPLNZNAPONC1693:010089E5MOVBP,SP-T=100;执行CS:100处的第一条mov指令AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=FFEESI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0102NVUPEIPLNZNAPONC1693:0102C746003412MOVWORDPTR[BP+00],1234SS:FFEE=0000-T;执行下一条mov指令AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=FFEESI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0107NVUPEIPLNZNAPONC1693:01075BPOPBX-T;执行pop指令,注意BX,SP的变化AX=0000BX=1234CX=0000DX=0000SP=FFF0BP=FFEESI=0000DI=0000DS=1693ES=1693SS=1693CS=1693IP=0108NVUPEIPLNZNAPONC1693:0108F5CMC-例在DEBUG下学习POP指令例:执行下列程序段

PUSHAX

PUSHBX

MOVAX,66H③

MOVBX,99H④

POPBX

POPAX

⑥若执行前(SS)=3000H(SP)=200EH(SS:SP)=1234H(AX)=0A0BH(BX)=0C0DH3000:200ESS:SP

执行前(AX)=0A0B(BX)=0C0D3412执行①后3000:200CSS:SP

0B0A3000:200ASS:SP

执行②后0D0C0B0A3000:200CSS:SP

执行⑤后:(BX)=0C0D0D0C0B0A执行③④后(AX)=0066(BX)=0099执行③④后(AX)=0066(BX)=00993000:200ASS:SP

执行②后0D0C0B0A执行⑥后:(AX)=0A0B3000:200ESS:SP

(BX)=0C0D执行③④后(AX)=0066(BX)=00990D0C0B0A用PUSH往SS段传送一批数据后,再用POP取出时,取出单元的顺序与存放时的顺序正好相反,“后进先出”⑥POPAX(AX)=0A0B①PUSHAX3000:200ESS:SP

执行前3000:200CSS:SP

3000:200ASS:SP

②PUSHBX3000:200ESS:SP

3000:200CSS:SP

0D0C0B0A3412⑤POPBX(BX)=0C0D(AX)=0A0B(BX)=0C0D④MOVAX,0066(BX)=0099③MOVAX,0066

(AX)=0066

堆栈是一个内存区域。通常用于存放一些重要数据,

如程序的地址、或是需要恢复的数据。SS:SP

为方便数据的存放和恢复,设置专门的指针,指向堆栈中要操作的单元。段值由SS给出,偏移地址由SP给出

SS→堆栈段寄存器(stacksegment)SP→堆栈指针寄存器(stackpoint)堆栈的概念stack

堆栈操作指令PUSH和POP,对SS和SP指向的内存单元,以“后进先出”方式进行操作。

PUSH→入栈操作SP减小

POP→出栈操作SP增加

SP指向栈顶,即堆栈的顶部,

编程员通过设置堆栈区域,利用堆栈操作,可方便的进行数据的存放和恢复。SS:SP

SS:0000SS:FFFF堆栈未用空间堆栈使用的场合用堆栈保存恢复信息

(如上例)子程序的调用、返回以及中断调用、返回(控制转移指令中介绍)用堆栈传送数据(程序设计中介绍)注意事项

堆栈是一重要数据结构,使用堆栈应有明确目的。不乱用堆栈操作,不乱修改堆栈内容。PUSH、POP、PUSHF、POPF、CALL、RET、INT、IRET

乱修改SS和SP的内容包括乱用BP参与的存储器操作数

乱用指令PUSH和POP指令只能对字操作。

PUSHALPOPBYTEPTR[BX]

可以对段寄存器操作但POP不能对CS操作

PUSHDSPUSHCSPOPES

POPCS4)XCHG交换指令

格式

XCHGoprd1,oprd2执行

(oprd1)(oprd2)regregregmemmemreg

可实现例

XCHGAX,BX字操作

执行前(AX)=1122H(BX)=3344H

执行后(AX)=3344H(BX)=1122H

XCHGAH,BL字节操作

执行前(AX)=1122H(BX)=3344H

执行后(AX)=4422H(BX)=3311HXCHGoprd1,oprd2注意事项:

双操作数指令可进行字或字节操作不允许对立即数、段寄存器做操作数

XCHGAX,4

XCHGBX,DS2.

地址传送指令LEA、LDS、LESLEA有效地址传送格式

LEAreg,mem执行(reg)←mem的EA

即寄存器←存储器操作数的偏移地址

执行后

(BX)=1000H注意:

OFFSET是汇编程序提供的一个操作符,不是CPU的指令LEABX,buffer例

buffer是一个符号地址表示的内存操作数(变量)。…...12h34h56h…...buffer内存DS:1000h若变量buffer的偏移地址=1000H等价于

MOVBX,OFFSETbufferbuffer

1A2B3C4D、、、、、、例

将buffer为首的4个字节内存内容相加,存放在AL中。MOVAX,SEGbufferMOVDS,AX

LEABX,bufferMOVCX,4MOVAL,0exit:ADDAL,[BX]INCBXDECCX;(cx)=(cx)-1JNZexit;ZF≠0,转至exit说明:1)

操作符SEG的作用是取变量的段地址。执行完前两条指令后,(DS)=buffer的段值

2)

操作符OFFSET的作用是取变量的偏移地址执行完LEA

BX,buffer,(BX)为buffer的偏移地址,

3)操作数[BX]是以DS为段值,BX为偏移值的内存单元LEAreg,mem特点及注意事项:目的操作数reg应是16位通用寄存器

LEAES,[BX]LEAAL,bufferLEA6,[BX+SI]LEA[DI],buffer

源操作数应是存储器操作数

LEABX,AX

传送的是内存单元的有效地址,与其内容无关。…...12h34h56h…...buffer内存3.

标志传送PUSHF、POPF、LAHF、SAHFSS:SP

SS:SP

(PSW)2)POPF标志出栈格式

POPF执行(PSW)←

(SS:SP)(SP)←

(SP)+2SS:SP

SS:SP

(PSW)1)PUSHF标志入栈格式

PUSHF执行(SP)←

(SP)-2

(SS:SP)←

(PSW)特点及注意事项:无操作数的形式,操作数隐含为(PSW)PUSHFAXPOPFCXPUSHF和POPF用于标志信息的保存和恢复三.算术运算指令指令分类:特点:带符号数用补码表示如MOVAX,-1等价于

MOVAX,0FFFFh

对加、减运算,不区分无符号数、带符号数(参见第一章例)对乘、除运算,区分无符号数、带符号数可进行字节或字操作影响状态标志十进制运算方法(不做重点,讲义中做了简单介绍)当数据用压缩或非压缩BCD码表示时,为使运算的结果仍为BCD码表示,需对结果进行调整。

十进制运算=二进制运算+十进制调整

BCD码(BinaryCodedDecimal)

用二进制编码表示十进制数。常用8421BCD码,与十进制数码对应关系:例

48的BCD码为(01001000)BCD

根据在内存的存放形式,分压缩BCD码和非压缩BCD码1)压缩BCD码一字节存放2个BCD码。

2148的压缩BCD码为:(00100001

01001000)压缩BCD

在内存中占2字节2)非压缩BCD码一字节存放1个BCD码。

2148的非压缩BCD码为:(00000010

00000001

00000100

00001000)

非压缩BCD

在内存中占4字节当数据用压缩或非压缩BCD码表示时,为使运算的结果仍为BCD码表示,需对结果进行调整。

十进制运算=二进制运算+十进制调整例

(00001000)

压缩BCD

+(00001001)

压缩BCD

=(00010111)

压缩BCD计算机计算过程看作压缩BCD0000100008+0000100109

0001000111

二进制运算十进制调整+00000110

00010111171.加法运算指令

ADD、ADC为双操作数指令

INC为单操作数指令除INC指令不影响CF外,6个状态标志均据结果设置ADC带进位加法,实现字以上运算CFA1H

1100111110100001+62A0H+0110001010100000111111111113241H0011001001000001例1

编程完成

CFA1H+62A0H(做过的随堂作业)MOVDX,0CFA1HADDDX,62A0H执行后:(DX)=3241HCF=1,OF=0,SF=0,ZF=0(注意CF和OF的判断方法)D:\MASM>DEBUG-A;汇编指令1270:0100MOVAX,CFA11270:0103ADDAX,62A01270:0106-R;执行前查看各寄存器内容AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1270ES=1270SS=1270CS=1270IP=0100NVUPEIPLNZNAPONC1270:0100B8A1CFMOVAX,CFA1-T2;执行汇编的两条指令,并查看执行后的结果…...AX=3241BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=1270ES=1270SS=1270CS=1270IP=0106NV

UPEIPLNZNAPE

CY1270:010657PUSHDI-利用DEBUG学习加法指令三组指令执行后的结果均为:(AL)=0FDH,CF=0,OF=0,SF=1,ZF=0MOVAL,0F1HADDAL,0CHMOVAL,241ADDAL,12

MOVAL,-15ADDAL,12第一章中的例题F1H+0CHFDH二进制运算241+12253看作无符号数(-15)+12

(-3)看作带符号数B0F1040C、、、、、、第一条指令第二条指令三组机器码相同:对加、减运算,CPU计算时不区分无符号数、带符号数例2

INCAL执行前(AL)=FFH

执行后:

(AL)=00HCF=不变,OF=0,ZF=1,SF=0FFH+01H11

00H

01FFH+0001H110200H

例3

value

是一个字变量

OFFSETvalue=1000H

(DS)=2000H,(21000H)=01FFHvalueFF21000H

01执行前value0021000H

02执行后执行后:(21000H)=0200HCF=不变,OF=0,ZF=0,SF=0注意是内存单元内容加1,而非地址加1INCvalue或写成:INC[value]例4将buffer为首的4个字节内存内容相加,存放在AL中。

buffer1AB7C5D6若编程如下,MOVCX,4MOVAL,0exit:ADDAL,[buffer]

INCbufferDECCXJNZexit

不能实现,为什么?…...MOVCX,4

LEABX,bufferMOVAL,0exit:ADDAL,[BX]

INCBXDECCXJNZexit实现的是1A+1B+1C+1D指令INCbuffer将buffer指向的内容加1,而不是地址buffer加1例5

两双字相加0002F365H+0005E024H=?MOVAX,0F365H①ADDAX,0E024H

②MOVBX,0002H③ADCBX,0005H④

0002

F365H+

0005

E024H

0008

D389H结果存放在:0008D389(BX)(AX)执行完①、②:(AX)=D389HCF=1,OF=0,SF=1,ZF=0

执行完③、④:(BX)=0008HCF=0,OF=0,SF=0,ZF=0分析:8086/8088只能按字节或字相加。位数在字以上的操作数,先加低位,再加高位,加高位时加入从低位产生的进位。2.减法运算指令SUB、SBB、

CMP为双操作数,DEC、NEG为单操作数

SBB为带进位减法除DEC不影响CF标志外,6个状态标志均据结果置位

NEG求补运算,等价于用0减去操作数。其对标志位的影响,由0减去该操作数的过程决定。例1

编程完成2D04H–3AB0H执行后:

(AX)=0F254HCF=1,OF=0,SF=1,ZF=02D04H0010110100000100-3AB0H-001110101011000011111111111F254H1111001001010100MOVAX,2D04HSUBAX,3AB0H

借位例2

value是一个字节变量

OFFSETvalue=1000H

(DS)=2000H,(21000H)=00HDECvalue

执行后:(21000H)=0FFHCF=不变,OF=0,ZF=0,SF=1注意是内存单元内容减1,而非地址减1

00H-01H11FFH

例3

MOVAH,80HNEGAH00H00000000B

-80H-10000000B1180H10000000B执行后:

(AL)=80HCF=1,OF=1,ZF=0,SF=1例4

用指令完成两双字相减运算05467A70H

-F001A543HMOVAX,7A70HSUBAX,A543HMOVBX,0546HSBBBX,0F001HCMPoprd1,oprd2;(oprd1)-(oprd2)①据ZF判断两数是否相等CMPA,BZF=1两数相等,A=B;ZF=0两数不等,A≠B②据ZF和CF判断两无符号数关系CF=1A低于BCF=0A高于等于BCF=1或ZF=1A低于等于BCF=0且ZF=0A高于B

利用CMP执行后的标志值,比较两操作数之间的关系

比较指令CMP,进行两操作数相减操作,但只影响标志值,不影响操作数(减的结果不保存)

CMPAX,BX;比较

JAEabove;高于等于则跳转

XCHGAX,BX;低于则交换

above:、、、例将AX和BX中较大的无符号数,存于AX中CMPA,B③用ZF、SF和OF判断两带符号数关系

OF=0,不溢出情况,

SF=0,A≥BSF=1,A<BOF=0,SF=0A≥BOF=0,SF=1A<BOF=1,SF=1A>BOF=1,SF=0A<B0-

1正-负=负,结果SF=1,OF=11但,正>负,知A>B

1-0负-正=正,结果SF=0,OF=10但,负<正,知A<B

OF=1,溢出情况,(由符号位可决定是否溢出)结合ZF,得到结论:逻辑运算:思考:可否只用ZF和SF判断两符号数关系?例将AX和BX中较大的带符号数,存于AX中

CMPAX,BX;比较

JGE

great;大于等于则跳转

XCHGAX,BX;小于则交换

great:、、、3.乘法指令无符号数乘法带符号数乘法MULsrcIMULsrc

单操作数指令源操作数(乘数)类型决定操作类型目的操作数(被乘数)隐含。字节乘AL字乘AX

字节相乘的结果存放在AX中字相乘的结果存放在DX、AX中

MUL用于无符号数运算

IMUL用于带符号数运算

影响CF和OF,对其他条件码无定义(不确定)指令MUL

字节相乘,AH=0,CF=OF=0,否则CF=OF=1

字相乘,DX=0,CF=OF=0,否则CF=OF=1

对指令IMUL

字节相乘,AH=0或AH=FFH,CF=OF=0,否则CF=OF=1

字相乘,DX=0或DX=FFFFH,CF=OF=0,否则CF=OF=1例

(AL)=0B4H,(BL)=11H指令中源操作数为字节类型,故是字节操作①MULBL②IMULBL看作无符号数(AL)=180D(BL)=17D180×17=3060D=0BF4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论