《微机原理与接口技术》课件09第4章 汇编语言与汇编程序_第1页
《微机原理与接口技术》课件09第4章 汇编语言与汇编程序_第2页
《微机原理与接口技术》课件09第4章 汇编语言与汇编程序_第3页
《微机原理与接口技术》课件09第4章 汇编语言与汇编程序_第4页
《微机原理与接口技术》课件09第4章 汇编语言与汇编程序_第5页
已阅读5页,还剩140页未读 继续免费阅读

下载本文档

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

文档简介

1第4章汇编语言与汇编程序

2

本章主要介绍:8086CPU指令的基本格式及寻址方式;8086指令系统;汇编语言的基本语法;DOS功能调用;汇编语言程序设计的基本方法。重点是8086CPU指令的寻址方式、指令系统和汇编语言程序设计的基本方法。

34.1汇编语言的语法要素

4第4章汇编语言与汇编程序

汇编语言的语法要素有标识符、保留字、常量、数值表达式、标号、变量和地址表达式等。4.1.1标识符标识符是程序中用于指定段名、变量名、符号常量名、标号名等的字符串。和高级语言的变量名一样,一般要求标识符尽可能取得有点含义,这会大大改善程序的可读性,并有助于对程序的理解,标识符的使用要做到“见其名,知其义”。

5第4章汇编语言与汇编程序

4.1.1标识符标识符的命名规则:(1)由字母、数字、专用符号“?”、“.”、“@”、“$”、“_”等字符组成。(2)数字不能作为首字符,“.”只能作为首字符。(3)有效字符为31个。通常情况下,汇编语言不区分标识符中字母的大小写。6第4章汇编语言与汇编程序

4.1.1标识符为了区别标识符和数据,以字母开始的十六进制数,要在其前面添加一个前导0。如8位补码数-1,应写为0FFH。例4.1:试比较ABCDH和0ABCDH之间的差异。前者是标识符,而后者是十六位进制数值。7第4章汇编语言与汇编程序

4.1.2保留字保留字是汇编语言中预留的、具有固定用途的字符串。所有的寄存器名、指令及伪指令的助记符、运算符都属于保留字,编程时不允许作它用。如程序中的DB、MOV、SEGMENT、CX等。

例4.2:MSG1、ERRMSG2、ASC1、asc2等是合法的标识符,而1a、ah、mov等就不是合法的标识符,这些是属于保留字。

8第4章汇编语言与汇编程序

4.1.3常量常量是程序运行中数值不变的量。有数值常量和符号常量。

常量可以数值形式出现在符号指令中,这种常量称作数值常量;

将经常使用的数值预先定义一个名字,然后用该名字来表示该常量,这种常量称作符号常量。9第4章汇编语言与汇编程序

4.1.3常量

数值常量,常用的有二进制数、十进制数、十六进制数和ASCII码字符。ASCII码字符用作数值常量时,需用单引号引起来,如‘B’、‘BC’、‘$’等所有可以打印或显示的ASCII码字符。

符号常量,需使用相应的赋值伪指令EQU或“=”号定义。

例4.3:XEQU212或X=21210第4章汇编语言与汇编程序

4.1.4数值表达式数值表达式由常量与运算符构成。运算符分三类:算术运算符(+、-、×、/、MOD)、逻辑运算符(AND、OR、XOR、NOT)和关系运算符(EQ、NE、LT、GT、LE、GE)3种运算。11第4章汇编语言与汇编程序

4.1.5标号标号是机器指令在内存中的符号地址。汇编语言程序中第一条指令、转移的目标指令和重复执行的指令前面都要加上一个标号,作为转移指令或循环指令的目的地址。标号名也由程序员遵循标识符命名规则命名。标号一般只在代码段中定义和使用,标号代表指令的地址,由标识符和冒号组成。程序开始处的标号,需在代码段结束之后,加上“END标号”,如“ENDSTART”。12第4章汇编语言与汇编程序

4.1.5标号标号有3个属性:段地址、偏移地址和类型。标号的段地址是定义该标号所在段的段地址。标号的偏移地址是标号所在段的段首址到该标号定义指令的字节距离。标号的类型有NEAR和FAR两种。用“:”定义的标号为NEAR类型,NEAR类型的标号只能在定义该标号的段内使用,而FAR类型的标号却无此限制。

13第4章汇编语言与汇编程序

4.1.6变量和地址表达式变量是存储器中的数据或数据区的符号表示。变量名即是数据的地址或数据区的首地址。地址表达式是由变量、常量、寄存器(SI、DI、BX、BP)的内容(用寄存器名置入方括号中表示)和运算符组成的有意义的式子。指令中的存储器的地址可以用变量或地址表达式给出。

14第4章汇编语言与汇编程序

4.1.6变量和地址表达式由于存储器是分段使用的,因此变量或地址表达式都具有3重属性:段地址、偏移地址和类型。变量的段地址是指变量所在段的段首地址除以10H之商。当需要访问该变量时,其段地址一定要在其相应的段寄存器中。变量的偏移地址是指变量所在段的段首址到该变量的字节距离。变量的段地址和偏移地址分别用SEG或OFFSET两个算符来指定,只要在操作数中指定带SEG或OFFSET算符的变量名,就可以分别产生该变量的段地址或偏移地址。例4.4:变量Y的段地址和偏移地址可表示为SEGY和OFFSETY。

15第4章汇编语言与汇编程序

4.1.6变量和地址表达式变量的类型是指存取该变量中的数据所需要的字节数。变量的类型可以是字节(Byte)、字(Word)、双字(Dword)、4字(Qword)和10字节(Tbyte)。变量使用数据定义伪指令DB(定义字节)、DW(定义字)、DD(定义双字)、DQ(定义4字)、DT(定义10字节)来定义。

变量的格式:[变量名]数据定义伪指令表达式[,……]变量名在格式中使用了可选符号[],作为可选项。若无变量名则为定义无名数据区。表达式确定了变量的初值,用户可以根据需求选择单项或多项表达式。16第4章汇编语言与汇编程序

4.1.6变量和地址表达式变量使用的表达式可以是以下几种:(1)数值表达式。(2)ASCII码字符串(只有用DB定义变量时,才允许串长度即引号中的字符数超过2个字符)。(3)地址表达式(只适用DW和DD两个伪指令),如果该地址表达式为一变量或标号名时,用DW定义,则是取其偏移地址来初始化变量,若用DD定义,则是取其段地址和偏移地址来初始化变量。(4)?,表示所定义变量无确定初值。一般用来预留若干字节(或字、双字)存储单元,以存放程序的运行结果。(5)nDUP(表达式),其中DUP(duplicate)为重复字句,n是重复因子(只能取大于等于1的正整数,它表示定义了n个表达式),它俩之间一定要空格,表达式的类型由数据定义伪指令确定。(6)以上表达式组成的序列用逗号分隔。174.2指令格式18第4章汇编语言与汇编程序

指令的格式:操作码[操作数1][,操作数2][,……][,操作数n]操作数字段可以是0个、1个、2个或多个,通常称为零地址、单地址、双地址或多地址指令。在微型计算机中常采用单地址指令和双地址指令,一方面指令代码长度缩短了,另一方面也提高了处理速度。在双地址指令中,分别称两个操作数为源操作数和目的操作数。指令的一般格式是:操作码[目的操作数][,源操作数]194.3寻址方式

20寄存器寻址是指操作数存放在寄存器中,指令中给出寄存器名。例:MOVDX,AX;DX←AX

执行过程如图所示:

特点:

(1)操作数在寄存器中,寄存器在CPU内部,指令执行时,操作就在CPU的内部进行,不需要访问存储器来取得操作数,因而执行速度快。

(2)寄存器号比内存地址短,汇编后机器码长度短。

(3)寄存器寻址方式既可用于源操作数,也可用于目标操作数,还可以两者都用寄存器寻址方式。1.寄存器寻址第4章汇编语言与汇编程序

21

立即寻址即指令中直接给出操作数本身。采用该寻址方式的操作数与指令代码一起存放在代码段中。例:MOVAX,1234H;AX←1234H

注意:立即寻址通常用于双操作数指令中,且只能是源操作数。执行过程如图所示:2.立即寻址第4章汇编语言与汇编程序

223.直接寻址直接寻址即指令中给出操作数所在存储单元的有效地址,缺省的段为数据段。为了区别于立即数,有效地址用[]括起。例:以下指令中源或目标操作数采用了直接寻址方式

(1)MOVAX,[2000H];AX←(DS:2000H)(2)MOV[1200],BL;(DS:1200H)←BL(3)MOVES:[0100],AL;(ES:0100H)←AL

说明:DS:2000表示内存单元地址;

(DS:2000)表示地址是DS:2000的内存单元内容。第4章汇编语言与汇编程序

23【例】设DS=4000H,(42000H)=12H,(42001H)=34H,执行指令MOVAX,[2000H]后,AX=?

①根据指令中给出的有效地址得到存储单元的物理地址:

DS×16+2000H=42000H②把该内存单元开始的两个字节的内容传送到AX中。低地址单元内容传送到AL中,高地址单元内容传送到AH中。AX=3412H

执行过程如图所示:说明:直接寻址允许数据存于附加段、堆栈段、代码段,这称为“段超越”,此时,需要段说明。第4章汇编语言与汇编程序

244.间接寻址

间接寻址是把内存操作数的有效地址存储于寄存器中,指令中给出存放地址的寄存器名。

8086/8088中可用于间接寻址的寄存器有基址寄存器BX、BP和变址寄存器SI、DI。为区别于寄存器寻址,寄存器名要用“[]”括起来。例:MOVAX,[SI];AX←(DS:SI+1,DS:SI)

第4章汇编语言与汇编程序

25有效地址EA计算方法如下:EA=SI SI作间址寄存器。DI DI作间址寄存器。BX BX作间址寄存器。BP BP作间址寄存器。物理地址PA计算方法如下:物理地址=DS×10H+SI或DI或BX或物理地址=SS×10H+BP

注意:不同的寄存器所隐含对应的段不同。采用SI、DI、BX寄存器,数据存于数据段中;采用BP寄存器,数据存于堆栈段中。第4章汇编语言与汇编程序

26【例】设DS=3000H,SI=2000H,(32000H)=50H,(32001H)=40H,执行指令MOVAX,[SI]后,AX=?

①根据指令中给出的寄存器及寄存器内容得到存储单元的物理地址:

DS×16+2000H=32000H②把该内存单元开始的两个字节的内容传送到AX中。低地址单元内容传送到AL中,高地址单元内容传送到AH中。

AX=4050H

执行过程如图所示:第4章汇编语言与汇编程序

275.基址寻址源操作数在存储器中,其偏移地址是指令中指定的寄存器BX或BP的内容与指令中给出的位移量相加之和,段地址同间址。如:

MOV[BX+6],AL或MOV6[BX],AL

该指令的源操作数是寄存器AL,目的地在当前数据段中,目的操作数是DS:[BX+6]。执行的操作是:AL→DS:[BX+6]具体地,若DS=1359H、BX=0124H,则传送数据的地址是1359H:0124H+6=136BAH;该指令执行的操作是将AL的内容送136BAH。第4章汇编语言与汇编程序

28

又如:MOV[BP+6],AX或MOV6[BP],AX

源操作数是寄存器AX,目的地在堆栈段中,目的操作数是SS:[BP+6]。执行的操作是:AL→SS:[BP+6],AH→SS:[BP+7]具体地,若SS=1355H、BP=0030H,则传送数据的地址是1355H:0030H+6=13586H和1355H:0030H+7=13587H;该指令执行的操作是将AL的内容送13586H、将AH的内容送13587H。上述两种写法,即将位移量放在方括号内与放在方括号外,功能是一样的,前者意义明确些,后者上机操作要方便些。5.基址寻址第4章汇编语言与汇编程序

296.变址寻址变址寻址与基址寻址类似,只不过是用SI和DI取代BX和BP。约定的段地址在DS中。

第4章汇编语言与汇编程序

307.基址变址寻址采用基址变址寻址时,操作数的有效地址分为两部分,一部分存于基址寄存器BX或BP中,另一部分存于变址寄存器SI或DI中,指令中分别给出两个寄存器名。操作数的有效地址为:

EA1=BX+SI/DI或EA2=BP+SI/DI

当基址寄存器选用BX时,数据隐含存于数据段中;当基址寄存器选用BP时,数据隐含存于堆栈段中,即操作数的物理地址为:

PA1=DS×10H+EA1或PA2=SS×10H+EA2

第4章汇编语言与汇编程序

31

【例】设SS=3000H,BP=0100H,SI=5,(30105H)=78H,执行指令MOVAL,[BP][SI]后,AL=?

①根据指令中给出的寄存器名及寄存器内容,得到存储单元的物理地址:

SS×16+BP+SI=30105H②把该内存单元中内容传送到AL中。

AL=78H

执行过程如图所示:

7.基址变址寻址第4章汇编语言与汇编程序

32

8086/8088的指令有哪些寻址方式?它们的具体含义是什么?指令中如何表示它们?

8086/8088的指令有7种寻址方式,它们是:(1)寄存器寻址。操作数在指定寄存器中。指令中直接用寄存器名表示。(2)立即寻址。源操作数为常量(立即数)。指令中用数值常量或符号常量表示。(3)直接寻址。操作数在指定的存储器中。存储器的偏移地址用含有变量名的地址表达式或用段名不含变量名的数值表达式表示。

第4章汇编语言与汇编程序

33

8086/8088的指令有哪些寻址方式?它们的具体含义是什么?指令中如何表示它们?

(4)间接寻址。操作数在存储器中,存储器的偏移地址在给定的寄存器中。指令中用置于方括号中的间接寄存器名表示。(5)基址寻址。操作数在存储器中,存储器的偏移地址是基址寄存器的内容与指令给出的位移量之和。指令中用含有基址寄存器(在方括号中)的地址表达式表示。

第4章汇编语言与汇编程序

34

8086/8088的指令有哪些寻址方式?它们的具体含义是什么?指令中如何表示它们?

(6)变址寻址。操作数在存储器中,存储器的偏移地址是变址寄存器的内容与指令给出的位移量之和。指令中用含有变址寄存器(在方括号中)的地址表达式表示。(7)基址变址寻址。操作数在存储器中,存储器的偏移地址是基址寄存器和变址寄存器的内容与指令给出的位移量3项相加之和。指令中用含有基址寄存器和变址寄存器(在方括号中)的地址表达式表示。

第4章汇编语言与汇编程序

354.4常用指令

36

第4章汇编语言与汇编程序

4.4.1数据传送指令1.通用数据传送指令(1)传送指令

指令格式:MOVDST,SRC执行操作:(DST)←(SRC)该指令把源操作数的内容传送到目的操作数。能够完成以下几种传送:37

第4章汇编语言与汇编程序

4.4.1数据传送指令1.通用数据传送指令①CPU内部寄存器之间数据传送;例4.16:MOVAL,BLMOVAX,BX②立即数传至CPU内部的通用寄存器组;例4.17:MOVAL,4MOVAX,0FFC1H③CPU内部寄存器与存储器之间的数据传送;例4.18:MOVAX,[SI]MOVAL,BUFFER④立即数与存储器之间的数据传送。例4.19:MOVBYTEPTRMEM,20H38

第4章汇编语言与汇编程序

和MOV指令一样,任何指令的目的操作数均不能为立即数。此外,大多数指令也应遵循以下规则:

·立即数不能传送至段寄存器;

·存储器之间不能直接传递数据(串除外);

·CS不能作为目的操作数,IP不能参与传送;

·段寄存器之间不能直接传递数据;

·源操作数和目的操作数类型要求一致,源操作数/目的操作数有寄存器则传送长度由寄存器位数决定;源操作数/目的操作数均无寄存器则需限定存储器操作数位数。39

第4章汇编语言与汇编程序

4.4.1数据传送指令1.通用数据传送指令(2)堆栈操作指令

①压入堆栈指令

指令格式:PUSHSRC该指令将指定的寄存器或存储单元的内容压入栈顶。操作数必须为字。指令分两步进行:先SP-1→SP,然后把数据(高位字节)送至SP所指单元;再次使SP-1→SP,把数据(低位字节)送至SP所指单元。40例:SP=2000H,SS=1000H,AX=1234H执行PUSHAX,则堆栈内容与SP如下:

SP=1FFEH3412××SP→1FFE1FFFSP→2000M第4章汇编语言与汇编程序

4.4.1数据传送指令1.通用数据传送指令(2)堆栈操作指令

①压入堆栈指令

指令格式:PUSHSRC该指令将指定的寄存器或存储单元的内容压入栈顶。操作数必须为字。指令分两步进行:先SP-1→SP,然后把数据(高位字节)送至SP所指单元;再次使SP-1→SP,把数据(低位字节)送至SP所指单元。41

第4章汇编语言与汇编程序

4.4.1数据传送指令1.通用数据传送指令(2)堆栈操作指令

②全部通用寄存器内容压栈指令指令格式:PUSHA该指令将将8个16位通用寄存器内容压栈,压栈的顺序为AX、CX、DX、BX、SP、BP、SI和DI。③标志寄存器内容压栈指令指令格式:PUSHF42

第4章汇编语言与汇编程序

4.4.1数据传送指令1.通用数据传送指令(2)堆栈操作指令

④弹出堆栈指令指令格式:POPDST该指令分两步进行:先弹出栈顶数据(低位字节),修改SP,SP+1→SP;再弹出栈顶数据(高位字节),再修改SP,SP+1→SP。⑤全部通用寄存器内容弹出指令指令格式:POPA⑥标志寄存器内容弹出指令指令格式:POPF43

第4章汇编语言与汇编程序

使用堆栈操作指令时应注意:·堆栈操作必须以字为单位;·不影响标志位;·不能用立即寻址方式;·

DST不能是CS。44

第4章汇编语言与汇编程序

4.4.1数据传送指令1.通用数据传送指令(3)数据交换指令

指令格式:XCHGOPR1,OPR2执行操作:(OPR1)←→(OPR2)例4.21:XCHGAL,BH;(AL)←→(BH)45

第4章汇编语言与汇编程序

4.4.1数据传送指令2.地址传送指令(1)传送偏移地址指令

指令格式:LEAREG,SRC执行操作:(REG)←EA(SRC)这条指令的源操作数必须是一个内存操作数,目的操作数必须是一个16位的通用寄存器。该指令通常用来给某个16位通用寄存器设置偏移地址的初值,以便从此开始存取多个数据。例4.22:LEAAX,BUFFER若执行前:AX=1234H,BUFFER=0100H,EA=5678H则执行以后:AX=5678H,BUFFER=0100H46

第4章汇编语言与汇编程序

4.4.1数据传送指令2.地址传送指令(2)传送数据段地址指针指令

指令格式:LDSREG,SRC

执行操作:(REG)←(SRC)(DS)←(SRC+2)

4个相继字节→寄存器(通常是SI)和DS。47

第4章汇编语言与汇编程序

4.4.1数据传送指令2.地址传送指令(3)传送数据段地址指针指令指令格式:LESREG,SRC执行操作:(REG)←(SRC)(ES)←(SRC+2)

4个相继字节→寄存器(通常是DI)和ES。LDS和LES指令完成一个地址指针的传送。地址指针包括段地址部分和偏移地址部分。指令将段地址送入DS或ES,偏移量部分送入到一个16位的指针寄存器或变址寄存器。

48

第4章汇编语言与汇编程序

4.4.1数据传送指令3.查表转换指令指令格式:XLAT[source-table]执行操作:[BX+AL]→AL该指令的操作数都是隐含的,所执行的操作是将BX为基地址,AL为位移量的字节存储单元中的数据送AL即[BX+AL]→AL。在汇编语言中,该指令也可以写作XLATB(B表示字节操作)或XLATBtable(table为表的首地址)。注意:使用换码指令时,字节表格长度不超过256。49

第4章汇编语言与汇编程序

4.4.1数据传送指令4.输入输出指令输入输出指令可以分为两大类:一类是端口直接寻址的输入输出指令;另一类是端口通过DX寄存器间接寻址的输入输出指令。在直接寻址的指令中只能寻址28=256个端口(0~255),而间接寻址的指令中可寻址216=64K个端口(0~65535)。

50

第4章汇编语言与汇编程序

4.4.1数据传送指令4.输入输出指令(1)输入指令①直接寻址的输入指令指令格式:INACC,PORT执行操作:(ACC)←(PORT)此命令是将8/16位数据直接经输入端口PORT(0~255)送入AL/AX累加器中。51

第4章汇编语言与汇编程序

4.4.1数据传送指令4.输入输出指令(1)输入指令②间接寻址的输入指令指令格式:INACC,DX执行操作:(ACC)←(DX)此命令是从DX寄存器内容指定的端口中,将8/16位数据送入AL/AX累加器中。这种寻址方式的端口地址由16位地址表示,执行这条指令前应将16位地址存入DX寄存器中。52

第4章汇编语言与汇编程序

4.4.1数据传送指令4.输入输出指令(2)输出指令①直接寻址的输出指令指令格式:OUTPORT,ACC执行操作:(PORT)←(ACC)此命令是从AL或AX累加器输出8/16位数据到指定的I/O端口中。②间接寻址的输入指令指令格式:INDX,ACC执行操作:(DX)←(ACC)此命令是从AL或AX累加器中输出8/16位数据到由DX寄存器内容指定I/O端口中。

53

第4章汇编语言与汇编程序

4.4.1数据传送指令5.标志传送指令(1)把标志寄存器的低8位传送到AH寄存器的指定位指令格式:LAHF标志寄存器F中低8位包括SF、ZF、AF、PF、CF五个标志位,对应的位是位7、6、4、2和0,而位5、3和1没有定义。例4.26:假定CF=PF=1,ZF=SF=AF=0,执行指令LAFH之后,AH内容为00×0×1×1。54

第4章汇编语言与汇编程序

4.4.1数据传送指令5.标志传送指令(2)把AH寄存器的指定位传到标志寄存器中的S、Z、A、P和C标志位指令格式:SAHF该指令与LAHF指令的操作相反。这条指令是把AH寄存器的内容传送到标志寄存器的低8位。标志寄存器的相应位受到影响,它取决于AH中相应位的状态。本指令对OF、DF、IF和TF无影响。(3)把整个标志寄存器(包括全部九个标志)压入堆栈指令指令格式:PUSHF(4)把栈顶内容弹出到标志寄存器指令指令格式:POPF55

第4章汇编语言与汇编程序

4.4.2算术运算指令1.加法指令(1)加指令ADD指令格式:ADDDST,SRC执行操作:DST←DST+SRCADD指令有如下5种形式:

ADDREG,IMM;REG+IMM→REGADDREG,REG;REG+REG→REGADDREG,MEM;REG+MEM→REGADDMEM,IMM;;MEM+IMM→MEMADDMEM,REG;MEM+REG→MEM56

第4章汇编语言与汇编程序

4.4.2算术运算指令1.加法指令

(2)带进位的加指令ADC指令格式:ADCDST,SRC执行操作:DST←DST+SRC+CFADC指令有如下5种形式:

ADCREG,IMM;REG+IMM+CF→REGADCREG,REG;REG+REG+CF→REGADCREG,MEM;REG+MEM+CF→REGADCMEM,IMM;;MEM+IMM+CF→MEMADCMEM,REG;MEM+REG+CF→MEM57

第4章汇编语言与汇编程序

4.4.2算术运算指令1.加法指令ADD和ADC两指令按执行结果影响状态标志位:当结果的最高位(字节操作是D7,字操作是D15)产生进位,CF=1;否则CF=0。当结果为0时,ZF=1;否则ZF=0。当结果的最高位为1时,SF=1;否则SF=0,即SF总与结果的最高位一致。当结果不在符号数范围:字节运算时不在字节补码数范围(-128~127),字运算时不在字补码数范围(-32768~32767)时,OF=1;否则OF=0。当结果的二进制位1的个数为偶数时,PF=1;否则PF=0。当运算时,D3产生进位,AF=1;否则AF=0。58

第4章汇编语言与汇编程序

4.4.2算术运算指令1.加法指令

(3)增量指令INC指令格式:INCDST执行操作:DST←DST+1使用增量指令时,操作数不得出现二义性。例4.28:INC[SI]是非法的,因为汇编程序不能确定是字节增1还是字增1。可以使用PTR算符使之成为合法指令:INCBYTEPTR[SI]或INCWORDPTR[SI]

注意:段寄存器不能用此命令加1。该指令影响SF、ZF、AF、PF和OF,但对CF没有影响。59

第4章汇编语言与汇编程序

4.4.2算术运算指令2.减法指令

(1)减指令SUB指令格式:SUBDST,SRC执行操作:DST←DST-SRC(2)带借位的减指令SBB指令格式:SBBDST,SRC执行操作:DST←DST-SRC-CF(3)减量指令DEC指令格式:DECDST执行操作:DST←DST-1减法类指令对标志位的影响,除将进位改为借位外与加法类指令相同。60

第4章汇编语言与汇编程序

4.4.2算术运算指令2.减法指令

(4)比较指令CMP指令格式:CMPDST,SRC执行操作:DST-SRC比较指令除了不回送结果外,其他一切均同SUB指令。该指令主要用来判断两数的大小与是否相等。比较指令后面常常是条件转移指令,根据比较的结果实现程序的分支。61

第4章汇编语言与汇编程序

4.4.2算术运算指令3.乘法指令

8086/8088指令系统中有两条乘法指令,可以实现无符号数的乘法和带符号数的乘法,它们只有源操作数,隐含目标操作数。CPU在执行乘法时,一个操作数始终放在累加器中(8位AL;16位AX),这是隐含的。8位数相乘结果16位,存放在AX中,16位数相乘结果32位,存放在DX和AX中。

62

图4-9乘法指令的操作示意图

第4章汇编语言与汇编程序

4.4.2算术运算指令3.乘法指令乘法指令分无符号数乘法指令MUL和带符号数乘法指令IMUL两种。指令格式:MULSRCIMULSRC其中源操作数SRC可以是字节或字,可为寄存器或存储器操作数,不能为立即数。目的操作数是AL或AX,视SRC的类型属性决定是AL还是AX。63

第4章汇编语言与汇编程序

4.4.2算术运算指令3.乘法指令乘法指令对除CF和OF以外的状态标志位无定义(注意:无定义和不影响不同,无定义是指指令执行后这些状态标志位的状态不确定,而不影响则是指该指令的执行不影响状态标志位,因而状态标志应保持原状态不变)。对于MUL指令,如果乘积的高一半为0(即字节操作的AH=0或字操作时DX=0),则CF和OF均为0;否则CF和OF均为1。对于IMUL指令,如果乘积的高一半是低一半的符号扩展,则CF和OF均为0,否则CF和OF均为1。

64

图4-10除法指令的操作示意图

第4章汇编语言与汇编程序

4.4.2算术运算指令4.除法指令除法指令分无符号数除法指令DIV和带符号数除法指令IDIV两种。指令格式:DIVSRCIDIVSRC其中源操作数SRC可以是字节或字,可为寄存器或存储器操作数,不能为立即数。目的操作数是AX或DX和AX。65

第4章汇编语言与汇编程序

4.4.2算术运算指令4.除法指令除法指令所执行的操作是用指令中指定的源操作数SRC除AX中的16位二进制数或DX和AX中的32位二进制数,商放入AL或AX,余数放入AH或DX,如图4-10所示。被除数是AX还是DX和AX,由源操作数是字节还是字确定。除法指令对所有的状态标志位均无定义。

66

第4章汇编语言与汇编程序

4.4.2算术运算指令5.扩展指令①字节扩展指令指令格式:CBW执行操作:如果(AL)﹤80H,则(AH)=00H,否则(AH)=FFH;CBW指令将一个字节(8位),按其符号扩展成字,它是隐含操作数指令,隐含操作数为AL或AH,对状态标志位没有影响。②字扩展指令指令格式:CWD执行操作:CWD指令将一个字(16位)按其符号扩展成双子(32位),它是隐含操作数指令,隐含的操作数为寄存器AX和DX中的值。CWD和CBW一样,对状态标志位没有影响。

67

第4章汇编语言与汇编程序

4.4.2算术运算指令5.扩展指令CWD和CBW指令在带符号的乘法(IMUL)和除法(IDIV)运算中十分有用,常常在字节或字的运算之前,将AL和AX中数据的符号位进行扩展。

68

第4章汇编语言与汇编程序

4.4.2算术运算指令6.BCD数调整指令以上介绍的都是对二进制数进行操作。二进制数在计算机上进行运算是非常简单的。但是人们习惯用十进制数。在计算机中,十进制数是用BCD码来表示的。BCD码有两类:压缩BCD码和非压缩BCD码。二进制数算术运算指令对BCD数进行运算,会得到一个非BCD数或不正确的BCD数。69

第4章汇编语言与汇编程序

4.4.2算术运算指令6.BCD数调整指令例4.30:00000011B+00001001B=00001100B00001001B+00000111B=00010000B第一个结果是非BCD数;第二个结果是不正确的BCD数。其原因是BCD数向高位的进位是逢10进1,而4位二进制数向高位进位是逢16进1,中间相差6。若再加上6,就可以得到正确的BCD数:

00001100B+00000110B=00010010B00010000B+00000110B=00010110B8086/8088对BCD数使用二进制数算术运算指令进行运算,然后执行一条能把结果转换成正确的BCD数的专用调整指令来处理BCD数的结果。

70

第4章汇编语言与汇编程序

4.4.2算术运算指令6.BCD数调整指令(1)BCD数加法调整指令指令格式:DAAAAADAA执行操作:是将AL中的数当作两个压缩BCD数相加之和来进行调整,得到两位压缩BCD数。具体操作是,若(AL&0FH)>9或AF=1,则AL加上6;若(AL&0F0H)>90H或CF=1,则AL加60H。71

第4章汇编语言与汇编程序

4.4.2算术运算指令6.BCD数调整指令例4.31:MOVAX,3456HADDAL,AH;AL=8AHDAA;AL=90HAAA执行操作:是将AL中的数当作两个非压缩BCD数相加之和进行调整,得到正确的非压缩BCD数送AX。具体操作是,若(AL&0FH)>9或AF=1,则(AL+6)&0FH送AL,AH加1;否则AL&0FH送AL,AH不变。应特别注意,AAA指令执行前AH的值。72

第4章汇编语言与汇编程序

4.4.2算术运算指令6.BCD数调整指令例4.32:MOVAX,0806HADDAL,AH;AX=080EHMOVAH,0AAA;AX=0104H由调整指令所执行的具体操作可以看到,对结果进行调整时要用到进位标志和辅助进位标志,所以调整指令应紧跟在BCD数作为加数的加法指令之后。所谓“紧跟”是指在调整指令与加法指令之间不得有改变标志位的指令。73

第4章汇编语言与汇编程序

4.4.2算术运算指令6.BCD数调整指令(2)BCD数减法调整指令指令格式:DAS

AASDAS执行操作:是将AL中的数当作两个压缩BCD数相减之差来进行调整,得到正确的压缩BCD数。具体操作是:若(AL&0FH)>9或AF=1,则AL减6,(AL&0F0H)>90H或CF=1,则AL减60H。74

第4章汇编语言与汇编程序

4.4.2算术运算指令6.BCD数调整指令例4.33:MOVAX,5634HSUBAL,AH;AL=DEH,有借位

DAS;AL=78H,保持借位即134-56AAS执行操作:是将AL中的数当作两个非压缩BCD数相减之差进行调整得到正确的非压缩BCD数。具体操作是:若(AL&0FH)>9或AF=1,则(AL-6)&0FH送AL,AH减1;否则AL&0FH送AL,AH不变。应特别注意,AAS指令执行前AH的值。75

第4章汇编语言与汇编程序

4.4.2算术运算指令6.BCD数调整指令例4.34:MOVAX,0806HSUBAL,07H;AX=08FFHAAS;AX=0709H76

第4章汇编语言与汇编程序

4.4.2算术运算指令6.BCD数调整指令(3)非压缩BCD数乘除法调整指令

指令格式:AAMAAD压缩BCD数对乘除法的结果不能进行调整,故只有非压缩BCD数乘除法调整指令。AAM执行操作:是将AL中的小于64H的二进制数进行调整,在AX中得到正确的非压缩BCD数。具体操作是AL/0AH送AH,ALMOD0AH送AL。

77

第4章汇编语言与汇编程序

4.4.2算术运算指令6.BCD数调整指令例4.35:MOVAL,63HAAM;AX=0909HAAD执行操作:是将AX中的两位非压缩BCD数变换为二进制数。在做二位非压缩BCD数除以一位非压缩BCD数时,先将AX中的被除数调整为二进制数,然后用二进制除法指令DIV相除,保存AH中的余数后,再用AAM指令把商变回为非压缩的BCD数。

78

第4章汇编语言与汇编程序

4.4.2算术运算指令6.BCD数调整指令例4.36:MOVAX,0906HMOVDL,06HAAD;AX=0060HDIVDL;AL=10H、AH=0MOVDL,AH;存余数

AAM;AX=0106H

除法的调整不同于加法、减法和乘法,它们的调整是在相应运算操作之后进行,而除法的调整在除法操作之前进行。调整指令都隐含着AX或AL,都在AX或AL中进行。79

第4章汇编语言与汇编程序

4.4.3位操作1.逻辑运算指令

这类指令包括逻辑运算与移位两种类型,它们均可直接对寄存器或存储器中的位进行操作。

(1)求补指令

指令格式:NEGDST执行操作:DST←0-(DST)将操作数地址中的内容求补后再送入操作数地址中。该指令的操作数只有通用寄存器REG和存储器MEM。特别需要强调的是该指令是求补指令,不是求补码指令。不论操作数地址中的数是符号数还是无符号数,是正数还是负数,也不管它是补码形式还是原码形式或反码形式的数,该指令均对其进行求补操作。其标志位影响同SUB指令。80

第4章汇编语言与汇编程序

4.4.3位操作1.逻辑运算指令

例4.37:MOVAX,0FF64H

NEGAL;AX=FF9CH,OF=0、SF=1、ZF=0、PF=1、CF=1

SUBAL,9DH;AX=FFFFH,OF=0、SF=1、ZF=0、PF=1、CF=1

NEGAX;AX=0001H,OF=0、SF=0、ZF=0、PF=0、CF=1

DECAL;AX=0000H,OF=0、SF=0、ZF=1、PF=1、CF=1

NEGAX;AX=0000H,OF=0、SF=0、ZF=1、PF=1、CF=0

由此可见,若将执行求补指令前后的数均视作补码数,求补指令则将该数变为绝对值相等符号相反的另一数。

81

第4章汇编语言与汇编程序

4.4.3位操作1.逻辑运算指令

(2)求反指令

指令格式:NOTDST执行操作:DST←FFFFH-(DST)指令的意义是将操作数地址中的数逐位取反后再送回操作数地址中。指令的操作数可以是寄存器或存储器,但不能是立即数。82

第4章汇编语言与汇编程序

4.4.3位操作1.逻辑运算指令

(3)逻辑与指令指令格式:ANDDST,SRC

执行操作:DST∧SRC→DST(4)逻辑或指令指令格式:ORDST,SRC

执行操作:DST∨SRC→DST(5)逻辑异或指令指令格式:XORDST,SRC

执行操作:DST⊕SRC→DST83

第4章汇编语言与汇编程序

4.4.3位操作1.逻辑运算指令

AND、OR、XOR这3类指令都将标志位CF和OF清0,对标志位SF、ZF和PF的影响同加操作。AND指令可以用来取出目的操作数中与源操作数的1对应的位。OR指令可以用来将目的操作数和源操作数中的所有1位拼合在一起。XOR指令可以用来将通用寄存器清0,还可以用来将目的操作数中的某些位取反。

84

第4章汇编语言与汇编程序

4.4.3位操作1.逻辑运算指令

(6)测试指令

指令格式:TESTDST,SRC

执行操作:DST∧SRCTEST指令与AND指令的关系同CMP指令与SUB指令的关系。TEST指令主要用来检测与源操作数中为1的位相对应的目的操作数中的那几位是否为0或为1,供其后面的条件转移指令实现程序的分支。85

第4章汇编语言与汇编程序

4.4.3位操作2.移位指令

移位指令的目的操作数可以是通用寄存器或存储器,可以是字节也可以是字;源操作数为移位的次数,只能是CL或1,即若移位次数不是1次就要先将移位次数送入CL,然后再执行源操作数为CL的移位指令。CL的值为0,则不移位。以CL为源操作数的移位指令执行以后,CL的值不变。86

第4章汇编语言与汇编程序

4.4.3位操作2.移位指令

(1)逻辑右移

指令格式:SHRDST,SRC执行操作:是将DST中的8位或16位二进制数向右移动1位或者CL位,最右边位(即最低位)或者最后移出位移至CF,最左边的1位(即最高位)或CL位依次补0。

87

第4章汇编语言与汇编程序

4.4.3位操作2.移位指令

(2)算术右移指令格式:SARDST,SRC

执行操作:是将DST中的8位或16位二进制数向右移动1位或者CL位,最右边位(即最低位)或者最后移出位移至CF,最左边位(即最高位)既向右移动又保持不变。88

第4章汇编语言与汇编程序

4.4.3位操作2.移位指令

(3)算术/逻辑左移指令格式:SAL/SHLDST,SRC执行操作:是将DST中的8位或16位二进制数向左移动1位或者CL位,最左边位(即最高位)或者最后移出位移至CF,最右边的1位(即最低位)或右边的CL位移入0。89

第4章汇编语言与汇编程序

4.4.3位操作2.移位指令

(4)循环右移指令格式:RORDST,SRC执行操作:是将DST中的8位或16位二进制数向右移动1位或者CL位,从右边移出位既移入CF又移入左边的空出位,最后移出位移至最左边位(即最高位),同时保留在CF。90

第4章汇编语言与汇编程序

4.4.3位操作2.移位指令

(5)循环左移

指令格式:ROLDST,SRC

执行操作:是将DST中的8位或16位二进制数向左移动1位或者CL位,从左边移出位既移入CF又移入右边的空出位,最后移出位移至最右边位(即最低位),同时保留在CF。91

第4章汇编语言与汇编程序

4.4.3位操作2.移位指令

(6)带进位循环右移指令格式:RCRDST,SRC

执行操作:是将DST和进位CF中的9位或17位二进制数一同向右移动1位或者CL位,dest中的最右边位(即最低位)或者最后移出位移至CF,CF(原内容)移至dest的最左边位(即最高位)或者中间位。

92

第4章汇编语言与汇编程序

4.4.3位操作2.移位指令

(7)带进位循环左移

指令格式:RCLDST,SRC

执行操作:是将DST中的8位二进制数和进位CF一同向左移动1位或者CL位,dest中的最左边位(即最高位)或者最后移出位移至CF,CF(原内容)移至dest的最右边位(即最低位)或者中间位。93

第4章汇编语言与汇编程序

4.4.4串操作1.字符串传送指令

指令格式:(1)MOVS(2)MOVSB

(3)MOVSW执行操作:将存储器中的字节或字传送到存储器中。即从SI寄存器指定的存储单元中传送8位或16位数到由DI指定的存储单元中,然后DI和SI的内容是增加还是减少取决于DF标志。若采用重复前缀(REP),则可以用一条指令完成整个数据块的传送。但要用重复前缀时,数据块长度必须放在寄存器CX中。本指令对标志位无影响。其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作。

94

第4章汇编语言与汇编程序

4.4.4串操作2.字符串装入指令

指令格式:(1)LODS

(2)LODSB

(3)LODSW执行操作:是将DS数据段中SI为偏移地址的源串中的一个字节或一个字取出送AL或AX;同时修改SI指向下一个字节或字。

95

第4章汇编语言与汇编程序

4.4.4串操作3.字符串填充指令

指令格式:(1)STOS

(2)STOSB

(3)STOSW执行操作:是将AL或AX中的内容存放到ES数据段中DI为偏移地址的目的串中;同时修改DI指向下一个字节或字。

96

第4章汇编语言与汇编程序

4.4.4串操作4.字符串比较指令

指令格式:(1)CMPS

(2)CMPSB

(3)CMPSW执行操作:是用DS:SI指向的源串中的一个字节或字减去ES:DI指向的目的串中的一个字节或字,减的结果既不送入源串也不送入目的串,仅根据减操作设置标置位;同时修改SI和DI指向下一个字节或字。97

第4章汇编语言与汇编程序

4.4.4串操作5.字符串搜索指令

指令格式:(1)SCAS

(2)SCASB

(3)SCASW执行操作:是用AL或AX减去ES:DI指向的目的串中的一个字节或字,减的结果,既不送累加器也不送目的串中,减操作仅影响标志位;同时修改DI指向下一操作数。98

第4章汇编语言与汇编程序

4.4.5程序控制指令

1.过程调用指令(1)CALLaddr调用由操作数指定的子程序(段间)。该指令是将CALL指令的下一条指令的地址压入栈顶。紧接着将跟在CALL指令操作码后面的4个字节内容放入IP和CS中。顺序如下:①指令的第二、第三字节放入IP中;②指令的第四、第五字节放入CS中。

99

第4章汇编语言与汇编程序

4.4.5程序控制指令

1.过程调用指令(2)CALLdispl6

调用由操作数指定的子程序(段内)。该指令是将CALL指令下一条指令的地址压入栈顶。紧跟在操作码后的两个宇节当作16位位移量放压入IP中。100

第4章汇编语言与汇编程序

4.4.5程序控制指令

1.过程调用指令(3)CALLmem/reg

将CALL指令的下一条指令的地址压人栈顶。然后把指定的存储器单元的内容或寄存器的内容送到IP(段内调用)与CS(段间调用)中。101

第4章汇编语言与汇编程序

4.4.5程序控制指令

2.无条件转移指令无条件转移指令有4种形式,addr表示32位地址,disp表示8位位移量,disp16表示16位位移量。

JMPaddrJMPdispJMPdisp16JMPmem/reg

JMP指令也有段内转移与段间转移,通常在指令中用FAR与NEAR来区别,这与CALL相似,但JMP指令不要求返回,因此不保留任何信息。JMP指令对标志无影响。102

第4章汇编语言与汇编程序

4.4.5程序控制指令

3.过程返回指令RETRETF

每个子程序的最后一条指令都是RET指令,由它控制返回调用程序。RET表示一个段内返回指令。栈顶指针SP+2。RETF表示段间返回。从栈顶弹出第一个字送到IP中,SP+2,接着再弹出一个字送入CS中,SP再加上2。RETF指令使SP加上4。

103

第4章汇编语言与汇编程序

4.4.5程序控制指令

3.过程返回指令RETdispl6RETFdispl6

RETdispl6与RETFdispl6与前两条相似,也是从段内或段间返回,所不可同的是在返回之后,还调整了栈指针SP,除了使SP加上必须的2(段内返回)或4(段间返回)之外,再使SP加上指令中给出的displ6位移量,这样就可允许用户废除一些在执行CALL指令以前入栈的参数。104

第4章汇编语言与汇编程序

4.4.5程序控制指令

4.条件转移指令指令助记符功能标志设置JE/JZ相等/等于0转移ZF=1JNE/JNZ不相等/不等于0转移ZF=0JC有进(借)位转移CF=1JNC无进(借)位转移CF=0JS为负转移SF=1JNS为正转移SF=0JO溢出转移OF=1JNO无溢出转移OF=0JP/JPE偶转移PF=1JNP/JPO奇转移PF=0(1)简单的条件转移指令105

第4章汇编语言与汇编程序

4.4.5程序控制指令

4.条件转移指令(2)无符号数条件转移指令

指令助记符功能JB/JNAE低于/不高于等于转移JNB/JAE不低于/高于等于转移JA/JNBE高于/不低于等于转移JNA/JBE不高于/低于等于转移106

第4章汇编语言与汇编程序

4.4.5程序控制指令

4.条件转移指令(3)符号数条件转移指令

指令助记符功能JL/JNGE小于/不大于等于转移JNL/JGE不小于/大于等于转移JG/JNLE大于/不小于等于转移JNG/JLE不大于/小于等于转移107

第4章汇编语言与汇编程序

4.4.5程序控制指令

5.循环指令(1)LOOP指令指令格式:LOOPshort-lable执行操作:是将CX减1,然后判断CX是否等于0。若CX≠0,则控制程序转移到short-lable所指的指令,否则顺序执行。使用LOOP指令之前,必须把循环次数送入CX寄存器中,一条LOOPshort-lable指令,相当于DECCX和JNZshort-lable两条指令。

108

第4章汇编语言与汇编程序

4.4.5程序控制指令

5.循环指令(2)LOOPZ/LOOPE指令

指令格式:LOOPZshort-lable或LOOPEshort-lable执行操作:是先将CX减1,然后判断CX的内容和ZF标志的状态。若CX≠0,且ZF=1时,将程序转移到short-lable所指的指令,否则顺序执行。

109

第4章汇编语言与汇编程序

4.4.5程序控制指令

5.循环指令(3)LO

温馨提示

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

评论

0/150

提交评论