微机原理、汇编语言及接口技术:第3章:汇编语言程序设计-1

上传人:公**** 文档编号:570209753 上传时间:2024-08-02 格式:PPT 页数:98 大小:807.50KB
返回 下载 相关 举报
微机原理、汇编语言及接口技术:第3章:汇编语言程序设计-1_第1页
第1页 / 共98页
微机原理、汇编语言及接口技术:第3章:汇编语言程序设计-1_第2页
第2页 / 共98页
微机原理、汇编语言及接口技术:第3章:汇编语言程序设计-1_第3页
第3页 / 共98页
微机原理、汇编语言及接口技术:第3章:汇编语言程序设计-1_第4页
第4页 / 共98页
微机原理、汇编语言及接口技术:第3章:汇编语言程序设计-1_第5页
第5页 / 共98页
点击查看更多>>
资源描述

《微机原理、汇编语言及接口技术:第3章:汇编语言程序设计-1》由会员分享,可在线阅读,更多相关《微机原理、汇编语言及接口技术:第3章:汇编语言程序设计-1(98页珍藏版)》请在金锄头文库上搜索。

1、第第3 3章章汇编语言的特点汇编语言的特点汇汇编编语语言言是是一一种种以以处处理理器器指指令令系系统统为为基基础础的的低低级级程程序序设设计计语语言言,它它采采用用助助记记符符表表达达指指令令操操作作码码,采用标识符号表示指令操作数采用标识符号表示指令操作数利利用用汇汇编编语语言言编编写写程程序序的的主主要要优优点点是是可可以以直直接接、有有效效地地控控制制计计算算机机硬硬件件,因因而而容容易易创创建建代代码码序序列列短小、运行快速的可执行程序短小、运行快速的可执行程序在在有有些些应应用用领领域域,汇汇编编语语言言的的作作用用是是不不容容置置疑疑和和无可替代的无可替代的汇汇编编程程序序设设计计

2、的的过过程程是是与与其其他他高高级级语语言言程程序序设设计计大致相同大致相同第第3章:汇编语言程序设计章:汇编语言程序设计教学重点汇编语言源程序格式与开发汇编语言源程序格式与开发常量、变量和标号常量、变量和标号汇编语言程序设计方法汇编语言程序设计方法顺序程序设计顺序程序设计分支程序设计分支程序设计循环程序设计循环程序设计子程序设计子程序设计3.1 汇编语言源程序格式汇编语言源程序格式完整的汇编语言源程序由段组成完整的汇编语言源程序由段组成一一个个汇汇编编语语言言源源程程序序可可以以包包含含若若干干个个代代码码段段、数数据据段段、附附加加段段或或堆堆栈栈段段,段段与与段段之之间间的的顺顺序序可可

3、随随意排列意排列需需独独立立运运行行的的程程序序必必须须包包含含一一个个代代码码段段,并并指指示示程序执行的程序执行的起始点起始点,一个程序只有一个起始点,一个程序只有一个起始点所所有有的的可可执执行行性性语语句句必必须须位位于于某某一一个个代代码码段段内内,说明性语句可根据需要位于任一段内说明性语句可根据需要位于任一段内通常,程序还需要一个堆栈段通常,程序还需要一个堆栈段 源程序由语句序列构成汇编语言的语句格式汇编语言的语句格式执执行行性性语语句句执执行行性性语语句句用用于于表表达达处处理理器器指指令令(也也称称为为硬硬指指令令),汇汇编编后后对对应应一一条条指指令令代代码码。由由处处理理器

4、器指指令令组组成成的的代代码码序序列列是程序设计的主体是程序设计的主体标号标号: 硬指令助记符硬指令助记符 操作数操作数,操作数操作数 ;注释注释说说明明性性语语句句说说明明性性语语句句用用于于表表达达伪伪指指令令,指指示示源源程程序序如如何何汇汇编编、变变量量怎怎样样定定义义、过程怎么设置等过程怎么设置等名字名字 伪指令助记符伪指令助记符 参数参数,参数参数, ;注释注释硬指令与伪指令硬指令与伪指令硬硬指指令令(Instruction)使使CPU产产生生动动作作、并并在程序执行时才处理的在程序执行时才处理的指令指令硬硬指指令令就就是是第第2章章学学习习的的处处理理器器指指令令,与与具具体体的

5、的处处理器有关、与汇编程序无关理器有关、与汇编程序无关伪伪指指令令(Directive)不不产产生生CPU动动作作、在在程程序执行前由汇编程序处理的说明性序执行前由汇编程序处理的说明性指令指令伪伪指指令令与与具具体体的的处处理理器器类类型型无无关关,但但与与汇汇编编程程序序有关有关。不同版本的汇编程序支持不同的伪指令。不同版本的汇编程序支持不同的伪指令 硬指令和伪指令采用易于记忆的符号表达,这就是助记符标号、名字与标识符标号、名字与标识符标标号号是是反反映映硬硬指指令令位位置置(逻逻辑辑地地址址)和和属属性性的的标标识符,后跟一个冒号分隔识符,后跟一个冒号分隔名名字字是是反反映映伪伪指指令令位

6、位置置(逻逻辑辑地地址址)和和属属性性的的标标识符,后跟空格或制表符分隔,没有冒号识符,后跟空格或制表符分隔,没有冒号标标识识符符(Identifier)一一般般最最多多由由31个个字字母母、数数字字及及规规定定的的特特殊殊符符号号(如如 _、$、?、)组组成成,不不能能以以数数字字开开头头。默默认认情情况况下下,汇汇编编程程序序不不区区别别标标识符中的字母大小写识符中的字母大小写一一个个源源程程序序中中,每每个个标标识识符符的的定定义义是是唯唯一一的的,还还不能是汇编语言采用的不能是汇编语言采用的保留字保留字保留字保留字保保留留字字(Reserved Word)是是汇汇编编程程序序已已经经利

7、用的标识符(也称为关键字),主要有:利用的标识符(也称为关键字),主要有:硬指令助记符硬指令助记符例如:例如:MOV、ADD伪指令助记符伪指令助记符例如:例如:DB、DW操作符操作符例如:例如:OFFSET、PTR寄存器名寄存器名例如:例如:AX、CS预定义符号预定义符号例如:例如:data 汇编语言大小写不敏感操作数和参数操作数和参数处处理理器器指指令令的的操操作作数数可可以以是是立立即即数数、寄寄存存器器和存储单元和存储单元伪伪指指令令的的参参数数可可以以是是常常数数、变变量量名名、表表达达式式等,可以有多个,参数之间用逗号分隔等,可以有多个,参数之间用逗号分隔注释注释语语句句中中由由分分

8、号号“;”开开始始的的部部分分为为注注释释内内容容,用以增加源程序的可读性用以增加源程序的可读性必必要要时时,一一个个语语句句行行也也可可以以由由分分号号开开始始作作为为阶段性注释阶段性注释汇汇编编程程序序在在翻翻译译源源程程序序时时将将跳跳过过该该部部分分,不不对它们做任何处理对它们做任何处理分隔符分隔符语句的语句的4个组成部分要用分隔符分开个组成部分要用分隔符分开标号后用冒号,注释前用分号标号后用冒号,注释前用分号操作数之间和参数之间使用逗号分隔操作数之间和参数之间使用逗号分隔其他部分通常采用空格或制表符其他部分通常采用空格或制表符多个空格和制表符的作用与一个相同多个空格和制表符的作用与一

9、个相同MASM支持续行符支持续行符 “”例例3.1 在屏幕上显示一段信息在屏幕上显示一段信息; ;数据段(定义要显示的字符串)数据段(定义要显示的字符串)stringstringdbdbHelloHello, , A As ss se em mb bl ly y ! !,0dh,0ah,0dh,0ah,$ $; ;代码段(显示字符串的程序)代码段(显示字符串的程序)movmov dx,offsetdx,offset string stringmovmov ah,9 ah,9intint 21h 21hHello, Assembly !程序功能程序功能第第3章:章:3.1.1简化段定义格式简化段

10、定义格式.model small;定义程序的;定义程序的存储模式存储模式(小型模式)(小型模式).stack;定义;定义堆栈段堆栈段(默认是(默认是1KB空间)空间).data;定义;定义数据段数据段;数据定义;数据定义.code;定义;定义代码段代码段start: mov ax,data;程序;程序开始点开始点mov ds,ax;设置;设置DS指向用户定义的数据段指向用户定义的数据段;程序代码;程序代码mov ax,4c00hint 21h;程序终止点,返回;程序终止点,返回DOS;子程序代码;子程序代码end start;汇编结束,同时指明程序起始点;汇编结束,同时指明程序起始点start

11、第一个源程序文件第一个源程序文件wj0301.asm;wj0301.asm.model small.stack.datastringstringdb db Hello, Assembly !Hello, Assembly !,0dh,0ah,0dh,0ah,$ $.codestart:mov ax,datamov ds,axmovmov dx,offsetdx,offset string stringmovmov ah,9 ah,9intint 21h 21hmov ax,4c00hint 21hend start汇编语言程序的开发过程(附录汇编语言程序的开发过程(附录B)编编辑辑文本编辑器,

12、如文本编辑器,如 EDIT.COM源程序:文件名源程序:文件名.asm汇汇编编汇编程序,如汇编程序,如 ML.EXE目标模块:文件名目标模块:文件名.obj连连接接连接程序,如连接程序,如 LINK.EXE可执行文件:文件名可执行文件:文件名.exe调调试试调试程序,如调试程序,如 DEBUG.EXE应用程序应用程序错误错误错误错误错误错误错误错误开发过程开发过程1:源程序的编辑:源程序的编辑源程序文件要以源程序文件要以ASMASM为扩展名为扩展名源源程程序序文文件件的的形形成成(编编辑辑)可可以以通通过过任任何何一个文本编辑器实现一个文本编辑器实现: :DOSDOS中的全屏幕文本编辑器中的全

13、屏幕文本编辑器EDITEDIT其他程序开发工具中的编辑环境其他程序开发工具中的编辑环境WindowsWindows中的记事本中的记事本NotepadNotepadEDIT wj0301.asm开发过程开发过程2:源程序的汇编(:源程序的汇编(MASM 6.x)汇汇编编是是将将源源程程序序翻翻译译成成由由机机器器代代码码组组成成的的目标模块文件的过程目标模块文件的过程MASM 6.x提供的汇编程序是提供的汇编程序是ML.EXE:ML /c wj0301.asm源源程程序序中中没没有有语语法法错错误误,MASM将将自自动动生生成成一一个个目目标标模模块块文文件件(wj0301.obj);否否则则M

14、ASM将将给给出出相相应应的的错错误误信信息息。这这时时应应根据错误信息,重新编辑修改,再次汇编根据错误信息,重新编辑修改,再次汇编开发过程开发过程2:源程序的汇编(生成列表文件):源程序的汇编(生成列表文件)汇汇编编过过程程中中,可可以以通通过过参参数数选选择择生生成成列列表表文文件件(.LST.LST)。列列表表文文件件是是一一种种文文本本文文件件,含含有有源源程程序序和和目目标标代代码码,对对我我们们学学习习汇汇编编语语言言程序设计和发现错误很有用程序设计和发现错误很有用汇汇编编程程序序ML.EXE可可带带其其他他参参数数,为为了了生生成成列表文件,命令是:列表文件,命令是:ML /c

15、/Fl wj0301.asm该命令产生:模块文件该命令产生:模块文件wjl301.obj 列表文件列表文件wjl301.lst开发过程开发过程3:目标模块的连接:目标模块的连接连连接接程程序序能能把把一一个个或或多多个个目目标标文文件件和和库库文文件件合合成成一个可执行程序(一个可执行程序(.EXE.EXE、.COM.COM文件):文件):LINK wj0301.obj;如如果果没没有有严严重重错错误误,LINK将将生生成成一一个个可可执执行行文文件件(wj0301.exe);否否则则将将提提示示相相应应的的错错误误信信息息。这这时时需需要要根根据据错错误误信信息息重重新新修修改改源源程程序序

16、文文件件后后再再汇编、链接,直到生成可执行文件汇编、链接,直到生成可执行文件ML.EXE汇汇编编程程序序(MASM MASM 6.x6.x)可可自自动动调调用用LINK连接程序,实现汇编和连接的依次进行连接程序,实现汇编和连接的依次进行ML wj0301.asm开发过程开发过程4:可执行程序的调试:可执行程序的调试经经汇汇编编、连连接接生生成成的的可可执执行行程程序序在在操操作作系系统统下只要输入文件名就可以运行:下只要输入文件名就可以运行:wj0301操作系统装载该文件进入主存,并开始运行操作系统装载该文件进入主存,并开始运行如如果果出出现现运运行行错错误误,可可以以从从源源程程序序开开始始

17、排排错错,也可以利用调试程序帮助发现错误也可以利用调试程序帮助发现错误采用采用DEBUG.EXEDEBUG.EXE调试程序:调试程序:DEBUG wj0301.exe1. 存储模式(存储模式(Memory Model)存存储储模模式式决决定定了了一一个个程程序序的的规规模模,也也确确定定了了子子程程序序调调用用、指指令令转转移移和和数数据据访访问问等等的的缺省属性缺省属性当当使使用用简简化化段段定定义义的的源源程程序序格格式式时时,必必须须有有存存储储模模式式.MODEL语语句句,且且位位于于所所有有简简化化段定义语句之前。其格式为:段定义语句之前。其格式为:.MODEL 存储模式存储模式.M

18、ODEL语语句句确确定定了了程程序序采采用用的的存存储储模模式式,MASM有有7种可以选择,如种可以选择,如表表3.1所示所示 本课程学习过程中,均采用小型模式SMALL2. 逻辑段的简化定义逻辑段的简化定义.STACK 大小大小;堆堆栈栈段段定定义义伪伪指指令令.STACK创创建建一一个个堆堆栈栈段段,段段名名是是:STACK。可可选选的的“大大小小”参参数数指指定定堆堆栈栈段段所所占占存存储储区区的的字字节数,默认是节数,默认是1KB(1024400H字节)字节).DATA;数数据据段段定定义义伪伪指指令令.DATA创创建建一一个个数数据据段段,段段名名是是:_DATA。数据段名可用。数据

19、段名可用DATA预定义标识符表示预定义标识符表示.CODE 段名段名;代代码码段段定定义义伪伪指指令令.CODE创创建建一一个个代代码码段段,可可选选的的“段段名名”参参数数指指定定该该代代码码段段的的段段名名。如如果果没没有有给给出出段段名名,则则采采用默认段名用默认段名 一个段的开始自动结束前面的一个段 简化段定义伪指令之前,需有存储模式语句3. 程序开始程序开始为为了了指指明明程程序序开开始始执执行行的的位位置置,需需要要使使用用一一个个标标号(例题中采用了号(例题中采用了start标识符)标识符)连连接接程程序序会会根根据据程程序序起起始始点点正正确确地地设设置置CS和和IP值值,根据

20、程序大小和堆栈段大小设置根据程序大小和堆栈段大小设置SS和和SP值值连连接接程程序序没没有有设设置置DS和和ES值值。程程序序如如果果使使用用数数据段或附加段,必须明确给据段或附加段,必须明确给DS或或ES赋值赋值大多数程序需要数据段,程序的执行开始应是:大多数程序需要数据段,程序的执行开始应是:start:mov ax,data;data表示数据段的段地址表示数据段的段地址mov ds,ax ;设置设置DS4. 程序终止程序终止应应用用程程序序执执行行结结束束,应应该该将将控控制制权权交交还还操操作系统作系统汇汇编编语语言言程程序序设设计计中中,有有多多种种返返回回DOS的的方方法法,但但一

21、一般般利利用用DOS功功能能调调用用的的4CH子子功功能能实实现现,它它需需要要的的入入口口参参数数是是AL返返回回数码(通常用数码(通常用0表示程序没有错误)表示程序没有错误)于是,应用程序的终止代码就是:于是,应用程序的终止代码就是:mov ax,4c00hint 21h5. 汇编结束汇编结束汇汇编编结结束束表表示示汇汇编编程程序序到到此此结结束束将将源源程程序序翻译成目标模块代码的过程翻译成目标模块代码的过程源程序的最后必须有一条源程序的最后必须有一条END伪指令伪指令END 标号标号可可选选的的“标标号号”参参数数指指定定程程序序开开始始执执行行点点,连连接接程程序序据据此此设设置置C

22、S和和IP值值(例例题题中中采采用用了了start标识符)标识符) 不要糊涂程序终止和汇编结束是两码事第一个源程序文件第一个源程序文件wj0301.asm;wj0301.asm.model small.stack.datastringstringdb db Hello, Assembly !Hello, Assembly !,0dh,0ah,0dh,0ah,$ $.codestart:mov ax,datamov ds,axmovmov dx,offsetdx,offset string stringmovmov ah,9 ah,9intint 21h 21hmov ax,4c00hint 2

23、1hend start6. 可执行程序的结构可执行程序的结构DOS操作系统支持两种可执行程序结构操作系统支持两种可执行程序结构1. EXE程序程序程程序序可可以以有有多多个个代代码码段段和和多多个个数数据据段段,程程序序长长度可以超过度可以超过64KB通常生成通常生成EXE结构的可执行程序结构的可执行程序2. COM程序程序只有一个逻辑段,程序长度不超过只有一个逻辑段,程序长度不超过64KB需需要要满满足足一一定定条条件件才才能能生生成成COM结结构构的的可可执执行程序(行程序(MASM 6.x需要采用需要采用TINY模式)模式)第第3章:章:3.1.2 完整段定义格式完整段定义格式完完整整段

24、段定定义义利利用用SEGMENT和和ENDS一一对对伪伪指令定义逻辑段指令定义逻辑段同同时时需需要要配配合合ASSUME伪伪指指令令指指明明逻逻辑辑段段是代码段、堆栈段、数据段还是附加段是代码段、堆栈段、数据段还是附加段完完整整段段定定义义的的优优势势是是可可以以指指明明逻逻辑辑段段的的定定位位、组组合合、类类别别等等属属性性;而而简简化化段段定定义义只只能能采采用用系统默认的属性系统默认的属性完整段定义和简化段定义的实质是一致的完整段定义和简化段定义的实质是一致的3.2 常量、变量和属性常量、变量和属性 汇编语言的数据可以简单分为常量和变量汇编语言的数据可以简单分为常量和变量常常量量可可以以

25、作作为为硬硬指指令令的的立立即即数数或或伪伪指指令令的的参参数,数,变量变量主要作为存储器操作数主要作为存储器操作数汇汇编编语语言言语语句句中中的的名名字字和和标标号号具具有有逻逻辑辑地地址址和和类类型型属属性性,主主要要用用做做地地址址操操作作数数,也也可可以以作为立即数和存储器操作数作为立即数和存储器操作数本本节节将将详详细细讨讨论论语语句句中中的的参参数数和和操操作作数数、名名字和标号,并引出相关的伪指令和操作符字和标号,并引出相关的伪指令和操作符3.2.1 常量常量常量表示一个固定的数值,它又分成多种形式常量表示一个固定的数值,它又分成多种形式1.常数2.字符串3.符号常量4.数值表达

26、式1. 常数常数指指由由10、16、2和和8进进制制形形式式表表达达的的数数值值,各各种种进进制制的的数数据据以以后后缀缀字字母母区区分分,默默认认不不加加后后缀缀字字母母的的是十进制数是十进制数十进制十进制由由0 9数数字字组组成成,以以字字母母D(d)结结尾(缺省情况可以省略)尾(缺省情况可以省略)100,255D十六进制十六进制由由0 9、A F数数字字组组成成,以以字字母母H(h)结结尾尾,以以字字母母开开头头的的常常数数需需要加一个前导要加一个前导064H,0FFH0B800H二进制二进制由由 0和和 1两两 个个 数数 字字 组组 成成 , 以以 字字 母母B(b)结尾)结尾011

27、00100B2. 字符串字符串字字符符串串常常量量是是用用单单引引号号或或双双引引号号括括起起来来的的单个字符或多个字符单个字符或多个字符其其数值是每个字符对应的数值是每个字符对应的ASCII码值码值例如:例如:d(等于(等于64H)AB(等于(等于4142H)Hello, Assembly !3. 符号常量符号常量符号常量使用标识符表达一个数值符号常量使用标识符表达一个数值MASM提供等价机制,用来为常量定义符号名提供等价机制,用来为常量定义符号名符号定义伪指令有符号定义伪指令有“等价等价EQU”和和“等号等号”:符号名符号名 EQU 数值表达式数值表达式符号名符号名 EQU 符号名符号名

28、数值表达式数值表达式EQU用用于于数数值值等等价价时时不不能能重重复复定定义义符符号号名名,但但“”允许有重复赋值。例如:允许有重复赋值。例如:X= 7;等效于:;等效于:X qeu 7X= X+5;“X EQU X+5”是错误的是错误的4. 数值表达式数值表达式数数值值表表达达式式一一般般是是指指由由运运算算符符连连接接的的各各种种常常量量所所构成的表达式构成的表达式汇汇编编程程序序在在汇汇编编过过程程中中计计算算表表达达式式,最最终终得得到到一一个确定的数值,所以也是常量个确定的数值,所以也是常量表表达达式式的的数数值值在在程程序序运运行行前前的的汇汇编编阶阶段段计计算算,所所以组成表达式

29、的各部分必须在汇编时就能确定以组成表达式的各部分必须在汇编时就能确定汇编语言支持多种运算符(汇编语言支持多种运算符(表表3-3)我们经常使用的是加减乘除(我们经常使用的是加减乘除( * / )例如:例如:mov ax,3*4+5;等价于:;等价于:mov ax,173.2.2 变量变量 变变量量实实质质上上是是指指主主存存单单元元的的数数据据,虽虽然然内内存存单单元元地址不变,但其中存放的数据可以改变地址不变,但其中存放的数据可以改变变量需要事先定义才能使用变量需要事先定义才能使用变变量量定定义义(Define)伪伪指指令令为为变变量量申申请请固固定定长长度度为为单单位位的的存存储储空空间间,

30、并并可可以以同同时时将将相相应应的的存存储储单单元初始化元初始化定定义义后后的的变变量量可可以以利利用用变变量量名名等等方方法法引引用用其其中中的的数据,即变量的数值数据,即变量的数值1. 变量的定义变量的定义 变量定义的汇编语言格式为:变量定义的汇编语言格式为:变量名变量名 伪指令伪指令 初值表初值表变变量量名名为为用用户户自自定定义义标标识识符符,表表示示初初值值表表首首元元素素的的逻逻辑辑地地址址,常常称称为为符符号号地地址址。变变量量名名也也可可以以没没有有初初值值表表是是用用逗逗号号分分隔隔的的参参数数,主主要要由由常常量量、数数值值表表达式或达式或“?”组成。其中组成。其中“?”表

31、示未赋初值表示未赋初值多多个个存存储储单单元元如如果果初初值值相相同同,可可以以用用复复制制操操作作符符DUP进行定义:进行定义:重复次数重复次数 DUP(重复参数重复参数)变量定义伪指令有变量定义伪指令有DB、DW、DD等(等(表表3-4)字节变量的定义字节变量的定义DB(Define Byte)DB伪伪指指令令用用于于分分配配一一个个或或多多个个字字节节单单元元,并可以将它们初始化为指定值并可以将它们初始化为指定值初初值值表表中中每每个个数数据据一一定定是是字字节节量量,存存放放一一个个8位数据:位数据:可以是可以是0255的无符号数的无符号数或是或是128127带符号数带符号数也可以是字

32、符串常数也可以是字符串常数字节变量定义实例字节变量定义实例;数据段;数据段Xdb a,-5db 2 dup(100),?Ydb ABC字节变量的应用字节变量的应用mov al,X;此处;此处X表示它的第表示它的第1个数据,故个数据,故ALadec X+1;对;对X为始的第为始的第2个数据减个数据减1,故成为,故成为6mov Y,al;现在;现在Y这个字符串成为这个字符串成为 aBC字变量的定义字变量的定义DW(Define Word)DW伪伪指指令令用用于于分分配配一一个个或或多多个个字字单单元元,并并可以将它们初始化为指定值可以将它们初始化为指定值初初值值表表中中每每个个数数据据是是字字量量

33、,一一个个字字单单元元可可用于存放任何用于存放任何16位数据:位数据:一个段地址一个段地址一个偏移地址一个偏移地址两个字符两个字符065535之间的无符号数之间的无符号数3276832767之间的带符号数之间的带符号数字变量定义实例字变量定义实例;数据段;数据段countdw 8000h,?,ABmaxintequ 64hnumberdw maxintarraydw maxint dup(0)双字变量的定义双字变量的定义DD(Define Double word)DD伪伪指指令令用用于于分分配配一一个个或或多多个个双双字字单单元元,并可以将它们初始化为指定值并可以将它们初始化为指定值初值表中每

34、个数据是一个初值表中每个数据是一个3232位的双字量:位的双字量:可以是有符号或无符号的可以是有符号或无符号的3232位整数位整数也也可可以以用用来来表表达达1616位位段段地地址址(高高位位字字)和和1616位位的偏移地址(低位字)的远指针的偏移地址(低位字)的远指针varddvarddDD 0,?,12345678hDD 0,?,12345678hfarpointfarpoint DD 00400078hDD 00400078h2. 变量的应用变量的应用变量变量具有存储单元的逻辑地址具有存储单元的逻辑地址程序代码中程序代码中通过变量名引用其指向的首个数据通过变量名引用其指向的首个数据通通过

35、过变变量量名名加加减减位位移移量量存存取取以以首首个个数数据据为为基基地地址的前后数据址的前后数据 例题例题3.2 变量的定义和应用变量的定义和应用例题例题3.2 变量的定义变量的定义 ;数据段数据段bvar1db 100,01100100b,64h,d;字节变量:不同进制表达同一个数值,内存中有字节变量:不同进制表达同一个数值,内存中有4个个64Hminint = 5;符号常量:;符号常量:minint数值为数值为5,不占内存空间,不占内存空间bvar2db -1,minint,minint+5;内存中数值依次为;内存中数值依次为FFH,5,0AHdb ?,2 dup(20h);预留一个字节

36、空间,重复定义了;预留一个字节空间,重复定义了2个数值个数值20Hwvar1 dw 2010h,4*4;字变量:两个数据是;字变量:两个数据是2010H、0010H,共占,共占4个字节个字节wvar2 dw ?;wvar2是没有初值的字变量是没有初值的字变量例题例题3.2 变量的定义(续)变量的定义(续)dvardd 12347777h,87651111h,?;双字变量:;双字变量:2个双字数据,一个双字空间个双字数据,一个双字空间abcdb a,b,c,?;定义字符,实际是字节变量定义字符,实际是字节变量maxint equ 0ah;符号常量:符号常量:maxint10string db A

37、BCDEFGHIJ;定义字符串:使用字节定义;定义字符串:使用字节定义DB伪指令伪指令crlfsdb 13,10,$;回车符;回车符0DH、换行符、换行符0AH和字符和字符$24Harray1 dw maxint dup(0);10个初值为个初值为0的字量,可以认为是数组的字量,可以认为是数组arraydb 2 dup(2,3,2 dup(4);6个字节内容依次为:个字节内容依次为:02 03 04 04 02 03 04 04例题例题3.2 变量的应用变量的应用;代码段;代码段mov dl,bvar1;DL100dec bvar2+1;bvar2+14mov abc3,dl;abcabcdm

38、ov ax,word ptr dvar0;取双字到;取双字到DX.AXmov dx,word ptr dvar2add ax,word ptr dvar4;加双字到;加双字到DX.AXadc dx,word ptr dvar6mov word ptr dvar8,ax;保存双字的求和结果;保存双字的求和结果mov word ptr dvar10,dx例题例题3.2 变量的应用(续)变量的应用(续)mov cx,maxint;CX10mov bx,0;BX0again:add stringbx,3;string每个数值加每个数值加3inc bxloop again;循环;循环lea dx,abc

39、;从;从abc开始开始mov ah,9;09H号号DOS功能调用功能调用int 21h;显示结果:;显示结果:abcdDEFGHIJKLM3. 变量的定位变量的定位汇汇编编程程序序按按照照指指令令的的先先后后顺顺序序一一个个接接着着一一个个分分配配存存储储空空间间,按按照照段段定定义义伪伪指指令令规规定定的的边边界界定定位位属属性确定每个逻辑段的起始位置(包括偏移地址)性确定每个逻辑段的起始位置(包括偏移地址)定位伪指令定位伪指令ORG控制数据或代码所在的偏移地址控制数据或代码所在的偏移地址ORG 参数参数ORG伪伪指指令令是是将将当当前前偏偏移移地地址址指指针针指指向向参参数数表表达达的偏移

40、地址。的偏移地址。例如:例如:ORG 100h;从;从100H处安排数据或程序处安排数据或程序ORG $+10;偏移地址加;偏移地址加10,即跳过,即跳过10个字节空间个字节空间汇编语言程序中,符号汇编语言程序中,符号“$”表示当前偏移地址值表示当前偏移地址值3.2.3 名字和标号的属性名字和标号的属性名名字字和和标标号号是是用用户户自自定定义义的的标标识识符符。名名字字指指向向一一条条伪伪指指令令,标标号号指指向向一一条条硬硬指指令令。名名字字和和标标号号一一经经使使用便具有两类属性:用便具有两类属性: 逻逻辑辑地地址址名名字字和和标标号号对对应应存存储储单单元元的的逻逻辑辑地址,含有段地址

41、和偏移地址;地址,含有段地址和偏移地址; 类类型型变变量量名名的的类类型型可可以以是是BYTE(字字节节)、WORD(字字)和和DWORD(双双字字)等等;标标号号、段段名名、子子程程序序名名的的类类型型可可以以是是NEAR(近近)和和FAR(远远),分别表示段内或段间调用,分别表示段内或段间调用汇编程序提供有关的操作符,以便获取这些属性值汇编程序提供有关的操作符,以便获取这些属性值1. 地址操作符地址操作符地址操作符地址操作符取得名字或标号的段地址和偏移地址取得名字或标号的段地址和偏移地址 将括起的表达式作为存储器地址指针将括起的表达式作为存储器地址指针 $当前偏移地址当前偏移地址 :段前缀

42、,采用指定的段地址寄存器段前缀,采用指定的段地址寄存器OFFSET 名字名字/标号标号返回名字或标号的偏移地址返回名字或标号的偏移地址SEG 名字名字/标号标号返回名字或标号的段地址返回名字或标号的段地址2. 类型操作符类型操作符类型操作符类型操作符对名字或标号的类型属性进行设置对名字或标号的类型属性进行设置类型名类型名 PTR 名字名字/标号标号其其中中可可以以是是BYTE、WORD、DWORD(依依次次表表示示字字节节、字字、双双字字)等等,或或者者是是NEAR、FAR(分分别别表表示示近、远),还可以是由结构、记录等定义的类型近、远),还可以是由结构、记录等定义的类型对变量:对变量:lL

43、ENGTHOF操操作作符符获获知知DUP定定义义的的某某变变量量名名指指向向多多少个数据项少个数据项lSIZEOF操作符获知它共占用多少字节空间操作符获知它共占用多少字节空间3.3 顺序程序设计顺序程序设计没没有有分分支支、循循环环等等转转移移指指令令的的程程序序,会会按按指指令令书书写写的的前前后后顺顺利利依依次次执执行行,这这就就是是顺顺序程序序程序顺序结构是最基本的程序结构顺序结构是最基本的程序结构完全采用顺序结构编写的程序并不多见完全采用顺序结构编写的程序并不多见例题例题3.4 顺序程序设计实例顺序程序设计实例采用查表法,实现一位采用查表法,实现一位16进制数进制数转换为转换为ASCI

44、I码显示码显示例例3.4 数据段数据段;数据段数据段ASCII db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h;对应;对应0 9的的ASCII码码db 41h,42h,43h,44h,45h,46h;对应;对应A F的的ASCII码码hexdb 04h,0bh;假设两个数据;假设两个数据例例3.4 代码段代码段 ;代码段代码段mov bx,offset ASCII;BX指向指向ASCII码表码表mov al,hex;AL取得一位取得一位16进制数进制数;恰好就是;恰好就是ASCII码表中的位移码表中的位移and al,0fh;只有低;只有低4位是有效的,高

45、位是有效的,高4位清位清0xlat;换码:;换码:ALDS:BXALXLAT例例3.4 代码段(续)代码段(续)mov dl,al;入口参数:;入口参数:DLALmov ah,2;02号号DOS功能调用功能调用int 21h;显示一个;显示一个ASCII码字符码字符mov al,hex+1;转换并显示下一个数据;转换并显示下一个数据and al,0fhxlatmov dl,almov ah,2int 21hXLAT3.4 分支程序设计分支程序设计分支程序根据条件是真或假决定执行与否分支程序根据条件是真或假决定执行与否判判断断的的条条件件是是各各种种指指令令,如如CMP、TEST等等执行后形成的

46、状态标志执行后形成的状态标志转移指令转移指令Jcc和和JMP可以实现分支控制可以实现分支控制分支结构有分支结构有单分支结构单分支结构双分支结构双分支结构多分支结构多分支结构单分支结构单分支结构 条条件件成成立立跳跳转转,否否则则顺顺序序执执行行分分支支语语句体句体注注意意选选择择正正确确的的条条件件转转移移指指令令和和转转移移目标地址目标地址实例:求绝对值实例:求绝对值计算计算AX中有符号数的绝对值中有符号数的绝对值cmpcmp ax,0 ax,0jgejge nonnegnonneg;条件满足(;条件满足(AX0AX0),转移),转移negneg ax ax;条件不满足,求补;条件不满足,求

47、补nonnegnonneg: : movmov result,axresult,ax ;保存结果;保存结果;不恰当的分支;不恰当的分支cmpcmp ax,0 ax,0jljl yesnegyesneg;条件满足(;条件满足(AXAX0 0),转移),转移jmpjmp nonnegnonnegyesnegyesneg: : negneg ax ax;条件满足,求补;条件满足,求补nonnegnonneg: : movmov result,axresult,ax ;保存结果;保存结果双分支结构双分支结构条条件件成成立立跳跳转转执执行行第第2个个分分支支语语句句体体,否否则则顺顺序序执执行第行第1个

48、分支语句体个分支语句体注注意意第第1个个分分支支体体后后一一定定要要有有一一个个JMP指指令令跳跳到到第第2个分支体后个分支体后实例:显示实例:显示BX的最高位的最高位显示显示BX的的最高位最高位shl bx,1;BX最高位移入最高位移入CF标志标志jc one;CF1,即最高位为,即最高位为1,转移,转移mov dl,30h;CF0,即最高位为,即最高位为0:DL30H0jmp two;一定要跳过另一个分支体;一定要跳过另一个分支体one:mov dl,31h;DL 31H1two:mov ah,2int 21h;显示;显示可以用可以用JNC替换替换JC显示显示BX的的最高位最高位(续)(续

49、)shl bx,1;BX最高位移入最高位移入CF标志标志jnc one;CF0,即最高位为,即最高位为0,转移,转移mov dl,31h;CF1,即最高位为,即最高位为1:DL31H1jmp two;一定要跳过另一个分支体;一定要跳过另一个分支体one:mov dl,30h;DL 30H0two:mov ah,2int 21h;显示;显示转换为单分支结构转换为单分支结构显示显示BX的的最高位最高位(另解)(另解)mov dl,0 ;DL30H0shl bx,1;BX最高位移入最高位移入CF标志标志jnc two;CF0,即最高位为,即最高位为0,转移,转移mov dl,1;CF1,即最高位为,

50、即最高位为1:DL31H1two:mov ah,2int 21h;显示;显示 编写分支程序,需留心分支的开始和结束编写分支程序,需留心分支的开始和结束显示显示BX的的最高位最高位(无分支)(无分支)mov dl,0shl bx,1;BX最高位移入最高位移入CF标志标志adc dl,30h;CF0,DL030h030H0;CF1,DL030h131H1two: mov ah,2int 21h;显示;显示例题例题3.5 显示压缩显示压缩BCD码,无前导码,无前导0;数据段数据段BCDdb 04h ;代码段代码段mov dl,BCDtest dl,0ffh ;如果;如果BCD码为码为0,显示,显示0

51、jz zero;双分支结构;双分支结构test dl,0f0h ;如果;如果BCD码高位为码高位为0,不显示,不显示0jz one;单分支结构;单分支结构例题例题3.5 显示压缩显示压缩BCD码,无前导码,无前导0(续)(续)mov cl,4;处理高位;处理高位shr dl,clor dl,30h;转换为;转换为ASCII码码mov ah,2;显示高位;显示高位int 21hmov dl,BCDand dl,0fhone:or dl,30h;处理低位;处理低位jmp twozero: mov dl,0two:mov ah,2int 21h例题例题3.6 从键盘输入一个字符串从键盘输入一个字符串

52、;数据段数据段keynum= 255keybufdb keynum; 键盘输入缓冲区键盘输入缓冲区db 0db keynum dup(0);代码段代码段mov dx,offset keybuf ;输入字符串输入字符串mov ah,0ahint 21hmov dl,0ah;再进行换行再进行换行mov ah,2int 21h例题例题3.6 大小写字母转换大小写字母转换 mov bx,offset keybuf+1 ;取出字符个数取出字符个数mov cl,bxmov ch,0;作为循环的次数作为循环的次数again: inc bxcmp dl,a;小于小写字母小于小写字母a,不需要处理,不需要处理j

53、b dispcmp dl,z;大于小写字母大于小写字母z,不需要处理,不需要处理ja dispsub dl,20h;是小写字母,则转换为大写是小写字母,则转换为大写disp:mov ah,2;显示一个字符显示一个字符int 21hloop again;循环,处理完整个字符串循环,处理完整个字符串转换原理转换原理多分支结构多分支结构多多分分支支结结构构是是多多个个条条件件对对应应各各自自的的分分支支语语句句体体,哪哪个个条条件件成成立立就就转转入入相相应分支体执行应分支体执行AH=0fuction0YNAH=1fuction1YNAH=2fuction2YNor ah,ah;cmp ah,0jz

54、 function0dec ah;cmp ah,1jz function0dec ah;cmp ah,2jz function0例题例题3.7 地址表实现多分支结构地址表实现多分支结构;数据段数据段number db 78h;假设一个数值:假设一个数值:D3位为位为1addrsdw offset fun0, ,offset fun7;取得各处理程序开始的偏移地址取得各处理程序开始的偏移地址;代码段代码段mov al,numbermov dl,?;数数值值为为0,显显示示一一个个问问号号“?”cmp al,0;排除排除AL0的特殊情况的特殊情况jz disp例题例题3.7 地址表实现多分支结构(

55、续)地址表实现多分支结构(续)mov bx,0;BX记录为记录为1的位数的位数again:shr al,1;最低位右移进入最低位右移进入CFjc next;为为1,转移,转移inc bx;不为不为1,继续,继续jmp againnext:shl bx,1;偏移地址是偏移地址是2个字节个字节jmp addrsbx;IPaddrsBXfun0:mov dl,0jmp dispdisp:mov ah,2;显示一个字符显示一个字符int 21h3.5 循环程序设计循环程序设计循循环环程程序序结结构构是是满满足足一一定定条条件件的的情情况况下下,重复执行某段程序重复执行某段程序循环结构的程序通常有循环结

56、构的程序通常有3个部分:个部分: 循循环环初初始始部部分分为为开开始始循循环环准准备备必必要要的的条条件件,如循环次数、循环体需要的数值等如循环次数、循环体需要的数值等 循循环环体体部部分分指指重重复复执执行行的的程程序序部部分分,其其中中包括对循环条件等的修改程序段包括对循环条件等的修改程序段循循环环控控制制部部分分判判断断循循环环条条件件是是否否成成立立,决决定是否继续循环定是否继续循环循环控制循环控制循环结构程序循环结构程序的设计关键是循环控制部分的设计关键是循环控制部分循循环环控控制制可可以以在在进进入入循循环环之之前前进进行行,也也可可以在循环体后进行,于是形成两种结构:以在循环体后

57、进行,于是形成两种结构:“先判断、后循环先判断、后循环”结构结构“先循环、后判断先循环、后判断”结构结构循循环环结结束束的的控控制制可可以以用用循循环环次次数数,还还可可以以用特定条件等,于是又有:用特定条件等,于是又有:计数控制循环计数控制循环条件控制循环条件控制循环图示图示先循环后判断的循环结构先循环后判断的循环结构 结束结束 初始化初始化 循环的初始状态循环的初始状态 循环体循环体 循环的工作部分循环的工作部分及修改部分及修改部分 计数控制循环计数控制循环条件控制循环条件控制循环修改部分修改部分控制条件控制条件Y YN N3.5.1 计数控制循环计数控制循环 计计数数控控制制循循环环利利

58、用用循循环环次次数数作作为控制条件为控制条件易易于于采采用用循循环环指指令令LOOP和和JCXZ实现实现初初始始化化:将将循循环环次次数数或或最最大大循循环环次数置入次数置入CX循环体循环体循循环环控控制制:用用LOOP指指令令对对CX减减1、并判断是否为、并判断是否为0例例3.8 二进制显示二进制显示BL内容内容mov cx,8;CX8(循环次数)(循环次数)again: shl bl,1;左移进;左移进CF,从高位开始显示从高位开始显示mov dl,0;MOV指令不改变指令不改变CFadc dl,30h ;DL030HCF;CF若是若是0,则,则DL 0 ;CF若是若是1,则,则DL 1

59、mov ah,2int 21h;显示;显示loop again;CX减减1,如果,如果CX未减至未减至0,则循环,则循环计数控制循环计数控制循环先循环后判断先循环后判断例例3.9 求数组元素的最大值和最小值求数组元素的最大值和最小值;数据段数据段arraydw 10;假设一个数组,其中头个数据;假设一个数组,其中头个数据10表示元素个数表示元素个数dw -3,0,20,900,587,-632,777,234,-34,-56;这是一个有符号字量元素组成的数组;这是一个有符号字量元素组成的数组maxay dw ?;存放最大值;存放最大值minay dw ?;存放最小值;存放最小值初始化:循环次数

60、元素个数初始化:循环次数元素个数1循环体:逐个比较求最大、小值循环体:逐个比较求最大、小值循环控制:比较完所有数据循环控制:比较完所有数据例例3.9 代码段代码段;代码段;代码段lea si,arraymov cx,si;取得元素个数;取得元素个数dec cx;减;减1后是循环次数后是循环次数add si,2mov ax,si;取出第一个元素给;取出第一个元素给AX,AX用于暂存最大值用于暂存最大值mov bx,ax;取出第一个元素给;取出第一个元素给BX,BX用于暂存最小值用于暂存最小值初始化例例3.9 代码段(续)代码段(续)maxck: add si,2cmp si,ax;与下一个数据比

61、较;与下一个数据比较jle minckmov ax,si;AX取得更大的数据取得更大的数据jmp nextminck:cmp si,bxjge nextmov bx,si;BX取得更小的数据取得更小的数据next:loop maxck;计数循环;计数循环mov maxay,ax ;保存最大值;保存最大值mov minay,bx;保存最小值;保存最小值循环体例例3.10 键盘输入键盘输入N,显示,显示N个个“?”mov ah,1;接受键盘输入接受键盘输入int 21hand al,0fh;只取低只取低4位位xor ah,ahmov cx,ax;作为循环次数作为循环次数jcxz done;次数为次

62、数为0,则结束,则结束again:mov dl,?;循环体循环体mov ah,2int 21hloop again;循环控制循环控制done:;结束结束“边界”问题3.5.2 条件控制循环条件控制循环条条件件控控制制循循环环需需要要利利用用特特定定条条件件判判断循环是否结束断循环是否结束条条件件控控制制循循环环用用条条件件转转移移指指令令判判断断循环条件循环条件转转移移指指令令可可以以指指定定目目的的标标号号来来改改变变程程序序的的运运行行顺顺序序,如如果果目目的的标标号号指指向向一一个个重重复复执执行行的的语语句句体体的的开开始始或或结束,便构成了循环控制结构结束,便构成了循环控制结构显示以

63、显示以0结尾的字符串结尾的字符串;数据段;数据段string db Let us have a try !,0;代码段;代码段mov bx,offset stringagain: mov dl,bxcmp dl,0jz done;为;为0结束结束mov ah,2;不为;不为0,显示,显示int 21hinc bx;指向下一个字符;指向下一个字符jmp againdone:条件控制循环条件控制循环先判断后循环先判断后循环例例3.11 记录某个字存储单元数据中记录某个字存储单元数据中1的个数的个数;数据段数据段number dw 1110111111100100B;代码段代码段mov bx,num

64、berxor dl,dl;循环初值:;循环初值:DL0again:test bx,0ffffh ;也可以用;也可以用cmp bx,0jz done;全部是;全部是0就可以退出循环,减少循环次数就可以退出循环,减少循环次数shl bx,1;用指令;用指令shr bx,1也可以也可以adc dl,0;利用;利用ADC指令加指令加CF的特点进行计数的特点进行计数jmp again条件控制循环条件控制循环先判断后循环先判断后循环例例3.11 十进制显示(十进制显示(016数值)数值)done: cmp dl,10;判断;判断1的个数是否小于的个数是否小于10jb digit;1的个数小于的个数小于10

65、,转移,转移push dxmov dl,1;1的个数大于或等于的个数大于或等于10mov ah,2;则要先显示一个;则要先显示一个1int 21hpop dxsub dl,10digit:add dl,0;显示个数;显示个数mov ah,2int 21h单分支结构单分支结构例例3.12 剔除字符串中的空格字符剔除字符串中的空格字符 ;数据段数据段stringdb Let us have a try !,0 ;以以“0”结尾结尾;代码段代码段mov di,offset stringoutlp:cmp byte ptr di,0;外循环,先判断后循环外循环,先判断后循环jz done;为为0结束结

66、束again:cmp byte ptr di, ;检测是否是空格检测是否是空格jnz next;不是空格继续循环不是空格继续循环mov si,di;是是空空格格,进进入入剔剔除除空空格格分分支支例例3.12 剔除字符串中的空格字符(续)剔除字符串中的空格字符(续) inlp:inc si;剔除空格剔除空格的循环程序段的循环程序段mov ah,si;前移一个位置前移一个位置mov si-1,ahcmp byte ptr si,0;内循环,先循环后判断内循环,先循环后判断jnz inlpjmp againnext:inc di;继续处理后续字符继续处理后续字符jmp outlpdone:;结束结束

67、3.5.3 串操作类指令串操作类指令 8088的的串串操操作作类类指指令令能能对对内内存存中中一一个个连连续续区区域域的的数数据据(如如数数组组、字字符符串串等等)进进行传送、比较等操作,指令有行传送、比较等操作,指令有:1.传送数据串:传送数据串:MOVS,STOS,LODS2.检测数据串:检测数据串:CMPS,SCAS3.重复前缀:重复前缀:REP,REPZ,REPNZ串操作指令采用了特殊的寻址方式串操作指令采用了特殊的寻址方式利利用用循循环环程程序序也也可可以以实实现现串串操操作作指指令令的的功能功能3.5.3 串操作类指令的寻址方式串操作类指令的寻址方式源源操操作作数数用用寄寄存存器器

68、SI间间接接寻寻址址,默默认认在在数数据据段段DS中中,允许段超越,即允许段超越,即DS:SI目目的的操操作作数数用用寄寄存存器器DI间间接接寻寻址址,默默认认在在附附加加段段ES中中,不允许段超越,即不允许段超越,即ES:DI每每执执行行一一次次串串操操作作,源源地地址址指指针针SI和和目目的的地地址址指指针针DI将自动修改:将自动修改:1或或2对对于于以以字字节节为为单单位位的的数数据据串串(指指令令助助记记符符用用B结结尾尾)操操作,地址指针应该作,地址指针应该1对对于于以以字字为为单单位位的的数数据据串串(指指令令助助记记符符用用W结结尾尾)操操作,地址指针应该作,地址指针应该2当当D

69、F0(执行(执行CLD指令),地址指针应该指令),地址指针应该1或或2当当DF1(执行(执行STD指令),地址指针应该指令),地址指针应该1或或21. 传送数据串传送数据串串传送指令串传送指令MOVSB;ES:DIDS:SI ;SISI1,DIDI1MOVSW; ES:DIDS:SI;SISI2,DIDI2串存储指令串存储指令STOSB;ES:DIAL;然后:;然后:DIDI1STOSW;ES:DIAX;然后:;然后:DIDI2串读取指令串读取指令LODSB;ALDS:SI;SISI1LODSW;AXDS:SI;SISI2重复前缀指令重复前缀指令REP;执行一次串指令,执行一次串指令,CX减减

70、1;直到;直到CX0数据块传送数据块传送MOVSmov cx,400h;设置循环次数;设置循环次数mov si,offset sbuf;SI指向源缓冲区指向源缓冲区mov di,offset dbuf;DI指向目的缓冲区指向目的缓冲区cldrep movsbagain:mov al,si mov es:di,alinc siinc diloop again数据块存储数据块存储mov di,0mov ax,0mov cx,8000h;CX传送次数(传送次数(321024)rep stosw;重复字传送:重复字传送:ES:DI0例例3.13 挑出数组中的正数(不含挑出数组中的正数(不含0)和负数)

71、和负数;数据段数据段countequ 10arraydw 23h,9801h,8000h, ayplusdw count dup(0)ayminusdw count dup(0);代码段代码段mov si,offset arraymov di,offset ayplusmov bx,offset ayminusmov ax,dsmov es,ax;ESDSmov cx,count;CX字节数字节数cld例例3.13 挑出数组中的正数(不含挑出数组中的正数(不含0)和负数(续)和负数(续)again:lodsw;从从array取出一个数据取出一个数据cmp ax,0;判断是正是负判断是正是负jl

72、 minus;小于小于0,转向,转向minusjz next;等于等于0,继续下一个数据,继续下一个数据stosw;大于大于0,存入,存入ayplusjmp nextminus:xchg bx,distosw;把负数存入把负数存入ayminusxchg bx,dinext:loop again;继续进行继续进行2. 检测数据串检测数据串串比较指令串比较指令CMPSB;DS:SIES:DI;SISI1,DIDI1CMPSW;DS:SIES:DI;SISI2,DIDI2串扫描指令串扫描指令SCASB;ALES:DI;DIDI1SCASW;AXES:DI;DIDI2 重复前缀指令重复前缀指令REPE

73、|REPZ;执执行行一一次次串串指指令令,CX减减1;只只要要CX0或或ZF0,重复执行结束,重复执行结束重复前缀指令重复前缀指令REPNE|REPNE;执执行行一一次次串串指指令令,CX减减1;只只要要CX0或或ZF1,重复执行结束,重复执行结束例例3.14 比较两个等长的字符串(不使用重复前缀)比较两个等长的字符串(不使用重复前缀) mov si,offset string1mov di,offset string2mov cx,countcldagain:cmpsb;比较两个字符比较两个字符jnz unmat;出现不同的字符,转移出现不同的字符,转移loop again;进行下一个字符的

74、比较进行下一个字符的比较mov al,0;字符串相等字符串相等jmp output;转向转向outputunmat:mov al,-1output:mov result,al;输出结果标记输出结果标记例例3.14 比较两个等长的字符串(使用重复前缀)比较两个等长的字符串(使用重复前缀) mov si,offset string1mov di,offset string2mov cx,countcldrepz cmpsb;比较两个字符比较两个字符jnz unmat;出现不同的字符,转移出现不同的字符,转移mov al,0;字符串相等字符串相等jmp output;转向转向outputunmat:mov al,-1output:mov result,al;输出结果标记输出结果标记

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

最新文档


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

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