讲义第七章汇编语言与汇编程序_第1页
讲义第七章汇编语言与汇编程序_第2页
讲义第七章汇编语言与汇编程序_第3页
讲义第七章汇编语言与汇编程序_第4页
讲义第七章汇编语言与汇编程序_第5页
已阅读5页,还剩125页未读 继续免费阅读

下载本文档

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

文档简介

1、 本章结合8086微处理器的指令系统学习,掌握指令系统相关知识,如寻址方式、各种指令的运用,通过学习,要求学生能够用所学指令编程实现较简单的程序设计,分析现有程序的功能,完成已知程序的查错与填空等。本章教学目的本章学习要求1.掌握8088CPU的寻址方式;立即寻址,直接寻址,寄存器寻址,寄存器间接寻址,变址寻址,基址变址寻址方式中操作数寻址过程;指令的构成,指令操作数有效地址(EA)的形成;间接寻址和基址变址寻址方式中寄存器的约定,段基数及操作数地址的确定;8088指令系统中数据传送,算术运算,逻辑运算,控制传送指令的含义及操作过程及算术和逻辑运算对标志位的影响。 主要内容 符号指令中的表达式

2、 寻址方式 常用指令 常用伪指令 DOS系统功能调用指令是让计算机完成某种操作的命令,指令的集合称作指令系统。指令系统是软硬件之间的界面和桥梁,软件通过指令驱动硬件实现某种功能。基本概念计算机能够直接识别的是二进制编码形式的机器指令,用助记符表示的指令称为汇编语言指令。汇编语言指令与机器指令具有一一对应关系。7.1 符号指令的表达式汇编语言中定义的符号: 常数、变量和标号 常数、变量和标号是汇编语言能识别的数据项。一个数据项往往包含数值和属性两部分,这两部分对于一条语句汇编成目标代码都有直接关系。符号定义必须遵循下列规则:符号由字母(az,AZ)、数字(09)或某些特殊字符(,-,?)组成。第

3、一个字符必须是字母(az,AZ)或某些特殊的符号(,-,?),但“?”不能单独作标识符。以字母开头的十六进制数为和符号区别,要在前面添加一个前导 0。下面是有效的标识符:START:MY-CODE:?MORE350:BETA1:DELAYIS:下面是无效的标识符:4LOOP:START3:GAMA1:NUM+1:?:ONE*TWO:常数: 常数是没有任何属性的纯数值,在汇编期间,它的值已能完全确定,且运行中,它也不会发生变化。它有以下几种类型: 二进制数:以B结尾 十进制数:以D结尾(可以省略) 十六进制数:以H结尾字符串常数:用引号扩起来的一个或多个字符,它们以ASCII码形式存储在内存中。

4、如“AB”,在内存中就是41H、42H。常数的定义:由伪指令EQU 或 =号定义 PI EQU 314标号: 标号是一条指令目标代码的符号地址,后面跟冒号与指令操作符分离。 用PROC 和ENDP定义的过程名,也是标号。NEXT: MOV AL , SI ADD AL , DI ABC PROC FAR 标号具有3个属性:段属性、偏移量属性、类型。 段属性:表示该标号的段起始地址,且该地址一定是CS段 类型:有远(FAR)、近(NEAR)两种,分别区别标号所代表的指令与使用该标号做目标地址的控制转移指令是否位于同一代码段中若是,则为NEAR类型,否则为FAR类型。变量: 变量是代表存放在某些存

5、储单元的数据,这些数据在程序运行期间可以随时修改。为了便于对变量的访问,它常常以变量名的形式出现在程序中,它可以认为是存放数据的存储单元的符号地址。 一般是在除代码段以外的其他段中用伪指令进行定义。 变量经常作为操作数出现在各种语句中,定义变量实际上就是给变量分配内存单元。 变量的定义(1)字节定义伪指令 名字DB表达式或数据项表 表达式值或项表中的每一项是一个字节数,它们从符号名地址开始按字节连续存放,直到表中数据项结束。 例如: DATA1 DB 50H,50 DATA2 DB?,? STRING1 DB ABCDEF DATA3DB20HDUP(?)?(只保存内存空间,未定义初始值);D

6、UP 子句,其格式为:重复次数 DUP (操作数,操作数),DUP子句可以嵌套。DB 100 DUP(0)DW 2 DUP(3 DUP (0,1) 第一条语句定义了100个字节,初值均为0;第二条语句相当于“DW 0,1,0,1,0,1,0,1,0,1,0,1”,即定义了12个字单元,其初值为0、1、0、1、0、1。 (2) 字定义伪指令名字DW表达式或数据项表 除表达式值或项表中的每一项是两个字节数之外,其它与DB伪指令相同。例如: DA_WORDDW 0A3F1H,4981H DA_W DW ?,? D_W1 DW 10HDUP(4)(3) 4字节定义伪指令 DD (4) 8字节定义伪指令

7、 DQ(5) 10字节定义伪指令 DTDA1DB 10H,52HDA2DW 1122H,34HDA3DD 5*20H,0FFEEH DAT1 DB 1 ;定义字节变量,并相应赋初值 DAT2 DB 3 DAT3 DB 20 MOV AL,DAT1 ADD AL,2 ;“ADD将在程序运行时进 ;行,结果(AL)123 MOV AL,DAT1+2 ;将DAT1单元后的第二个单元的值(即DAT3的值)送到AL中,程序运行后(AL)=20。 变量具有3个属性:段属性、偏移量属性、类型属性。 (1)段属性:该内存单元所在段的首址 (2)偏移量:该内存单元在段内相对于首址的距离 (3)类型:该内存单元所

8、存放的数据长度,可能是字节(BYTE)、字(WORD)、双字(DWORD)、三字(FWORD)、四字(QWORD)、十字节(TBYTE)等类型,分别占1、2、4、6、8、10个单元。分析运算符 分析运算符也经常称作数值返回运算符,包括OFFSET、TYPE、LENGTH、SIZE等,它们加在变量或标号前,返回运算对象的某个参数值,例如偏移地址值、段地址值、类型属性、变量包含的单元数等。(1) OFFSET 格式:OFFSET 变量或标号 OFFSET返回标号或变量的偏移地址值,为程序设计中常用的运算符。(2) SEG格式:SEG 变量或标号SEG用来取变量或标号的段基址。(3) TYPE。 格

9、式:TYPE 变量或标号 TYPE加在变量前,返回变量的类型属性,TYPE加在标号前,返回标号的距离属性。(4) LENGTH。 格式:LENGTH 变量 当变量中使用DUP时,LENGTH返回此变量所包含的单元数,对其他变量则返回1。(5) SIZE。 格式:SIZE 变量 SIZE 运算符加在变量前,返回该变量包含的总字节数。 比较SIZE、LENGTH和TYPE运算符的定义,可知有:SIZE 变量(LENGTH 变量)*(TYPE 变量)华中科技大学出版社 DSEG SEGMENT BUFF DW 10DUP(1234H),10H,00H COUN DD 12345678H DSEG E

10、DNS则:SEG BUFF=DSEG SEG COUN=DSEG ;取段基址OFFSET BUFF0000H OFFSET COUN=0018H ; 取偏移量TYPE BUFF2(字) TYPE COUN4(双字) ; 取类型LENGTH BUFF10 LENGTH COUN=1 ;取DUP次数SIZE BUFF=2*10:20 SIZE COUN=4*1=4 ; 取字节数 PTR 临时改变类型属性地址表达式类型的变更华中科技大学出版社 DAT1 DB 1 ;定义字节型变量 DAT2 DB 3 MOV AL,DAT1 ;执行后(AL)01H MOV AX,WORD PTR DAT1 ;执行后(

11、AX)=0301H 汇编语言指令格式: 标号:指令助记符 操作数 ;注释 指令助记符 目的操作数, 源操作数 MOV AX , 0189H 7.2 符号指令的寻址方式标号是给该指令所在地址取的名字,后跟冒号“:”,可选。指令助记符指令名称的代表符号,英文单词缩写。它是指令语句中的关键字,不可缺省,表示本指令的具体操作,如传送、运算、移位、跳转等。操作数是参加指令运算的数据,有些指令不需要操作数;有些指令需要两个操作数,这时必须用逗号(,)将两个操作数分开;有些操作数可以用表达式来表示。操作数可以是一个具体的数值,可以是存放数据的寄存器名称,或指明数据在主存位置的存储器地址。指令系统设计了多种操

12、作数的来源,寻找操作数的过程就是操作数的寻址方式。操作数采取哪一种寻址方式,会影响机器运行的速度和效率。按指令格式,一条指令可占一到六个字节,从形式上可分单操作数,双操作数,无操作数。双操作数指令不能同时为存储器操作数 。1.立即数寻址指令所需的操作数( 8位或16位)直接出现在指令中。MOV AL,80H;将十六进制数80H送入ALMOV AX,1090H;将1090H送AX,AH中为10H,AL中为90HB0 80B8 90 10机器码:操作码 操作数采用立即数寻址方式的指令主要用来对寄存器赋值。因为操作数可以从指令中直接取得,不需要运行总线周期,所以,立即数寻址方式的显著特点就是速度快。

13、立即数可以为8位,也可以为16位;规定立即数只能是整数,不能是小数、变量或者其他类型的数据;另外还要注意,立即数只能作为源操作数。2. 寄存器寻址以寄存器的内容作为操作数,在指令中可用寄存器名指出操作数的位置。即寄存器寻址方式。对16位操作数来说,寄存器可以为AX,BX,CX,DX,SI,DI,SP或者BP,例如:INCCX;将CX的内容加1ROLAH,1;将AH中的内容循环左移一位采用寄存器寻址方式的指令在执行时,操作就在CPU内部进行,不需要使用总线周期,因此,执行速度快。3. 直接寻址指令直接给出操作数的有效地址,此时的操作数总是在存储器中,是对存储器进行访问可采用的最简单的方式。例如:

14、MOV AX,1070H采用直接寻址方式时,如果指令前面没有用前缀指明操作数在哪一段,则默认为段寄存器是数据段寄存器DS。例如,上一条指令执行时,设DS2000H,则执行过程是将绝对地址为21070H和21071H两单元的内容取出送AX。;将当前DS段的1070H和1071H两单元内容取到AX中如果要对其它段寄存器所指出的存储区进行直接寻址,则本条指令前必须用前缀指出段寄存器名。例如: CS:MOV BX,3000H ;将CS段的3000H和3001H两单元的内容送BX设CS为5100H,则本指令在执行时,将54000H和54001H两单元的内容取出送BX。直接寻址方式演示MOV AX,DS:

15、2000HMOV AX,DS:2000H 4.间接寻址以寄存器的内容作为操作数的地址采用寄存器间接寻址方式时,操作数一定在存储器中,存储单元的有效地址由寄存器指出,这些寄存器可以为BX,BP,SI和DI之一,即有效地址等于其中某一个寄存器的值:(1)以BX、SI、DI寄存器进行间接寻址用BX、SI、DI寄存器进行间接寻址时,默认的段寄存器为DS,因为BX称为基址寄存器。例如: MOV AX,BX 设DS5000H,BX3000H则本指令在执行时,将53000H和53001H两单元的内容送AX。如果要对其它段寄存器所指的区域进行寻址,则必须在指令前用前缀指出段寄存器名。例如:ESMOV CX,B

16、X 设ES3000H,BX4000H,则本指令在执行时,将34000H和34001H两单元的内容送CX。例:MOV BX,DI (DS)=6000H (DI)=2000H (BX)=?6000H2000HDSDI6 0 0 0 02000+6 2 0 0 0.AOH50H.62000H50HA0HBLBH数据段(2)以BP寄存器进行间接寻址如果以寄存器BP对操作数进行间接寻址,操作数默认在堆栈段中,该寻址方式通常称为堆栈段基址寻址。例如:MOV BX,BP 设SS5000H,BP4000H,则将54000H和54001H两单元的内容送BX。5 基址寻址 变址寻址 基址变址寻址基址寻址:基址寄存

17、器变址寻址: 变址寄存器操作数的有效地址为寄存器的内容和指令中指定的位移量之和基址变址址寻址: MOV AX,BX+DATA 设DS=2000H,BX=0220H,DATA=05H 则:AX=20225H MOV AX, COUNT BP或MOV AX, COUNT+BP或MOV AX, COUNT+BP COUNT为16位位移量。指令执行前: (SS)=5000H, (BP)=3000H,COUNT=2040H, 寄存器相对寻址方式MOV AX,COUNTBPOPOP40H20H.48H55H.55H48H存储器操作码位移量COUNT代码段堆栈段55040H50000HAHAL指令执行后:E

18、A=5040H(AX)=5548H利用该寻址方式对于一维数组的访问DS数据段12H34H56H78H9AHMOV AL,0024HSI0024H(SI)=0(AL)=12H(SI)=1(AL)=34H(SI)=2(AL)=56H(SI)=3(AL)=78H(SI)=4(AL)=9AHEA=24H+(SI)(SI)可看作数据起始单元的偏移量数组内某元素距数组起始单元的偏移通过修改SI可遍历整个数组 MOV AX,BX+SI 或 MOV AX,BXSI设DS1000H,BX5000H,SI2000H,则有效地址为7000H,将17000H和17001H两单元的内容取到AX中。基址变址的寻址方式中,

19、允许两个地址分量分别改变,而且有一个对段寄存器的约定规则:如果基址寄存器用BX,则默认的段寄存器为DS;如果基址寄存器用BP,则默认的段寄存器为SS;该寻址方式使用起来很灵活,特别是为堆栈中数组的访问过程提供了极大的方便。MOV BP , 0000HMOV SI , 0100HMOV AL, BP+SIINC SI循环MOV BP , 0100HMOV SI , 0000HMOV AL, BP+SIINC SI循环MOV AX, MASKBXDIMOV AX, MASK BX+DIMOV AX,MASK+BX+DI 相对基址加变址MOV AX, MASK+BX+DI几个应该注意的问题:在一条指

20、令中,若有两个操作数,可以采用不同的寻址方式,也可以采用相同的寻址方式。例如:ADD AX,3064H MOV AX ,CX“”:汇编语言中,将“”方括号中的内容作为存储单元的地址。如:BX、DI、2056H除立即数寻址和寄存器寻址外,其他寻址方式都有隐含的段寄存器,操作数实际的物理地址是由段寄存器的内容和指令码中求得的有效地址的相加来求得。同一寻址方式有时可有不同的表示形式:MOV AX,BXSI MOV AX,BX+SIMOV AX,COUNTSI MOV AX,SI+COUNTMOV AX,WNUMBXSI MOV AX,WNUMBX+SIMOV AX,BX+SI+WNUMCOUNT和W

21、NUM是事先定义的标识符(数值)1、下列指令源操作数和目的操作数的寻址方式分别是什么?(1) MOV DX,100H(2) MOV BX,0100H(3) MOV CX,DATASI(4) MOV ES:SI,AX(5) ADD AX,BXDI(6) AND AX,BX(7) XOR AX,BX(8) MOV AL,DATABPDI课堂练习题2、现有(DS)=2000H,(BX)=0100H,(SI)=0002H, (20100H)=12H,(20101H)=34H,(20102H)=56H, (20103H)=78H,(21200H)=2AH,(21201H)=4CH, (21202H)=0

22、B7H,(21023H)=65H,下列指令执行后填入AX寄存器的内容:(1)MOV AX,1200H; (AX)= (2)MOV AX,BX; (AX)= (3)MOV AX,1200H; (AX)= (4)MOV AX,BX; (AX)= (5)MOV AX,1100HBX; (AX)= (6)MOV AX,BXSI; (AX)= (7)MOV AX,1100HBXSI;(AX)= 7.3.1 传送类指令传送类指令是指令系统中最活跃的一类指令,也是条数最多的一类指令,主要用于数据的保存及交换等场合。传送类指令可以分为4种:通用数据传送指令目标地址传送指令标志位传送指令I/O数据传送指令7.3

23、 常用指令指令类型指令格式指令功能状态标志位备注O S Z A P C通用数据传送MOV 目标,源PUSH 源POP 目标XCHG 目标,源XLAT传送字节或字字压入堆栈字弹出堆栈交换字节或字字节翻译 . . . . . . 源:R、M、立即数 目标:R、M源:R、M目标:R(CS除外)、M源:通用R、M 目标:通用R、M目标地址传送LEA 目标,源LDS目标,源LES目标,源装入有效地址装入数据段指针到DS装入附加段指针到ES 源:内存操作数 目标:16位通用R源:内存操作数 目标: 16位通用R源:内存操作数 目标: 16位通用R标志位传送LAHFSAHFPUSHFPOPF把FR低字节装入

24、AH把AH内容装入FR低字节把FR内容压入堆栈从堆栈中弹出FR内容 I/O数据传送IN 累加器,端口OUT 端口,累加器输入字节或字输出字节或字 累加器:AL或AX端口:地址0255或间址寄存器DX 说明: 表示运算结果影响标志位, 表示运算结果不影响标志位。通用数据传送指令包括:1传送指令MOV2数据交换指令XCHG3查表转换指令 XLAT4. 堆栈操作指令PUSH和POP 1. 最基本的传送指令MOVMOV指令是形式最简单、用得最多的指令。它可以实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给CPU的内部寄存器或内存单元。语句格式:MOV OPD,OP

25、S功能:将源操作数传送入目的地址,源地址内容不变。即(OPS)OPD。对标志位的影响:无MOV指令所允许的数据传送路径及类型例如:MOV AL,BLMOV ES,DXMOV AX,BXMOV DI,AXMOV CX,1000HMOV BL,40HMOV DX ,5040HMOV WORD PTRSI,6070H说明:(1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数 MOV seg ,seg ;错误 MOV mem ,mem ;错误 (2)立即数不能传送到段寄存器中。 MOV seg ,imm ; 错误(3)目的操作数不允许使用CS段寄存器。(4)指令指针IP,不能作为MOV指令的

26、操作数(5)dest与src必须类型匹配,即同时是字节或字类型。(6)MOV指令不影响标志寄存器的值。 寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。若立即数没有明确的类型,将立即数扩展为与目的操作数位数相同。有时不能确定内存操作数的类型,需要用byte ptr和word ptr明确指出是字节或字类型。例:错误的MOV 指令如下所示:MOV AX,BL MOV DS,1000HMOV BX ,SIMOV ES,CSMOV CS,AX例:设B是已定义的字节变量,判断指令的正确性。MOV AX,B MOV AL,0 ;类型不匹配;不允许立即数送段寄存器;不允许内存操作数之间传送;不允许

27、段寄存器之间传送; CS不能作为目的操作数;错误,类型不匹配;正确,可以判断出要送字节0用MOV指令实现两内存字节单元内容的交换,要求使用直接寻址和寄存器寻址两种方式来实现。 2035H 2045H 01H . 02H MOV BL, 2035H; MOV CL,2045H; MOV 2045H,BL; MOV 2035H,CL; HLT用直接寻址方式实现用寄存器间接寻址方式实现 MOV SI , 2035H; MOV DI, 2045H; MOV AH, SI; MOV AL, DI; MOV 2035H,AL; MOV 2045H,AH;2.交换指令交换指令XCHG可以实现字节交换,也可以

28、实现字交换。格式: XCHG DEST ,SRC;交换过程可以在CPU的内部寄存器之间进行,也可以在内部寄存器和存储单元之间进行,但不能在两个存储单元之间执行数据交换过程。例如:XCHGAL,BL ;AL和BL之间进行字节交换XCHGBX,CX ;BX和CX之间进行字交换XCHG2530,CX ;CX中的内容和2530,2531两单元的内容交换3.查表指令XLAT是一条完成字节翻译功能的指令,它可以使累加器中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。语句格式:XLAT功能:将(BX)为首址(AL)为位移量的字节存储单元中的数据送AL寄存器。即(BX+AL)AL。使用换码指令

29、时,要求BX寄存器指向表的首地址,AL的内容为表中某一项与表格首地址之间的偏移量,指令执行时,会将BX和AL中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到AL中去。XLAT指令就是通过查表方式来完成翻译功能的,因此,在执行该指令之前,必须建立好一张翻译表,该表的最大容量为256字节。 数据存放在偏移地址为2000H开始的内存中,取出“3”所对应的7段码,用如下几条程序助记符即可完成: C0 F9 A4 B0 99 92 200020012002200320040到F的字段码表MOVBX,2000HMOVAL,3XLAT堆栈作用:在调用一个过程时,保存返回地址;暂时存放寄存器

30、或存储器单元操作数的内容。4.堆栈操作指令进栈 PUSH SRC ;操作:(SP) (SP)-2 (SP)+1,(SP) (SRC)出栈 POP DST ;操作: (DST)(SP)+1,(SP) (SP) (SP)+2执行PUSH AX堆栈SS:01F8SS:01FASS:01FCSS:01FE AABB 1101试分析如下指令执行后,SP的变化情况: PUSH AX AXSP(执行POP AX)试分析如下指令执行后,SP的变化情况: POP AX堆栈SS:01F8SS:01FASS:01FCSS:01FESPAA BB(执行PUSH AX之后)1101H AX例如,将16位通用寄存器CX的

31、内容压入堆栈,然后,弹出栈顶至CX中已知:(SS)0200H, (SP)0008H, (CX)12FAH。5 目标地址传送指令这是一类专用于传送地址码的指令,可用来传送操作数的段地址或偏移地址,共包含以下3条指令:LEA、LDS、LES1取有效地址指令 LEA2取偏移地址及数据段首址指令 LDS3取偏移地址及附加数据段指令 LES (1).取有效地址指令语句格式: LEA OPD,OPS功能:将存储器地址送到一个寄存器,主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定寄存器。LEA指令格式中,要求源操作数必须为内存单元地址,目的操作数必须为一个16位的通用寄存器。这条指令常用来使一个寄存

32、器作为地址指针。例如:LEAAX,2728 ;将2728单元的偏移量送AX,指令执行后,AX中 为2728LEABX,BP+SI;指令执行后,BX中的内容为BP+SI的值 LEASP,0482 ;使堆栈指针SP为482问题: LEA指令与MOV指令有何区别?LEA 指令与MOV 指令的区别:LEA SI,BUFF 将标号BUFF的偏移地址送入寄存器中;MOV SI,BUFF 将标号BUFF所指存储单元的内容送入SI。BUFF =0123454800FEFFLEA SI,BUFF;执行后:(SI)=0002H段起始地址MOV SI,BUFF;执行后:(SI)=0048H (2).将两个字的存储器

33、单元装到DS和另一个寄存器的指令语句格式:LDS OPD,OPS功能: LDS指令的功能是把4个字节的内存单元内容传送到两个目的寄存器,其中,后两个字节即段地址一定送到DS中。57H13H68H24HDS:2480HDS:2481HDS:2482HDS:2483H 13 57 SI 24 68 DSLDS SI,2480例:(DS)=C000H,(C2480H)=1357H,(C2482H)=2468H(3).将两个字的存储器单元装到ES和另一寄存器的指令语句格式:LES OPD,OPSLES指令与LDS指令的操作基本相同,所不同仅在于将源操作数所指向地址指针中的段基址(后两个字节)传送到ES

34、段寄存器,而不是DS段寄存器。6 标志位传送指令(1).读取标志指令语句格式:LAHF功能:将标志寄存器的低8位送入AH寄存器。该指令的执行对标志位无影响。(2).设置标志指令SAHF语句格式:SAHF功能:将AH的内容送入标志寄存器的低8位,高8位不变。从该指令功能可看出,SAHF为LAHF的逆过程。(3).对标志寄存器的压入堆栈指令和弹出堆栈指令PUSHF指令将标志寄存器的值压入堆栈顶部,同时,堆栈指针SP的值减2,此指令在执行时标志寄存器的值不变。POPF指令的功能正好相反,此指令在执行时从堆栈中弹出一个字送到标志寄存器中,同时堆栈指针SP的值加2。PUSHF和POPF指令一般用在子程序

35、和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。7 输入/输出数据传送指令1输入指令IN2输出指令OUTCPU外设外设I/OI/O1输入指令IN输入指令用来从指定的外设端口寄存器取信息送入累加器。它有四种形式:(1)语句格式:INAL,PORT (2)语句格式:INAX,PORT(3)语句格式:INAL,DX(4)语句格式:INAX,DX PORT指端口号,即端口寄存器地址。2. 输出指令OUT输出指令用来把累加器的内容送往指定的外设端口寄存器,它有四种形式:(1)语句格式:OUTPORT,AL (2)语句格式:OUTPORT,AX (3)语句格式:OUTDX,AL (4)语句格

36、式:OUTDX,AX 直接IN指令(口地址只能 8 位) IN AL ,50H IN AX ,80H间接IN指令(口地址是16 位,也可8 位) MOV DX,0FFF2H IN AL ,DX 直接OUT指令(口地址只能 8 位) OUT 44H , AL OUT 70H , AX间接OUT指令(口地址是16 位,也可8 位) MOV DX,87FEH MOV DX ,80H MOV AL ,40H OUT DX ,AL OUT DX ,AL7.3.2 加减运算指令86系列 CPU指令系统中,具有完备的加、减、乘、除算术运算指令,可处理不带符号或带符号的8/16位二进制整数,以及不带符号的装配

37、型/拆开型十进制整数。数据操作类指令包括以下几种类型的指令:算术运算指令加法指令减法指令乘法指令除法指令BCD码运算(十进制调整)指令1.加法指令不带进位的加法 ADD格式: ADD DEST,SRC 功能: DEST+SRC DEST 带进位的加法 ADC格式: ADC DEST,SRC 功能: DEST+SRC+CF DEST 加 1 指令 INC格式: INC DEST 功能: DEST+1 DEST (不影响CF) 说明:SRC:立即数、通用REG、M三种寻址方式,DEST:通用REG、M两种寻址方式。立即数不能做目的操作数,DEST,SRC不能同为存储器寻址方式类型要一致,段寄存器不

38、能做操作数。这三条指令运算结果将影响状态标志位,但是INC指令不影响标志CF。例如:ADDAL,50H ; AL和50H相加,结果放在AL中ADDDI,SI ; DI和SI的内容相加,结果放在DI中ADD BX+DI,AX; BX+DI和BX+DI+1两个存储单元的内容和AX ; 中的内容相加,结果放在BX+DI和BX+DI+1所 ;指的存储单元中例如:ADCAX,SI ; AX和SI中的内容以及CF的值相加,结果放在AX中ADCDX,SI; SI和SI+1所指的存储单元的内容和DX的内容 ;以及CF的值相加,结果放在DX中例如:INCAL ; 将AL中的内容加1INCBYTE PTRBX+D

39、I+500; 将BX+DI+500所指的存储单元的内容加1试编写程序实现两个4字节的无符号数相加,这两个数分别存放在2000H和3000H开始的存储单元中,低位在前,高位在后,进行加法运算后得到的和2000H开始的内存单元中。 CLCMOVSI,2000HMOVAX,SIMOVDI,3000HADDAX,DIMOVSI,AXMOVAX,SI+2ADCAX,DI+2MOVSI+2,AX2.减法指令不带借位减法 SUB格式:SUB DEST,SRC; 功能:DEST - SRC DEST带借位减法SBB减 1 指令DEC求补指令NEG格式: NEG DEST; 功能:0 - DEST DEST比较

40、指令 CMP格式: CMP DEST,SRC; 功能:DEST - SRC(只影响标志位,不回送结果) 以上五条指令均可作字或字节运算,而且除DEC不影响CF外,其他都按一般规则影响状态标志位 。例如:SUBBX,CX ; 将BX中的内容减去CX中的内容,结果放在BX中SUBBP+2,CL; 将SS段的BP+2所指的单元中的值减去CL ; 中的值,结果放在BP+2所指的堆栈单元中例如:SBBAX,2030H; 将AX的内容减去立即数2030H,并减去进位位CF的值SBBWORD PTR DI+2,1000H; 将DI+2和DI+3所指的单元的内容减去数1000H,并减去CF 的值,结果放在DI

41、+2和DI+3所指的单元中例如:NEGAL; 将AL中的数取相反数,送回ALNEGCX; 将CX中的数取相反数,送回CX例如:CMPAX,2000H; 将AX的内容和2000H相比较,结果影响标志位 CMPAX,BX+DI+100; 将累加器和两个存储单元的数相 ;比,单元地址由BX+DI+100和 ; BX+DI+101指出CMPDX,DI; 将DX和DI的内容相比CMP指令后面经常会有一条条件转移指令,用来检查标志位的状态是否满足了某种关系将目的操作数的每一位求反(包括符号位)后加1,结果送目的地址。因为对一个操作数取补码相当于用0减去此操作数,所以NEG指令执行的也是减法操作。NEG 求

42、补3.乘法指令乘法运算是双操作数运算,但是,在指令中却只指定一个操作数,另一个操作数是隐含规定的。其中的操作数可以是寄存器操作数或存储器操作数,而隐含的为AL或AX。指令格式:无符号数乘法 MUL SRC ;(AX) (AL)*(SRC)字节乘法 ;(DX,AX) (AX)*(SRC)字乘法带符号数乘法 IMUL SRC;操作同上进行字节运算时,目的操作数必须是累加器AL,乘积在寄存器AX中。进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DX,AX中。例如:MOV AL,0A3H;(AL)=0A3HMOV BL, 11H;(BL)=11HMUL BL ;(AX)=0AD3H注: 乘法指

43、令运算结果只影响状态标志CF、OF。 SRC只能是通用REG或M寻址,不能是立即数。 只能是字节乘字节或字乘字。 存储器寻址时加类型说明,如 MUL BYTE PTR BX, MUL WORD PTR BX4.除法指令指令格式:无符号数除法 DIV SRC 带符号数除法 IDIV SRC 在除法运算中,如果除数是8位的,则要求被除数是16位的;如果除数是16位的,则要求被除数是32位的。注:当除数是字节数据时,被除数必须放在AX中;当除数是字数据时,被除数必须放在DX,AX中。除法指令运算结果对状态标志无定义。8086/8088规定IDIV指令运算结果余数的符号与被除数相同。当被除数位数不够时

44、,需扩展到所需的位数,带符号数需进行符号位扩展。符号扩展指令:字节扩展到字 CBW;将寄存器AL中的符号位扩展到寄存器AH字扩展到双字 CWD;将寄存器AX中的符号位扩展到寄存器DX70AL70AH015AXDX150CBWCWD7.3.3 逻辑运算和移位指令逻辑运算和移位指令逻辑运算指令移位指令循环移位指令 1.逻辑运算指令求反指令NOT 逻辑乘指令AND测试指令TEST 功能:和AND指令执行同样的操作,但不送回操作结果,只影响标志位。逻辑加指令OR按位加指令XOR AND,OR和XOR指令都是双操作数指令,即可对8位数操作,也可对16位数操作当有两个操作数时,不能同时都为存储器操作数无论

45、是目的操作数,还是源操作数,都不能是段寄存器。AND指令主要用来屏蔽掉一个数中某些位。AND AX,BX AND AL,1111 0000B例:OR指令在两个操作数相对应位中有一个是1或两个都是1时,在目的操作数的该位产生一个1。例:OR BX,0C000BXOR指令主要用于判断两个操作数中哪些位是不同的。如两个操作数相对应位的值不同时,在目的操作数产生一个1。相同为0,不同为1。例:XOR BX,0C000B XOR AX,AXNOT指令的操作数只有一个,它求出指令所给的操作数的反码,再送回。例: NOT AXNOTALNOTBXNOTWORD PTR1000HNOT指令改变寄存器或存储单元

46、的每一位状态,原来为0变为1,原为1变为0。TEST指令是一条测试指令,它执行的操作与AND相同,不过它不送回结果,只影响标志位。例如:TESTAX,8000H; 如AX的最高位为1,则ZF0,否则ZF1TESTAL,01; 如AL的最低位为1,则ZF0,否则ZF12.移位与循环移位指令(1) 非循环移位指令:算术左移 SAL格式:SAL 目标,计数值 (目标:通用REG、M,计数值:1或CL,移位次数)功能:将目标操作数算术左移计数值指明的位数。 算术右移指令 SAR逻辑左移 SHL逻辑右移指令 SHR注:当 计数值n = 1时,1 写在指令中,如常SHL AL,1当 n大于 1 时,将计数

47、值 n 写入CL,再把CL写入指令,如 MOV CL ,3 SHL BX,CL这类指令都把CF看做第 9 位或第 17 位参加运算。算术移位是对带符号数,逻辑移位是对无符号数而言。SAL要判断OF,OF = 1结果无效(符号变),SAR要保持符号位不变。例: 将两个非压缩BCD码(高位在BL,低位在AL)合并成压缩BCD码送AL。 MOV CL,4 ;将计数值送CL SHL BL,CL ;将高位移到BL的高4位 AND AL,0FH ;清零AL高4位 OR AL,BL ;合并AL和BL形成压缩BCD码。(2) 循环移位指令:不带进位位的循环左移指令ROL语句格式:ROL OPD,1或ROL O

48、PD,CL不带进位位的循环右移指令ROR语句格式: ROR OPD,1或ROR OPD,CL带进位位的循环左移指令RCL带进位位的循环右移指令RCR循环移位指令在执行后,溢出标志OF可以表示数据的符号是否发生改变。注意:循环移位指令的操作数可以是寄存器,也可以是存储单元。可以是字节,也可以是字。如果循环移位指令只移动1位,则在指令中直接指出,如果要移动若干位,则必须在CL中指定移动位数。例如:ROLBX,1 ; BX中的内容不带进位位循环左移1位ROLWORD PTR DI,CL; DI和DI+1所指单元中的;数不带进位位循环左移几位; CL中为移动次数例:分析下面的程序段所实现的功能SALA

49、L,1 ; MOVBL,AL;MOVCL,2 ;SALAL,CL; ADDAL,BL; 将AL中数左移1位,得2X 2X保存在BL中 移位次数置入CL中 2X左移2位,得8X 2X加上8X,所以AL中为10X7.3(补) 控制类指令控制类指令包括程序转移指令和处理机控制指令。凡属能改变指令执行顺序的指令,统称为程序转移指令。86系列指令系统中,程序转移指令可分成4种类型无条件转移类指令(JMP,CALL,RET)条件转移类指令(JA,JAE,JB,JBE;JG,JGE,JL,JLE;JC,JNC,JZ,JNZ,JO,JNO,JP,JNP,JS,JNS)循环控制类指令(LOOP,LOOPZ,LO

50、OPNZ,JCXZ)中断类指令(INT,INTO,IRET)一、程序转移的地址1、转移距离:(1)段间转移:CS:IP同时改变(转移距离一般超过64K)。用FAR来表示。(2)段内转移:CS保持不变,只改变IP。用NEAR来表示。(3)短转移:CS保持不变,转移距离在-128127之内的。用SHORT来表示。2、转移目标地址的给定:直接转移:转移的目标地址信息直接出现在指令的机 器码中。间接转移:转移的目标地址信息间接地存储于某一个寄存器中或某一个内存变量中。3、转移方式: 绝对转移:给出目的地的绝对地址,令IP=该地址。 如:JMP CX;IP -(CX) 相对转移:将当前IP+/-某一偏移量。如:JNZ 10H; JNZ F0H;二、转移指令1、无条件转移指令JMP格式:JMP 目标地址功能:无条件转移到目标地址。 支持所有转移方式:如: JMP target ,将控制转向目的标号target,即target的偏移地址送IP,target的段首地址送CS。2、条件转移指令:(1)通过判断各标志位进行转移(2)都使用短转移。(超过-128127怎么办?)(3)分有符号数和无符号数进行不同处理。三、循环控制指令1、无条件

温馨提示

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

评论

0/150

提交评论