汇编第4章-常用数据处理技术.ppt

上传人:大米 文档编号:568693611 上传时间:2024-07-26 格式:PPT 页数:185 大小:1.63MB
返回 下载 相关 举报
汇编第4章-常用数据处理技术.ppt_第1页
第1页 / 共185页
汇编第4章-常用数据处理技术.ppt_第2页
第2页 / 共185页
汇编第4章-常用数据处理技术.ppt_第3页
第3页 / 共185页
汇编第4章-常用数据处理技术.ppt_第4页
第4页 / 共185页
汇编第4章-常用数据处理技术.ppt_第5页
第5页 / 共185页
点击查看更多>>
资源描述

《汇编第4章-常用数据处理技术.ppt》由会员分享,可在线阅读,更多相关《汇编第4章-常用数据处理技术.ppt(185页珍藏版)》请在金锄头文库上搜索。

1、第四章第四章 v所谓常用处理技术,是指常用指令、所谓常用处理技术,是指常用指令、常用伪指令、变量定义和使用以及编程常用伪指令、变量定义和使用以及编程应用的技术。应用的技术。v这种编程应用主要是针对一些数值型这种编程应用主要是针对一些数值型数据的运算和非数值型数据的处理,而数据的运算和非数值型数据的处理,而这种处理常常是大量的、广泛的和带有这种处理常常是大量的、广泛的和带有技巧性的。技巧性的。v汇编语言程序的语句除指令语句外,汇编语言程序的语句除指令语句外,还有伪指令语句。还有伪指令语句。v伪指令语句又称为说明语句或指示性伪指令语句又称为说明语句或指示性语句。它不同于指令语句,它不是直接语句。它

2、不同于指令语句,它不是直接命令命令CPUCPU去执行某一操作,而是命令汇去执行某一操作,而是命令汇编程序应当如何生成目标代码编程序应当如何生成目标代码。v例如控制汇编以实现数据定义、存储例如控制汇编以实现数据定义、存储器分配、源程序开始和指示程序结束等器分配、源程序开始和指示程序结束等功能。功能。v伪指令无相应的目标代码,因此也称伪指令无相应的目标代码,因此也称为伪操作。伪指令,特别是数据定义为伪操作。伪指令,特别是数据定义伪指令,在源程序设计中是必不可少伪指令,在源程序设计中是必不可少的。的。v本章主要介绍变量、伪指令和常用数本章主要介绍变量、伪指令和常用数据处理程序。最后通过大量案例说明据

3、处理程序。最后通过大量案例说明其应用。其应用。4.14.1 变量变量4.2 4.2 常用伪指令常用伪指令4.3 4.3 常用数据处理指令常用数据处理指令4.4 4.4 字符串输入输出方法字符串输入输出方法习习 题题 4 4v1 1变量名变量名v变量的名字是它的外包装,是用来区变量的名字是它的外包装,是用来区分不同的存储区域的标识符号,是一分不同的存储区域的标识符号,是一种标识符。种标识符。4.1 4.1 变量变量4.1.1 4.1.1 变量定义变量定义v不同的语言对标识符命名的规定有所不同的语言对标识符命名的规定有所不同,但大体上都把不同,但大体上都把“以字母开头的以字母开头的字符数字串字符数

4、字串” ” 作为基本规定,当然也作为基本规定,当然也可以用可以用“ “ _”_”或或“”开头开头 。v80868086的汇编语言还允许用下面的特殊的汇编语言还允许用下面的特殊符号作为标识符的构成符号:符号作为标识符的构成符号: ? ?、 、 $ $、% % 和和_ _。v标识符是一个或多个符号构成的符标识符是一个或多个符号构成的符号串,汇编语言对标识符命名的完号串,汇编语言对标识符命名的完整规定是:整规定是: v(1 1)可用符号包括字母、数字和特)可用符号包括字母、数字和特殊符号殊符号“?”?”、“”、“$”$”、“%”%”、“ “ _”_”。 v(2 2)不允许用数字作为第一个符号。)不允

5、许用数字作为第一个符号。 v(3 3)名字的长度由)名字的长度由1 13131个字符组成,个字符组成,但一般不超过但一般不超过1010个符号。个符号。 v(4 4)最少由一个符号构成,可以是字)最少由一个符号构成,可以是字母、母、“_”_”或或“”。v(5 5)汇编语言不区分字母的大小写。)汇编语言不区分字母的大小写。 v2. 2. 变量定义的方法变量定义的方法v变量的实质是存放数据的内存区域,变量的实质是存放数据的内存区域,所谓变量定义就是告诉汇编程序,在所谓变量定义就是告诉汇编程序,在翻译时从某个地址起预留一定数量的翻译时从某个地址起预留一定数量的内存空间,并在其中填上初值,还要内存空间,

6、并在其中填上初值,还要建立变量与地址间的对应关系。建立变量与地址间的对应关系。v所以变量定义是伪指令而不是指令。所以变量定义是伪指令而不是指令。 v【格式格式】变量定义的基本格式是:变量定义的基本格式是: 变量名变量名 类型类型 初值表初值表 v【说明说明】v 类型部分只能出现类型部分只能出现DBDB、DWDW、DDDD、DQDQ、DTDT这几种内部保留字,用以说明这几种内部保留字,用以说明初值表中的每个数据占几个字节,对初值表中的每个数据占几个字节,对应关系如下:应关系如下:v DB DB 字节型字节型,每个数据项占,每个数据项占1 1字节;字节; DW DW 字型字型,每个数据项占,每个数

7、据项占2 2字字节;节; DD DD 双字型双字型,每个数据项占,每个数据项占4 4字节;字节; DQDQ与与DTDT很少用,不作说明。很少用,不作说明。 v初值表是用逗号分隔的若干个数据初值表是用逗号分隔的若干个数据项,每个数据项的值是变量的一个初项,每个数据项的值是变量的一个初值项,占据值项,占据“类型类型”规定的字节数,规定的字节数,所以初值表一方面说明变量的初值是所以初值表一方面说明变量的初值是多少,另一方面也指明了变量占多少多少,另一方面也指明了变量占多少字节的存储空间。字节的存储空间。 v 对于对于DWDW和和DDDD类型,每个数据项的存类型,每个数据项的存储遵照储遵照“高字节在高

8、地址,低字节在高字节在高地址,低字节在低地址低地址” ” 的原则。的原则。v(4 4)每个数据项的书写方法可以是)每个数据项的书写方法可以是任何数制的整数或者由整数构成的计任何数制的整数或者由整数构成的计算式,也可以是字符,如果用整数书算式,也可以是字符,如果用整数书写,可以是无符号数,也可以是带符写,可以是无符号数,也可以是带符号数。号数。 v(5 5)当类型是)当类型是DBDB时,初值表可以是时,初值表可以是任意长度的字符串,而任意长度的字符串,而DWDW类型只允许类型只允许长度不超过长度不超过 2 2的字符串。的字符串。 v(6 6)如果初值表需要填写若干个相同)如果初值表需要填写若干个

9、相同的值,可以用下面的形式表示把一个值的值,可以用下面的形式表示把一个值重复若干次:重复若干次: 重复次数重复次数 DUP(DUP(数据项数据项) ) v(7 7)初值表中可以用问号)初值表中可以用问号“?”作为作为初值项,含义是用户程序不设定初值,初值项,含义是用户程序不设定初值,而由汇编程序安排,对此汇编程序将在而由汇编程序安排,对此汇编程序将在翻译时把这类初值项都以数值翻译时把这类初值项都以数值0 0填充。填充。 v(8 8)任何段中都可以写变量定义,也)任何段中都可以写变量定义,也允许把指令与变量定义写在一个段内,允许把指令与变量定义写在一个段内,但通常是把程序所用到的所有变量集但通常

10、是把程序所用到的所有变量集中在一个段内进行定义,而把指令写中在一个段内进行定义,而把指令写在另一个段中。在另一个段中。v习惯上把定义变量的段称为数据段,习惯上把定义变量的段称为数据段,写指令的段称为代码段或指令段。写指令的段称为代码段或指令段。v【例例4-14-1】说明说明datadata段中定义的各变段中定义的各变量的类型及初值情况量的类型及初值情况, ,变量占据的内变量占据的内存字节数。存字节数。vdata SEGMENTdata SEGMENTv d1 DB 1 d1 DB 1v d2 DW 1234H d2 DW 1234Hv d3 DD 12345678H d3 DD 1234567

11、8Hv d4 DB 1, 2, 3 d4 DB 1, 2, 3 v d5 DB 123d5 DB 123v d6 DB 30 DUP(35H) d6 DB 30 DUP(35H)v d7 DB 1,3 DUP(2),3,-3,1001B d7 DB 1,3 DUP(2),3,-3,1001Bv d8 DB 1,2,3,4,5,6 d8 DB 1,2,3,4,5,6v DB 7,8,9,10 DB 7,8,9,10v d9 DW 12, AB d9 DW 12, ABv d10 DW 3-5 d10 DW 3-5vdata ENDSdata ENDSv3.3.变量的三个基本属性变量的三个基本属性

12、v任何变量表面上都以一个标识符的任何变量表面上都以一个标识符的形式出现,也就是它的名字,每个形式出现,也就是它的名字,每个变量都有三个数据与之相对应,这变量都有三个数据与之相对应,这就是变量的三属性。就是变量的三属性。v变量的三属性变量的三属性: :段属性、偏移量属性段属性、偏移量属性和类型属性和类型属性v1 1)段属性)段属性 v 变量的段属性也就是变量所在段的段变量的段属性也就是变量所在段的段地址。变量定义必须写在一个段的范地址。变量定义必须写在一个段的范围之内,每个段在程序进入内存时都围之内,每个段在程序进入内存时都被操作系统安排一个确定的段地址。被操作系统安排一个确定的段地址。v在编写

13、程序时可以用段的名字指出某在编写程序时可以用段的名字指出某处要使用段地址,而这个段中的所有处要使用段地址,而这个段中的所有变量都统一地以这个段地址作为逻辑变量都统一地以这个段地址作为逻辑地址中的段部分。地址中的段部分。v如果在编写程序时需要使用某个变如果在编写程序时需要使用某个变量的段地址,一种方法是用该变量量的段地址,一种方法是用该变量所在段的段名。比如,对例所在段的段名。比如,对例4-14-1中中定义的变量定义的变量d1d1,如果要把它的段地,如果要把它的段地址取到寄存器址取到寄存器AXAX中,可以写作:中,可以写作: v MOV AX, dataMOV AX, data v取段地址的另一

14、种方法是在变量名的取段地址的另一种方法是在变量名的前面加上保留字前面加上保留字SEGSEG。比如,下面的。比如,下面的写法与上面指令的功能完全相同:写法与上面指令的功能完全相同: v MOV AX, SEG d1MOV AX, SEG d1 v保留字保留字SEGSEG是伪指令,用于告诉汇编程是伪指令,用于告诉汇编程序,上述指令的源操作数是变量序,上述指令的源操作数是变量d1d1所在所在段的段地址,而不是变量段的段地址,而不是变量d1d1中存放的数中存放的数据。这两条指令中的源操作数都是立即据。这两条指令中的源操作数都是立即寻址方式,操作数在指令当中。寻址方式,操作数在指令当中。v这与指令这与指

15、令“MOV AX, d1”MOV AX, d1”有着本质差异,有着本质差异,后者的源操作数是直接寻址方式,操作后者的源操作数是直接寻址方式,操作数在内存当中,是数在内存当中,是“MOV AX, d1”MOV AX, d1”的的变形。变形。v2 2)偏移量属性)偏移量属性 v变量的偏移量属性也就是变量所变量的偏移量属性也就是变量所在段的段内偏移地址。在第在段的段内偏移地址。在第2 2章中章中已经说明,偏移地址表示段内某一已经说明,偏移地址表示段内某一位置到段起始地址的距离,偏移地位置到段起始地址的距离,偏移地址为址为0 0表示就在段的起始处。表示就在段的起始处。v一个段中可以定义多个变量,每个一

16、个段中可以定义多个变量,每个变量占据一定的内存空间,到段起变量占据一定的内存空间,到段起点的距离也就不一样,所以一个段点的距离也就不一样,所以一个段内的各个变量都具有不同的偏移地内的各个变量都具有不同的偏移地址。址。v在编写程序时,指令中使用某变量在编写程序时,指令中使用某变量就是按照它的偏移地址到所在段中就是按照它的偏移地址到所在段中取出数据,或把数据存到相应内存。取出数据,或把数据存到相应内存。 v如果在编写程序时需要使用变量的偏如果在编写程序时需要使用变量的偏移地址,一种方法是在变量名的前面移地址,一种方法是在变量名的前面加上保留字加上保留字OFFSETOFFSET。比如,把例。比如,把

17、例4-14-1中中的变量的变量d1d1的偏移地址取到寄存器的偏移地址取到寄存器BXBX中,中,写作:写作: v MOV BX, OFFSET d1MOV BX, OFFSET d1v取偏移地址的另一种方法是用汇编语取偏移地址的另一种方法是用汇编语言中的一条专用指令。言中的一条专用指令。 v【指令格式指令格式】LEA D, S LEA D, S v【功能功能】把源操作数把源操作数S S的偏移地址取到的偏移地址取到目的操作数目的操作数D D中。中。 v【说明说明】 v(1 1)这是一条数据传送类指令,不影)这是一条数据传送类指令,不影响标志位。响标志位。 v(2 2)该指令专用于取源操作数的偏移)

18、该指令专用于取源操作数的偏移地址,所以源操作数地址,所以源操作数S S一定是内存型寻一定是内存型寻址方式,可以是内存型操作数址方式,可以是内存型操作数5 5种寻址种寻址方式中的任何一种。方式中的任何一种。 v(3 3)当)当S S是变量名形式的直接寻址方是变量名形式的直接寻址方式时,变量名两边的方括号可以省略。式时,变量名两边的方括号可以省略。 v(4 4)目的操作数)目的操作数D D一定是寄存器型,一定是寄存器型,且必须是且必须是1616位的字型通用寄存器,不能位的字型通用寄存器,不能是段寄存器。是段寄存器。 vLEALEA指令专门用于取偏移地址,而指令专门用于取偏移地址,而MOVMOV指令

19、中把变量名字的前面加上伪指令指令中把变量名字的前面加上伪指令OFFSETOFFSET作为源操作数,也可以取出偏作为源操作数,也可以取出偏移地址。移地址。v这两种取偏移地址的方法在很多时候这两种取偏移地址的方法在很多时候可以相互替代,但它们也有一些不同可以相互替代,但它们也有一些不同的地方,有必要把两者进行对比:的地方,有必要把两者进行对比:v寻址方式不同。用寻址方式不同。用OFFSETOFFSET后接变量后接变量名的形式出现的操作数是立即寻址方名的形式出现的操作数是立即寻址方式,式,LEALEA指令中的源操作数是内存型寻指令中的源操作数是内存型寻址方式。址方式。v下面两条指令都可以把例下面两条

20、指令都可以把例4-14-1中的变量中的变量d1d1的偏移地址取到寄存器的偏移地址取到寄存器BXBX中,执行中,执行效果是一样的,可以相互代换。效果是一样的,可以相互代换。v MOV BX, OFFSET d1MOV BX, OFFSET d1v LEA BX, d1 LEA BX, d1 vLEALEA指令在功能上比指令在功能上比OFFSETOFFSET更强。更强。通过例通过例4-24-2中的几条语句的语法正误中的几条语句的语法正误对比,可以准确地掌握两者的差别。对比,可以准确地掌握两者的差别。v【例例4-24-2】设设bufbuf是一个变量,偏移地是一个变量,偏移地址是址是10H10H,BX

21、BX1000H1000H,SISI200H200H,判,判断下列各语句的正确性,对正确的指断下列各语句的正确性,对正确的指令说明其功能。令说明其功能。 v(1 1)MOV AX, OFFSET MOV AX, OFFSET bufbufv(1 1)正确,常规用法,把)正确,常规用法,把bufbuf的偏移的偏移地址地址10H10H作为立即数送到作为立即数送到AXAX中。中。v(2 2)MOV AX, OFFSET buf+3MOV AX, OFFSET buf+3v(2 2)正确,把)正确,把“OFFSET OFFSET bufbuf”作为作为立即数,是立即数,是10H10H,与另,与另 一个立

22、即数一个立即数3 3相相加,结果加,结果13H13H送到送到 AXAX中。中。v(3 3)MOV AX, OFFSET BXMOV AX, OFFSET BXv(3 3)错误,应该写作)错误,应该写作MOV AX, BXMOV AX, BX。v(4 4)MOV AX, OFFSET BX+3MOV AX, OFFSET BX+3v(4 4)错误,应该先用)错误,应该先用MOVMOV指令把指令把BXBX的的值送到值送到AXAX中,再用中,再用ADDADD指令把指令把AXAX的值加的值加3 3。v(5 5)MOV AX, OFFSET MOV AX, OFFSET bufBXbufBX v(5 5

23、)正确,把)正确,把“OFFSET OFFSET bufbuf”作为作为立即数看待,是立即数看待,是10H10H,源操作数是把,源操作数是把BXBX的值加上立即数的值加上立即数10H10H,得到,得到1010H1010H,再,再以以1010H1010H为偏移地址,与为偏移地址,与BXBX对应的缺省对应的缺省段寄存器段寄存器DSDS一起构成逻辑地址,到内一起构成逻辑地址,到内存中寻找操作数。该指令汇编的结果存中寻找操作数。该指令汇编的结果相当于相当于MOV AX, BX+10HMOV AX, BX+10H。v(6 6)MOV AX, OFFSET MOV AX, OFFSET bufBXSIbu

24、fBXSI v(6 6)正确,把)正确,把“OFFSET OFFSET bufbuf”作为立作为立即数看待,是即数看待,是10H10H,该指令相当于:,该指令相当于: MOV AX, BX+SI+10HMOV AX, BX+SI+10H。 v(7 7)LEA AX, LEA AX, bufbufv(7 7)正确,常规用法,把)正确,常规用法,把bufbuf的偏移地的偏移地址址10H10H送到送到AXAX中。中。v(8 8)LEA AX, LEA AX, bufbuf v(8 8)正确,与()正确,与(7 7)的功能完全相)的功能完全相同,是两种不同的写法。同,是两种不同的写法。v(9 9)LE

25、A AX, buf+3LEA AX, buf+3v(9 9)正确,计算出源操作数的偏移)正确,计算出源操作数的偏移地址地址13H13H,送到,送到AXAX中。中。v(1010)LEA AX, LEA AX, BX+bufBX+buf v(1010)正确,计算出源操作数的偏移)正确,计算出源操作数的偏移地址地址1013H1013H,送到,送到AXAX中。中。v(1111)LEA AX, BX+3LEA AX, BX+3v(1111)正确,计算出源操作数的偏移)正确,计算出源操作数的偏移地址地址1003H1003H,送到,送到AXAX中。中。v(1212)LEA AX, BX+SILEA AX,

26、BX+SIv(1212)正确,计算出源操作数的偏移)正确,计算出源操作数的偏移地址地址1200H1200H,送到,送到AXAX中。中。v(1313)LEA AX, BX+SI+bufLEA AX, BX+SI+bufv(1313)正确,计算出源操作数的偏移)正确,计算出源操作数的偏移地址地址1210H1210H,送到,送到AXAX中。中。v3 3)类型属性)类型属性 v类型属性也就是变量的类型,变量在定类型属性也就是变量的类型,变量在定义时必须用义时必须用DBDB、DWDW等伪指令说明类型。等伪指令说明类型。v说明变量的类型,一方面告诉汇编程序说明变量的类型,一方面告诉汇编程序在翻译时把该变量

27、定义中的每个数据项在翻译时把该变量定义中的每个数据项用几个字节存放,另一方面说明该变量用几个字节存放,另一方面说明该变量的使用方法。的使用方法。vMOVMOV等双操作数指令中的两个操作数必等双操作数指令中的两个操作数必须是同一种类型。须是同一种类型。v汇编程序在翻译时要进行类型检查。当一汇编程序在翻译时要进行类型检查。当一个操作数是寄存器,另一个是变量时,两个操作数是寄存器,另一个是变量时,两者的类型一致是正常情况,当两者类型不者的类型一致是正常情况,当两者类型不同时,汇编程序将以寄存器的类型为准进同时,汇编程序将以寄存器的类型为准进行翻译,并提出警告(行翻译,并提出警告(WarningWar

28、ning);当目的);当目的操作数是变量,源操作数是立即数时,就操作数是变量,源操作数是立即数时,就以变量定义时的类型为准。以变量定义时的类型为准。 v如果有必要,使用变量时可以临时改变类如果有必要,使用变量时可以临时改变类型,后面将以具体例子说明使用方法。型,后面将以具体例子说明使用方法。v4.1.2 4.1.2 内存图内存图v内存图表示的内容有两个方面。一方面是内存图表示的内容有两个方面。一方面是存储器,通常由若干个叠放在一起的小方存储器,通常由若干个叠放在一起的小方框表示,每个方框代表一个字节。虽然每框表示,每个方框代表一个字节。虽然每个字节有自己确定的物理地址,但是,由个字节有自己确定

29、的物理地址,但是,由于编写程序时使用的是逻辑地址,而逻辑于编写程序时使用的是逻辑地址,而逻辑地址到物理地址的转换由计算机自动实现,地址到物理地址的转换由计算机自动实现,所以画变量分配的内存图时,一般标以各所以画变量分配的内存图时,一般标以各字节的偏移地址,段地址部分被省略。字节的偏移地址,段地址部分被省略。v在表示一个字节的小方框内填上数值,在表示一个字节的小方框内填上数值,表示该字节中的内容。填写数值时可以表示该字节中的内容。填写数值时可以用各种数制、各种写法,但用十六进制用各种数制、各种写法,但用十六进制数会有助于理解。另一方面,内存图还数会有助于理解。另一方面,内存图还要表示变量名与偏移

30、地址的对应关系,要表示变量名与偏移地址的对应关系,把变量的名字写在对应的方框的边上。把变量的名字写在对应的方框的边上。v图图4.14.1是一个内存图的实例。是一个内存图的实例。 图图4-1 4-1 变量的内存图变量的内存图v图图4.14.1总体上分为三部分,中间是表示总体上分为三部分,中间是表示内存各字节的方框,各方框的右边标内存各字节的方框,各方框的右边标以偏移地址,左边则标出变量的名字。以偏移地址,左边则标出变量的名字。v从图从图4-14-1中无法看出中无法看出3 3个变量的类型,个变量的类型,这一点可以通过在变量名的下面标上这一点可以通过在变量名的下面标上类型加以弥补。类型加以弥补。v从

31、另一个角度看,不标类型还说明变从另一个角度看,不标类型还说明变量是不注重类型的。量是不注重类型的。v换句话说,源程序翻译成机器语言之换句话说,源程序翻译成机器语言之后,指令中没有变量而只有偏移地址,后,指令中没有变量而只有偏移地址,类型是通过寄存器的位数或者指令本类型是通过寄存器的位数或者指令本身所带有的机器语言形式的身所带有的机器语言形式的BYTEBYTE或或WORDWORD类型指示加以区分的。类型指示加以区分的。v【例例4-34-3】对于图对于图4-14-1的各变量,确定的各变量,确定下列指令中赋值操作的操作数是什么下列指令中赋值操作的操作数是什么类型。类型。(1 1)MOV AX, va

32、r1MOV AX, var1(2 2)MOV AL, var1MOV AL, var1(3 3)MOV WORD PTR var2, 3MOV WORD PTR var2, 3(4 4)MOV BYTE PTR var2+1, 3MOV BYTE PTR var2+1, 3(5 5)MOV var2+3, 3MOV var2+3, 3v【解解】v(1 1)字型,由寄存器)字型,由寄存器AXAX是是1616位可知位可知v(2 2)字节型,由寄存器)字节型,由寄存器ALAL是是8 8位可知位可知v(3 3)字型,由伪指令)字型,由伪指令WORD PTRWORD PTR指示指示v(4 4)字节型,由

33、伪指令)字节型,由伪指令BYTE PTRBYTE PTR指示指示v(5 5)是变量)是变量var2var2定义时的类型,由图定义时的类型,由图4-14-1不能分辨究竟是哪一种类型。不能分辨究竟是哪一种类型。v4.1.3 4.1.3 变量定义与内存分配的关系变量定义与内存分配的关系v汇编程序在为变量安排内存时遵照下面的汇编程序在为变量安排内存时遵照下面的规则:规则:v(1 1)同一段内的变量具有相同的段地址。)同一段内的变量具有相同的段地址。v(2 2)按照段中变量定义的次序,依次对)按照段中变量定义的次序,依次对各变量分配偏移地址。各变量分配偏移地址。 v(3 3)除非有其它伪指令说明,段内的

34、第)除非有其它伪指令说明,段内的第一个变量被分配在偏移地址为一个变量被分配在偏移地址为0 0处。处。v(4 4)一个变量占据内存的字节数由其)一个变量占据内存的字节数由其类型和初值表中的项数决定。类型和初值表中的项数决定。 v(5 5)除非有其它伪指令说明,一个变)除非有其它伪指令说明,一个变量分配完后,紧接着分配下一变量。量分配完后,紧接着分配下一变量。 v【例例4-44-4】说明下面的数据段中各变量说明下面的数据段中各变量的内存分配情况,画出相应的内存图。的内存分配情况,画出相应的内存图。v data SEGMENT data SEGMENT v x1 DB 012 x1 DB 012v

35、x2 DW x2 DW abab v x3 DB 2 DUP(32),13,10 x3 DB 2 DUP(32),13,10v x4 DD 1017H x4 DD 1017Hv data ENDS data ENDS 图图4-2 4-2 例例4-44-4的的datadata段的内存分配情况段的内存分配情况4.2 4.2 常用伪指令常用伪指令v1. OFFSET1. OFFSET操作符操作符v 变量是数据的存放地,对变量最常见变量是数据的存放地,对变量最常见的操作是从变量中取出数据和把数据放的操作是从变量中取出数据和把数据放入变量中,实现这些操作有两种方法:入变量中,实现这些操作有两种方法:直接

36、法和间接法。直接法和间接法。4.2.1 OFFSET4.2.1 OFFSET和和SEGSEGv 直接法是在程序中直接使用变量的名字直接法是在程序中直接使用变量的名字以表明对哪个变量进行操作。比如,设以表明对哪个变量进行操作。比如,设varvar是一个字型变量,则指令是一个字型变量,则指令 v MOV AX, MOV AX, varvar v是从变量中取出数据,送到是从变量中取出数据,送到AXAX中,而指令中,而指令 v MOV MOV varvar, AX , AX v完成反方向的数据传递。上述两条指令中,完成反方向的数据传递。上述两条指令中, varvar 都是直接指明使用的变量,是直接都是

37、直接指明使用的变量,是直接寻址方式。寻址方式。v而间接法是先用而间接法是先用OFFSETOFFSET伪指令,把变伪指令,把变量的偏移地址取到某个地址寄存器中,量的偏移地址取到某个地址寄存器中,如如BXBX、SISI、DIDI、BPBP等,然后再用寄存等,然后再用寄存器间接寻址方式对原变量中的操作数器间接寻址方式对原变量中的操作数进行操作。进行操作。v如:如: MOV SIMOV SI,OFFSET OFFSET varvar v MOV AX, SI MOV AX, SIv 或或 MOV ALMOV AL,SISIv这种间接法方便对变量数组进行操作。这种间接法方便对变量数组进行操作。v2. 2

38、. SEGSEG操作符操作符 v无论按直接法还是间接法使用变量,都无论按直接法还是间接法使用变量,都会涉及变量的段地址问题,需要把段地会涉及变量的段地址问题,需要把段地址放在某个段寄存器中,一般是放在址放在某个段寄存器中,一般是放在DSDS或或ESES中。取变量的段地址也有两种方法:中。取变量的段地址也有两种方法:一是用变量所在段的段名,比如在例一是用变量所在段的段名,比如在例4-4-1 1中,如果用指令中,如果用指令 MOV AX, dataMOV AX, data就是就是取取datadata段的段地址送到段的段地址送到AXAX中。中。v另一种方法是用另一种方法是用SEGSEG伪指令放在某变

39、量伪指令放在某变量的前面,表示取该变量所在段的段地址,的前面,表示取该变量所在段的段地址,比如在例比如在例4-14-1中,变量中,变量d1d1是在是在datadata段中段中定义的,所以把上述指令换成定义的,所以把上述指令换成MOV AX, MOV AX, SEG d1SEG d1也是可以的。也是可以的。v不论是用段名还是用不论是用段名还是用“SEG SEG 变量名变量名”的形式,汇编程序都是把它作为常量处的形式,汇编程序都是把它作为常量处理。理。v4.2.2 ASSUME4.2.2 ASSUME和和PTRPTRv1.ASSUME1.ASSUME伪指令伪指令vASSUMEASSUME伪指令占一

40、行,用于指出后续伪指令占一行,用于指出后续程序中所使用的变量、标号等标识符在程序中所使用的变量、标号等标识符在涉及到逻辑地址的段地址部分时,用哪涉及到逻辑地址的段地址部分时,用哪个段寄存器作为缺省段地址。个段寄存器作为缺省段地址。 【格式格式】ASSUME R1:S1 , R2:S2 , .ASSUME R1:S1 , R2:S2 , . v【说明说明】 v(1 1)格式中的)格式中的RiRi代表段寄存器名。代表段寄存器名。必须是必须是DSDS、ESES、SSSS、CSCS四个之一,四个之一,SiSi是段地址,只能是一个段名或者是段地址,只能是一个段名或者“SEG SEG 变量名变量名”的形式

41、。的形式。 v(2 2)Ri:SiRi:Si是一组对应关系,表示是一组对应关系,表示SiSi段中的标识符都使用段中的标识符都使用RiRi作为缺省段寄作为缺省段寄存器。存器。 v(3 3)ASSUMEASSUME可以一次指定多个对应可以一次指定多个对应关系,其间用逗号分隔。这种写法实关系,其间用逗号分隔。这种写法实际上是多个际上是多个ASSUMEASSUME的简写形式,等效的简写形式,等效写法是:写法是:v ASSUME ASSUME R1:S1 R1:S1 v ASSUME ASSUME R2:S2R2:S2v(4 4)在一个完整程序中,)在一个完整程序中,ASSUMEASSUME伪指伪指令在

42、程序中最少出现一次,用于指明令在程序中最少出现一次,用于指明CSCS与哪一个段相对应。此时,与哪一个段相对应。此时,CSCS对应的段对应的段必须是结束伪指令必须是结束伪指令“END END 标号标号”中标号中标号所在段,从而确定程序的第一条指令在所在段,从而确定程序的第一条指令在哪个段的哪个位置,称作程序的入口地哪个段的哪个位置,称作程序的入口地址。址。v(5 5)可以用)可以用ASSUMEASSUME伪指令指定两个或伪指令指定两个或两个以上的段寄存器作为同一个段中标两个以上的段寄存器作为同一个段中标识符的缺省段寄存器。当数据定义与指识符的缺省段寄存器。当数据定义与指令写在同一个段中时,就会出

43、现以令写在同一个段中时,就会出现以CSCS、DSDS甚至甚至ESES一起作为一个段的缺省段寄存一起作为一个段的缺省段寄存器的情况。此时,有关数据的操作(取器的情况。此时,有关数据的操作(取值、存数等)优先以值、存数等)优先以DSDS作为段寄存器。作为段寄存器。 v2.PTR2.PTR操作符操作符vPTRPTR是用于指定操作数类型的伪指是用于指定操作数类型的伪指令,它需要与类型保留字配合使令,它需要与类型保留字配合使用,其基本用法如下:用,其基本用法如下:v类型类型 PTR PTR 操作数操作数 v程序中有两种情况需要用到指定类型程序中有两种情况需要用到指定类型伪操作:一是操作数本身没有类型,需

44、伪操作:一是操作数本身没有类型,需要明确该操作数的类型时使用这种用法,要明确该操作数的类型时使用这种用法,比如寄存器间接寻址方式的比如寄存器间接寻址方式的BXBX。v另一种情况是已定义的变量本身有一另一种情况是已定义的变量本身有一定的类型,程序需要临时当作另一种类定的类型,程序需要临时当作另一种类型来处理。当操作数是内存型时,其类型来处理。当操作数是内存型时,其类型常有型常有BYTEBYTE和和WORDWORD两种。两种。v BYTE PTR BYTE PTR 内存操作数内存操作数;该内;该内存操作数为字节类型存操作数为字节类型. .v WORD PTR WORD PTR 内存操作数内存操作数

45、;该内;该内存操作数为字类型存操作数为字类型. .v另外,当另外,当PTRPTR后的操作数是标号或过后的操作数是标号或过程名时,则类型包括两种:即程名时,则类型包括两种:即NEARNEAR类型和类型和FARFAR类型。类型。v过程名即子程序名后面第过程名即子程序名后面第5 5章将作详章将作详细讲解,在此不再作阐述。细讲解,在此不再作阐述。v4.2.3 ORG4.2.3 ORG和和v1.ORG1.ORG伪指令伪指令vORGORG伪指令单独占一行,基本格式是:伪指令单独占一行,基本格式是: vORG ORG 地址表达式地址表达式 v功能:把地址表达式的值赋给后功能:把地址表达式的值赋给后面的变量或

46、标号作偏移地址。面的变量或标号作偏移地址。即接即接在在ORGORG伪指令后面的内容就从该地址开伪指令后面的内容就从该地址开始安排。始安排。v【例例4-54-5】分析下面数据段定义中各变量分析下面数据段定义中各变量的偏移地址。的偏移地址。vdata SEGMENTdata SEGMENTv v1 DB 5 v1 DB 5v ORG 6 ORG 6v v2 DW 6 v2 DW 6v ORG 2 ORG 2v v3 DB 8 v3 DB 8v v4 DW 9v4 DW 9vdata ENDSdata ENDS ORGORG伪指令可以改变段中各变量定义伪指令可以改变段中各变量定义时原有的次序,按指定

47、情况安排各变时原有的次序,按指定情况安排各变量的偏移地址。量的偏移地址。 段定义中各变量的次序是段定义中各变量的次序是v1v1、v2v2、v3v3、v4v4,而内存图上按地址由小到大依次,而内存图上按地址由小到大依次是是v1v1、v3v3、v4v4、v2v2。 图图4-34-3中的两个空格表示数据段中没中的两个空格表示数据段中没有对此进行定义,但实际上汇编程序有对此进行定义,但实际上汇编程序会填上会填上0 0。 图图4-3 4-3 例例4-54-5中数据段的内存分配情况中数据段的内存分配情况v2.$ 2.$ 操作符操作符 v$ $是汇编语言中的一个特殊符号,代表是汇编语言中的一个特殊符号,代表

48、汇编程序在处理到汇编程序在处理到$ $所在的位置时当前所在的位置时当前安排的偏移地址值。安排的偏移地址值。v程序中出现的程序中出现的$ $可以作为常量看待,但可以作为常量看待,但是不同位置上的是不同位置上的$ $,其代表的值是不同,其代表的值是不同的。与一般的数据不同的是,通常所说的。与一般的数据不同的是,通常所说的常量的常量( (数值数值) )是没有类型的,但是没有类型的,但$ $所表所表示的数据一定是字型。示的数据一定是字型。$ $一般作为字型一般作为字型变量定义时的一个初值使用。变量定义时的一个初值使用。v【例例4-64-6】分析下面数据段中各分析下面数据段中各$ $符所符所表示的值。表

49、示的值。v data SEGMENTdata SEGMENTv a DB $ a DB $v b DW $,$ b DW $,$v c DB $-a c DB $-av data ENDS data ENDS 【解解】变量变量a a的定义中出现的的定义中出现的$ $是表示是表示ASCIIASCII码值为码值为24H24H的符号;定义变量的符号;定义变量b b时时用的两个用的两个$ $没有加引号,第一个没有加引号,第一个$ $代表代表0001H0001H,第二个,第二个$ $代表代表0003H0003H;在变量;在变量c c的定义中,的定义中,$ $出现在数值表达式中,两出现在数值表达式中,两者

50、相减的结果是者相减的结果是5 5,并且不再有类型,并且不再有类型,因此可以作为字节型变量的一项初值。因此可以作为字节型变量的一项初值。图图4-44-4是该数据段对应的内存图。是该数据段对应的内存图。 图图4-4 4-4 例例4-64-6中数据段的内存分配情况中数据段的内存分配情况4.2.4 4.2.4 和和 EQUEQUv1 1、伪指令、伪指令v对于程序中经常使用的一个特定的数值,对于程序中经常使用的一个特定的数值,很多程序员喜欢把它定义成一个常量标很多程序员喜欢把它定义成一个常量标识符,在书写后面的程序时若遇到该数识符,在书写后面的程序时若遇到该数值,就写相应的常量标识符而不写数值值,就写相

51、应的常量标识符而不写数值本身。本身。v这种做法的最大好处在于方便程序的修这种做法的最大好处在于方便程序的修改,如果需要把一个程序中使用到的某改,如果需要把一个程序中使用到的某一数据统一改为另一数据,在使用常量一数据统一改为另一数据,在使用常量定义时就只要在定义处修改一次即可。定义时就只要在定义处修改一次即可。v常量定义的基本格式是:常量定义的基本格式是:v标识符标识符 数值表达式数值表达式 v常量定义可以写在源程序的任何地方,常量定义可以写在源程序的任何地方,单独占一行,并且遵照单独占一行,并且遵照“先定义后使先定义后使用用”的原则。的原则。 v【例例4-74-7】分析下面程序段中标识符分析下

52、面程序段中标识符x x每一次使用所表示的含义。每一次使用所表示的含义。x = 3x = 3MOV AL,xMOV AL,xMOV BX,xMOV BX,xx = 5x = 5MOV BYTE PTR BX,xMOV BYTE PTR BX,xx = x + 1x = x + 1ADD ADD SI,xSI,xv【解解】该程序段等价于下面的不用常该程序段等价于下面的不用常量标识符的写法:量标识符的写法:v MOV AL,3 MOV AL,3 MOV BX,3 MOV BX,3 MOV BYTE PTR BX,5 MOV BYTE PTR BX,5 ADD SI,6 ADD SI,6v2 2EQU

53、EQU伪指令伪指令vEQUEQU称为符号定义伪指令,在使用方称为符号定义伪指令,在使用方式上与常量定义的式上与常量定义的“”很相似,分很相似,分为定义部分和使用部分。为定义部分和使用部分。v其定义格式是:其定义格式是: v标识符标识符 EQU EQU 符号串符号串 v格式中的符号串可以由分号格式中的符号串可以由分号“;”以以外的任何符号构成,长度不限,但必外的任何符号构成,长度不限,但必须在一行内写完。须在一行内写完。v用用EQUEQU进行符号定义的语句可以写在进行符号定义的语句可以写在源程序的任何位置。源程序的任何位置。v与常量定义的与常量定义的“”不同,对同一个不同,对同一个标识符不允许用

54、标识符不允许用EQUEQU进行两次定义。进行两次定义。v对对EQUEQU定义的标识符也无需要遵照定义的标识符也无需要遵照“先定义后使用先定义后使用”的原则。的原则。 v【例例4-84-8】用不带符号定义的形式对用不带符号定义的形式对下面的程序段进行改写。下面的程序段进行改写。 MOV AX,s1MOV AX,s1 s1 EQU WORD PTR BX s1 EQU WORD PTR BX s2 EQU BX+SI s2 EQU BX+SI s3 EQU BX s3 EQU BX MOV BX,s3 MOV BX,s3 MOV CX,s2 MOV CX,s2 MOV DX,s25 MOV DX,

55、s25v【解解】改写的结果如下:改写的结果如下: MOV AX,WORD PTR BXMOV AX,WORD PTR BX MOV BX, BX MOV BX, BX MOV CX,BX+SI MOV CX,BX+SI MOV DX,BX+SI+5 MOV DX,BX+SI+5v4.2.5 INCLUDE4.2.5 INCLUDE伪指令伪指令v【伪指令格式伪指令格式】vINCLUDE INCLUDE 文件名文件名 v【功能功能】告诉汇编程序,把告诉汇编程序,把“文件名文件名”所指出的文本文件的内容调到所指出的文本文件的内容调到INCLUDEINCLUDE伪指令所在处,对拼装后的源伪指令所在处,

56、对拼装后的源程序进行汇编。程序进行汇编。 vINCLUDEINCLUDE伪指令将在第伪指令将在第5 5章子程序调用章子程序调用中使用,在此不再作阐述。中使用,在此不再作阐述。4.3.1 4.3.1 算术运算类指令算术运算类指令v1 1、带进位的加法指令、带进位的加法指令v【指令格式指令格式】ADC ADC D, SD, S v【功能功能】把目的操作数把目的操作数D D、源操作数、源操作数S S以及进位标志以及进位标志CFCF的值相加,结果送回的值相加,结果送回D D中。中。 4.3 4.3 常用数据处理指令常用数据处理指令v【说明说明】这条指令与这条指令与ADDADD指令相比,指令相比,仅仅是

57、参与加法运算的加数多了仅仅是参与加法运算的加数多了CFCF。vADCADC指令与指令与ADDADD指令在对操作数的寻址指令在对操作数的寻址方式要求上,以及运算结果对标志位方式要求上,以及运算结果对标志位的设置方法上都是一样的。的设置方法上都是一样的。v该指令主要用于多字节整数相加。该指令主要用于多字节整数相加。 v【例例4-94-9】设变量设变量x x和和y y中各放有中各放有一个双字型整数,存储方式符一个双字型整数,存储方式符合合“高字节在高地址,低字节高字节在高地址,低字节在低地址在低地址”的规定,试编写程的规定,试编写程序段计算序段计算x xy y,结果放回,结果放回x x中。中。v【分

58、析分析】这个问题的解决方法与手工计算这个问题的解决方法与手工计算两个十进制的两位数是一致的。比如计算两个十进制的两位数是一致的。比如计算37374646,先用个位数的,先用个位数的7 7与与6 6相加,结果写相加,结果写本位的本位的3 3并记下进位值并记下进位值1 1,然后用十位上,然后用十位上3 3加加4 4再加个位来的进位再加个位来的进位1 1,结果写,结果写8 8。v这里个位相当于双字型整数的低字部分,这里个位相当于双字型整数的低字部分,十位相当于高字部分。低位的加法只有两十位相当于高字部分。低位的加法只有两个加数,当然用个加数,当然用ADDADD指令,并把进位情况指令,并把进位情况反映

59、到反映到CFCF上。高位相加时要考虑低位来的上。高位相加时要考虑低位来的进位,当然用进位,当然用ADCADC指令进行高位加法。指令进行高位加法。 v【解解】 MOV MOV AX,yAX,y ADD ADD x,AXx,AX MOV AX,y+2 MOV AX,y+2 ADC x+2,AX ADC x+2,AX v2.2.加加1 1指令指令v【指令格式指令格式】INC INC D Dv【功能功能】把操作数把操作数D D加加1 1后的结果送回后的结果送回D D中。中。 v【说明说明】 v(1 1)这是一条单操作数指令,要求操)这是一条单操作数指令,要求操作数作数D D必须是寄存器或内存型,且不能

60、是必须是寄存器或内存型,且不能是段寄存器。如果是内存型,必须能够确段寄存器。如果是内存型,必须能够确定定D D的类型。的类型。D D本身不能确定类型时,在本身不能确定类型时,在D D的前面加上的前面加上BYTE PTRBYTE PTR或或WORD PTRWORD PTR指明类指明类型。型。 v(2 2)该指令对条件标志位的影响是:)该指令对条件标志位的影响是:SFSF和和ZFZF根据实际情况设置,对根据实际情况设置,对CFCF没有影没有影响,对于响,对于OFOF,当执行前操作数是字节型,当执行前操作数是字节型的的7FH7FH或是字型的或是字型的7FFFH7FFFH时,执行后把时,执行后把OFO

61、F置置1 1,其余情况都把,其余情况都把OFOF置置0 0。vINCINC指令可以用来把操作数的值加指令可以用来把操作数的值加1 1,它与它与ADD D,1ADD D,1的差别主要在于对标志位的差别主要在于对标志位CFCF的影响上。的影响上。v【例例4-104-10】设变量设变量bufbuf中存放了中存放了一个以回车符结束的字符串,编一个以回车符结束的字符串,编写程序段统计出串中有多少个空写程序段统计出串中有多少个空格,结果放在格,结果放在AXAX中。中。v【解解】v LEA LEA BX,bufBX,buf v MOV AX,0 MOV AX,0v lab1: CMP BYTE PTR BX

62、,13 lab1: CMP BYTE PTR BX,13 v JE lab3 JE lab3v CMP BYTE PTR BX,20H CMP BYTE PTR BX,20Hv JNZ lab2 JNZ lab2v INC AX INC AXv lab2: INC BX lab2: INC BXv JMP lab1 JMP lab1v Lab3: Lab3: v3.3.带借位的减法指令带借位的减法指令v【指令格式指令格式】SBB D, S SBB D, S v【功能功能】用目的操作数用目的操作数D D减去源操作数减去源操作数S S,再减去,再减去CFCF的值,结果送到的值,结果送到D D中。中

63、。 v除了多减一个除了多减一个CFCF的值外,的值外,SBBSBB指令与指令与SUBSUB指令在对操作数的寻址方式以及对标志指令在对操作数的寻址方式以及对标志位的影响上是一样的。位的影响上是一样的。v这条指令主要用于多字节型整数的减法。这条指令主要用于多字节型整数的减法。 v4.4.减减1 1指令指令 v【指令格式指令格式】DEC DEC d d v【功能功能】把操作数把操作数d d的值减的值减1 1后,结果送后,结果送回回d d中。中。 v对操作数寻址方式的要求与对操作数寻址方式的要求与INCINC相同。相同。DECDEC指令不影响指令不影响CFCF;SFSF和和ZFZF根据实际情况根据实际

64、情况设置;对于设置;对于OFOF,当执行前操作数是字节,当执行前操作数是字节型的型的80H80H或字型的或字型的8000H8000H时,执行结果时,执行结果OFOF置置1 1,其余情况下,其余情况下OFOF置置0 0。 v5.5.求补操作求补操作 v【指令格式指令格式】NEG DNEG Dv【功能功能】对操作数对操作数D D按位取反后再加按位取反后再加1 1,结果送回,结果送回D D中。中。 v【说明说明】 v(1 1)这条指令的功能就是第)这条指令的功能就是第1 1章中所章中所述求补函数,它并不考虑操作数述求补函数,它并不考虑操作数d d是否是否带符号,只是按带符号,只是按 “ “取反加取反

65、加1”1”的规则的规则处理。处理。 v(2 2)对操作数寻址方式的要求与)对操作数寻址方式的要求与INCINC、DECDEC指令的要求相同。指令的要求相同。 v(3 3)对标志位的影响:)对标志位的影响:SFSF和和ZFZF按实按实际情况设置;若执行前际情况设置;若执行前D D0 0,则执行,则执行后后CFCF置置0 0,否则,否则CFCF置置1 1;若执行前;若执行前D D是是字节型的字节型的80H80H或字型的或字型的8000H8000H,则执行,则执行后后OFOF置置1 1,其余情况都将使,其余情况都将使OFOF置置0 0。v6 6符号数乘法指令符号数乘法指令 v【指令格式指令格式】IM

66、UL IMUL S Sv【功能功能】带符号数的乘法指令。当带符号数的乘法指令。当S S是是字节型时,把字节型时,把ALSALS的结果放到的结果放到AXAX中;中;当当S S是字型时,把是字型时,把AXSAXS的结果放到的结果放到DXDX与与AXAX构成的双字中,构成的双字中,DXDX放高放高1616位,位,AXAX放低放低1616位。不论操作数位。不论操作数S S中的数据来源中的数据来源如何,都当作带符号数。如何,都当作带符号数。 v7.7.符号数除法指令符号数除法指令 v【指令格式指令格式】IDIV SIDIV S v【功能功能】带符号数除法指令。当带符号数除法指令。当S S是字是字节型时,

67、用节型时,用AXSAXS,商放在,商放在ALAL中,余数中,余数放在放在AHAH中;当中;当S S是字型时,用是字型时,用DXDX和和AXAX组组成的双字作被除数,除以成的双字作被除数,除以S S的商放在的商放在AXAX中,余数放在中,余数放在DXDX中。如果商超出数据的中。如果商超出数据的有效范围,将作为除法溢出处理,在屏有效范围,将作为除法溢出处理,在屏幕上显示幕上显示“Divide Overflow”Divide Overflow”字样,字样,并结束程序的执行。并结束程序的执行。 v8 8数据符号扩展指令数据符号扩展指令v字节型符号扩展字节型符号扩展 v【指令格式指令格式】 CBW CB

68、W v【功能功能】对对ALAL中的带符号数进行符中的带符号数进行符号扩展,当号扩展,当AL0AL0时,时,AHAH被赋值为被赋值为0FFH0FFH,否则,否则AHAH被置为被置为0 0。该指令不影。该指令不影响所有标志位。响所有标志位。 vCBWCBW指令用来把一个指令用来把一个8 8位的带符号数转位的带符号数转换成与其等值的换成与其等值的1616位带符号数,要求位带符号数,要求原数据放在原数据放在ALAL中,而转换结果放在中,而转换结果放在AXAX中,并且中,并且AXAX中的低中的低8 8位部分位部分( (即即AL)AL)不不变。这条指令的功能可以用下面的程变。这条指令的功能可以用下面的程序

69、段实现:序段实现: v CMP AL,0CMP AL,0v JL lab1 JL lab1v MOV AH,0 MOV AH,0v JMP lab2 JMP lab2v lab1: MOV AH,0FFH lab1: MOV AH,0FFHv lab2: lab2: vCBWCBW指令一般与指令一般与IDIVIDIV指令配合使用。当指令配合使用。当程序中需要把一个字节型带符号数去除程序中需要把一个字节型带符号数去除以另一个字节型带符号数时,按以另一个字节型带符号数时,按IDIVIDIV指指令的要求,必须把字型的被除数放在令的要求,必须把字型的被除数放在AXAX中。为此就需要用中。为此就需要用CBWCBW指令把放在指令把放在ALAL中中的字节型被除数进行符号扩展,变成字的字节型被除数进行符号扩展,变成字型,然后才能用型,然后才能用IDIVIDIV指令进行除法操作。指令进行除法操作。 v2 2)字型符号扩展)字型符号扩展 v【指令格式指令格式】CWD CWD v【功能功能】对对AXAX中的带符号数进行符号扩中的带符号数进行符号扩展,当展,当AX0AX0X0Y Y 0 0 X=0X=0 1 1 X0X0

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号