微机原理3:汇编语言程序设计_第1页
微机原理3:汇编语言程序设计_第2页
微机原理3:汇编语言程序设计_第3页
微机原理3:汇编语言程序设计_第4页
微机原理3:汇编语言程序设计_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

1、第第3 3章章第第3章:教学重点章:教学重点汇编语言源程序格式与开发汇编语言源程序格式与开发常量、变量和标号常量、变量和标号汇编语言程序设计方法汇编语言程序设计方法顺序程序设计顺序程序设计分支程序设计分支程序设计循环程序设计循环程序设计子程序设计子程序设计第第3章章 例例3.1: ; ;数据段(定义要显示的字符串)数据段(定义要显示的字符串)stringstringdb db Hello, Assembly !Hello, Assembly !,0dh,0ah,0dh,0ah,$ $; ;代码段(显示字符串的程序)代码段(显示字符串的程序)mov dx,offset stringmov dx,

2、offset stringmov ah,9mov ah,9int 21hint 21hHello, Assembly !程序功能程序功能第第3章:章:3.1.1 完整汇编程序的简化段定义格式完整汇编程序的简化段定义格式.model small;定义程序的;定义程序的存储模式存储模式(小型模式)(小型模式).stack;定义;定义堆栈段堆栈段(默认是(默认是1KB空间)空间).data;定义;定义数据段数据段;数据定义;数据定义.code;定义;定义代码段代码段start: mov ax,data;程序;程序起始点起始点mov ds,ax;设置;设置DS指向用户定义的数据段指向用户定义的数据段;

3、程序代码;程序代码mov ax,4c00hint 21h;程序结束点,返回;程序结束点,返回DOS;子程序代码;子程序代码end start;汇编结束;汇编结束第第3章:第一个源程序文件章:第一个源程序文件wjl301.asm;wjl301.asm.model small.stack.datastringstringdb db Hello, Assembly !Hello, Assembly !,0dh,0ah,0dh,0ah,$ $.codestart:mov ax,datamov ds,axmov dx,offset stringmov dx,offset stringmov ah,9mo

4、v ah,9int 21hint 21hmov ax,4c00hint 21hend start第第3章:章: 汇编语言程序的开发过程(附录汇编语言程序的开发过程(附录B)编辑编辑文本编辑器,如记事本文本编辑器,如记事本源程序:文件名源程序:文件名.asm汇编汇编汇编程序,如汇编程序,如 ML.EXE目标模块:文件名目标模块:文件名.obj连接连接连接程序,如连接程序,如 LINK.EXE可执行文件:文件名可执行文件:文件名.exe调试调试调试程序,如调试程序,如 DEBUG.EXE应用程序应用程序错误错误错误错误错误错误错误错误开发过程开发过程1:源程序的编辑:源程序的编辑源程序文件要以源程

5、序文件要以ASMASM为扩展名为扩展名源程序文件的形成(编辑)可以通过任何源程序文件的形成(编辑)可以通过任何一个文本编辑器实现一个文本编辑器实现: :其他程序开发工具中的编辑环境其他程序开发工具中的编辑环境WindowsWindows中的记事本中的记事本NotepadNotepad、写字板、写字板wordword。开发过程开发过程2:源程序的汇编(:源程序的汇编(MASM 6.x)汇编是将源程序翻译成由机器代码组成的汇编是将源程序翻译成由机器代码组成的目标模块文件目标模块文件的过程的过程MASM 6.x提供的汇编程序是提供的汇编程序是ML.EXE:ML /c wjl301.asm (c: c

6、ompile)生成生成wjl301.obj;若有错误,;若有错误,MASM将给将给出相应的错误信息。应根据错误信息,重出相应的错误信息。应根据错误信息,重新编辑修改源程序后,再进行汇编。新编辑修改源程序后,再进行汇编。开发过程开发过程2:源程序的汇编(生成列表文件):源程序的汇编(生成列表文件)汇编过程中,可以通过参数选择生成汇编过程中,可以通过参数选择生成列表文列表文件件(.LST.LST)。列表文件是一种文本文件,含)。列表文件是一种文本文件,含有源程序和目标代码,对我们学习汇编语言有源程序和目标代码,对我们学习汇编语言程序设计和发现错误很有用程序设计和发现错误很有用汇编程序汇编程序ML.

7、EXE可带其他参数,为了生成可带其他参数,为了生成列表文件,可以:列表文件,可以: ML /Fl wjl301.asm该命令除产生模块文件该命令除产生模块文件wjl301.obj(和可执(和可执行文件行文件wjl301.exe)外,还将生成列表文件)外,还将生成列表文件wjl301.lst开发过程开发过程3:目标模块的连接:目标模块的连接连接程序能把一个或多个目标文件和库文件合成连接程序能把一个或多个目标文件和库文件合成一个可执行程序(一个可执行程序(.EXE.EXE、.COM.COM文件):文件):LINK wjl301.obj;如果没有严重错误,如果没有严重错误,LINK将生成一个可执行文

8、件将生成一个可执行文件(wjl301.exe);否则将提示相应的错误信息。);否则将提示相应的错误信息。这时需要根据错误信息重新修改源程序文件后再这时需要根据错误信息重新修改源程序文件后再汇编、连接,直到生成可执行文件汇编、连接,直到生成可执行文件实际上,实际上,ML.EXE汇编程序(汇编程序(MASM 6.xMASM 6.x)可)可自动调自动调用用LINK连接程序,实现汇编和连接的依次进行连接程序,实现汇编和连接的依次进行ML wjl301.asm开发过程开发过程4:可执行程序的调试:可执行程序的调试经汇编、连接生成的可执行程序在操作系统经汇编、连接生成的可执行程序在操作系统下只要输入文件名

9、就可以运行:下只要输入文件名就可以运行:wjl301操作系统装载该文件进入主存,并开始运行操作系统装载该文件进入主存,并开始运行如果出现运行错误,可以从源程序开始排错,如果出现运行错误,可以从源程序开始排错,也可以利用调试程序帮助发现错误也可以利用调试程序帮助发现错误采用采用DEBUG.EXEDEBUG.EXE调试程序:调试程序:DEBUG wjl301.exe- 提示符提示符-u 反汇编,例:反汇编,例:-u 1469:0 10,显示偏移地,显示偏移地址址0-10范围内的范围内的16进制代码及相应指令进制代码及相应指令-d 显示一定范围内存地址的内容。例:显示一定范围内存地址的内容。例: -

10、d ds:10 20-g 运行当前内存中的程序。例:运行当前内存中的程序。例:-g30,从当,从当前地址运行到偏移地址前地址运行到偏移地址30h第第3章:硬指令与伪指令章:硬指令与伪指令硬指令(硬指令(Instruction)使使CPU产生动作、并产生动作、并在程序执行时才处理的指令在程序执行时才处理的指令硬指令就是第硬指令就是第2章学习的处理器指令,章学习的处理器指令,与具体的与具体的处理器有关、与汇编程序无关处理器有关、与汇编程序无关伪指令(伪指令(Directive)不产生不产生CPU动作、在程动作、在程序执行前由汇编程序处理的说明性指令序执行前由汇编程序处理的说明性指令伪指令与具体的处

11、理器类型无关,但伪指令与具体的处理器类型无关,但与汇编程序与汇编程序有关有关。不同版本的汇编程序支持不同的伪指令。不同版本的汇编程序支持不同的伪指令 硬指令和伪指令采用易于记忆的符号表达,这就是助记符第第3章:汇编语言的应用领域章:汇编语言的应用领域1、适用的领域、适用的领域 要求执行效率高、反应快的领域,如:操作系统内核,工业控要求执行效率高、反应快的领域,如:操作系统内核,工业控制,实时系统等;制,实时系统等; 与硬件资源密切相关的软件开发,如:设备驱动程序等;与硬件资源密切相关的软件开发,如:设备驱动程序等; 受存储容量限制的应用领域,如:家用电器的计算机控制功能受存储容量限制的应用领域

12、,如:家用电器的计算机控制功能等。等。 2、不宜使用的领域、不宜使用的领域 大型软件的整体开发;大型软件的整体开发; 没有特殊要求的一般应用系统的开发等。没有特殊要求的一般应用系统的开发等。第第3章:汇编语言的特点章:汇编语言的特点“与机器相关与机器相关”和和“执行的高效率执行的高效率” 机器指令的一种符号表示机器指令的一种符号表示 可以直接、有效地控制计算机硬件,因而可以直接、有效地控制计算机硬件,因而容易创建容易创建代码序列短小、运行快速代码序列短小、运行快速的可执的可执行程序行程序第第3章:第一个源程序文件章:第一个源程序文件wjl301.asm;wjl301.asm.model sma

13、ll.stack.datastringstringdb db Hello, Assembly !Hello, Assembly !,0dh,0ah,0dh,0ah,$ $.codestart:mov ax,datamov ds,axmov dx,offset stringmov dx,offset stringmov ah,9mov ah,9int 21hint 21hmov ax,4c00hint 21hend start第第3章:标号、名字与标识符章:标号、名字与标识符标号标号是反映是反映硬指令硬指令位置(逻辑地址)和属位置(逻辑地址)和属性的标识符,后跟一个冒号分隔性的标识符,后跟一个冒

14、号分隔名字名字是反映是反映伪指令伪指令位置(逻辑地址)和属位置(逻辑地址)和属性的标识符,后跟空格,性的标识符,后跟空格,标识符标识符(Identifier):用户自定义的符号。):用户自定义的符号。规定见规定见P34第三段第三段一个源程序中,每个标识符的定义是唯一一个源程序中,每个标识符的定义是唯一的,不能是汇编语言采用的的,不能是汇编语言采用的保留字保留字第第3章:保留字章:保留字保留字(保留字(Reserved Word)是汇编程序已经是汇编程序已经利用的标识符(也称为关键字),主要有:利用的标识符(也称为关键字),主要有:硬指令助记符硬指令助记符例如:例如:MOV、ADD伪指令助记符伪

15、指令助记符例如:例如:DB、DW操作符操作符例如:例如:OFFSET(偏移地址)(偏移地址)、PTR(指针)(指针) 寄存器名寄存器名例如:例如:AX、CS预定义符号预定义符号例如:例如:data(表示(表示data段名,实际上段名,实际上是段地址)是段地址) 汇编语言大小写不敏感第第3章:章:1. 存储模式(存储模式(Memory Model)存储模式存储模式决定了一个程序的规模决定了一个程序的规模当使用简化段定义的源程序格式时,必须当使用简化段定义的源程序格式时,必须有存储模式有存储模式.MODEL语句,且位于所有简语句,且位于所有简化段定义语句之前。其格式为:化段定义语句之前。其格式为:

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

17、据段定义伪指令;数据段定义伪指令.DATA创建一个数据段,段名是:创建一个数据段,段名是:_DATA。数据段名。数据段名可用可用DATA预定义标识符预定义标识符表示表示.CODE 段名段名;代码段定义伪指令;代码段定义伪指令.CODE创建一个代码段,可选的创建一个代码段,可选的“段段名名”参数指定该代码段的段名。如果没有给出段名,则采参数指定该代码段的段名。如果没有给出段名,则采用默认段名。用默认段名。SMALL模式下,默认段名是模式下,默认段名是_TEXT。 一个段的开始自动结束前面的一个段第第3章:章:3. 程序开始程序开始为了指明程序开始执行的位置,需要使用一个标为了指明程序开始执行的位

18、置,需要使用一个标号(如号(如start标识符)标识符)连接程序会根据程序起始点正确地设置连接程序会根据程序起始点正确地设置CS和和IP值,值,根据程序大小和堆栈段大小设置根据程序大小和堆栈段大小设置SS和和SP值值连接程序连接程序没有设置没有设置DS和和ES值值。程序如果使用数。程序如果使用数据段或附加段,必须明确给据段或附加段,必须明确给DS或或ES赋值赋值大多数程序需要数据段,大多数程序需要数据段,程序的执行开始应是:程序的执行开始应是:start: mov ax,data;data表示数据段的段地址表示数据段的段地址mov ds,ax;设置设置DS第第3章:章:4. 程序终止程序终止应

19、用程序执行结束,应该将控制权交还操应用程序执行结束,应该将控制权交还操作系统作系统汇编语言程序设计中,有多种返回汇编语言程序设计中,有多种返回DOS的的方法,但一般利用方法,但一般利用DOS功能调用的功能调用的4CH子子功能功能实现,它需要的入口参数是实现,它需要的入口参数是AL返回返回数码(通常数码(通常用用0表示程序没有错误表示程序没有错误)所以,所以,应用程序的终止代码应用程序的终止代码就是:就是:mov ax,4c00hint 21h第第3章:章:5. 汇编结束汇编结束源程序的最后必须有一条源程序的最后必须有一条END伪指令伪指令END 标号标号 不要糊涂程序终止和汇编结束是两码事第第

20、3章:章:3.1.2 完整段定义格式完整段定义格式完整段定义利用完整段定义利用SEGMENT和和ENDS一对伪一对伪指令定义逻辑段指令定义逻辑段同时需要配合同时需要配合ASSUME伪指令指明逻辑段伪指令指明逻辑段是代码段、堆栈段、数据段还是附加段是代码段、堆栈段、数据段还是附加段参照参照P63,汇编程序典型格式,汇编程序典型格式第第3章:章: 3.2 常量、变量和标号常量、变量和标号 3.2.1 常量常量常量表示一个固定的数值,它又分成多种形式常量表示一个固定的数值,它又分成多种形式1. 常数2. 字符串3. 符合常量4. 数值表达式第第3章:章:1. 常数常数可以是可以是10、16、2和和8

21、进制形式,默认不加后缀字进制形式,默认不加后缀字母的是十进制数母的是十进制数十进制十进制由由0 9数字组成,以字母数字组成,以字母D(d)结)结尾(缺省情况可以省略)尾(缺省情况可以省略)100,255D十六进制十六进制由由0 9、A F数字组成,以字母数字组成,以字母H(h)结尾,以字母开头的常数需要)结尾,以字母开头的常数需要加一个前导加一个前导064H,0FFH0B800H二进制二进制由由0和和1两个数字组成,以字母两个数字组成,以字母B(b)结结尾尾01100100B八进制八进制由由07数字组成,以字母数字组成,以字母Q或或O结束结束356Q第第3章:章:2. 字符串字符串字符串常量是

22、用字符串常量是用单引号或双引号括起来单引号或双引号括起来的的单个字符或多个字符单个字符或多个字符,其其数值是每个字符对数值是每个字符对应的应的ASCII码值码值例如:例如:d(等于(等于64H)AB(等于(等于4142H)Hello, Assembly !第第3章:章:3. 符号常量符号常量常量用有意义的符号表示,就是符号常量。使用常量用有意义的符号表示,就是符号常量。使用它,可以提高程序的可读性。它,可以提高程序的可读性。符号定义伪指令有符号定义伪指令有“等价等价EQU”和和“等号等号”:符号名符号名 EQU 数值表达式数值表达式符号名符号名 数值表达式数值表达式例如:例如:X= 7;等效于

23、:;等效于:X equ 7X= X+5;“X EQU X+5”是错误的,是错误的,P66第第3章:章:4. 数值表达式数值表达式汇编语言支持多种运算符(汇编语言支持多种运算符(P67表表3-3)我们经常使用的是加减乘除(我们经常使用的是加减乘除( * / )例如:例如:mov ax,3*4+5;等价于:;等价于:mov ax,17自己看书上自己看书上P67页的例子页的例子第第3章:章: 3.2.2 变量变量 1. 变量的定义变量的定义 变量定义的汇编语言格式为:变量定义的汇编语言格式为:变量名变量名 伪指令伪指令 初值表初值表变量名变量名为用户自定义标识符,表示初值表首元素为用户自定义标识符,

24、表示初值表首元素的逻辑地址。的逻辑地址。初值表初值表是用逗号分隔的参数是用逗号分隔的参数,主要由主要由常量常量、数值表数值表达式达式或或“?”组成。其中组成。其中“?”表示未赋初值表示未赋初值多个存储单元如果初值相同,可以用复制操作符多个存储单元如果初值相同,可以用复制操作符DUP进行定义:进行定义:重复次数重复次数 DUP(重复参数重复参数) 参见参见P67变量定义伪指令有变量定义伪指令有DB、DW、DD等等(表(表3-4);数据段;数据段Xdb a,5db 2 dup(100),?Ydb ABC第第3章:字节变量的应用章:字节变量的应用mov al,X;此处;此处X表示它的第表示它的第1个

25、数据,故个数据,故ALadec X+1;对;对X为始的第为始的第2个数据减个数据减1,故成为,故成为4mov Y,al;现在;现在Y这个字符串成为这个字符串成为 aBC字变量定义实例字变量定义实例;数据段;数据段countdw 8000h,?,ABmaxintequ 64hnumberdw maxintarraydw maxint dup(0)第第3章:章:3. 变量的定位变量的定位 ORG 参数参数将当前偏移地址指针指向参数表达的偏移将当前偏移地址指针指向参数表达的偏移地址。地址。例如:例如:ORG 100h;从;从100H处安排数据或程序处安排数据或程序ORG $+10;偏移地址加;偏移地

26、址加10,即跳过,即跳过10个字个字节空间节空间符号符号“$”表示当前偏移地址值表示当前偏移地址值P69 arr_size=$-array第第3章:章:3.2.3 名字和标号的属性名字和标号的属性 1. 地址地址 2. 类型类型地址操作符地址操作符取得名字或标号的段地址和偏移地址取得名字或标号的段地址和偏移地址 将括起的表达式作为存储器地址指针将括起的表达式作为存储器地址指针 $当前偏移地址当前偏移地址 :段前缀,采用指定的段地址寄存器段前缀,采用指定的段地址寄存器OFFSET 名字名字/标号标号返回名字或标号的偏移地址返回名字或标号的偏移地址SEG 名字名字/标号标号返回名字或标号的段地址返

27、回名字或标号的段地址第第3章:章:2. 类型操作符类型操作符类型操作符类型操作符对名字或标号的类型属性进行设置对名字或标号的类型属性进行设置类型名类型名 PTR 名字名字/标号标号 mov al, byte ptr 2000h mov ax, word ptr 2000h 对变量:对变量:lLENGTHOF操作符操作符获知某变量名指向元素个数获知某变量名指向元素个数lSIZEOF操作符操作符获知变量共占用多少字节空间获知变量共占用多少字节空间l data1 dw 100 dup(?)l mov cx, lengthof data1 ;l mov cx, sizeof data1 ;l mov

28、cx, type data1 ;变量和标号的区别:变量和标号的区别: 都具有逻辑地址和类型都具有逻辑地址和类型 变量是数据区的名字变量是数据区的名字 标号是某条执行指令起始地址的符号表示标号是某条执行指令起始地址的符号表示 变量的类型是指数据项存取单位的字节数大小变量的类型是指数据项存取单位的字节数大小 标号的类型是指使用该标号的两条指令之间的标号的类型是指使用该标号的两条指令之间的距离远近,如距离远近,如near或或far第第3章:章:3.3 顺序程序设计顺序程序设计例题例题3.4(P71) 顺序程序设计实例顺序程序设计实例 采用查表法,实现一位采用查表法,实现一位16进制数进制数转换为转换

29、为ASCII码码显示显示(P54 例例2.24)第第3章:例章:例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;假设两个;假设两个16进制数进制数第第3章:例章:例3.4 代码段代码段 ;代码段代码段mov bx,offset ASCII;BX指向指向ASCII码表码表mov al, hex;AL取得一位取得一位16进制数进制数;恰好就是;恰好就是ASCII码表

30、中的位移码表中的位移and al, 0fh;只有低;只有低4位是有效的,高位是有效的,高4位清位清0 xlat ;换码:;换码:ALDS:BXAL第第3章:例章:例3.4 代码段(续)代码段(续)mov dl,al;欲显示的;欲显示的ASCII码送码送DLmov ah,2;2号号DOS功能调用功能调用int 21h;显示一个;显示一个ASCII码字符码字符mov al,hex+1 ;转换并显示下一个数据;转换并显示下一个数据and al,0fhxlatmov dl,almov ah,2int 21h第第3章:章:3.4 分支程序设计分支程序设计分支程序分支程序根据条件是真或假决定程序走向根据条

31、件是真或假决定程序走向判断的条件是各种指令,如判断的条件是各种指令,如CMP、TEST等执行等执行后形成的状态标志后形成的状态标志转移指令转移指令Jcc和和JMP可以实现分支控制可以实现分支控制例:计算例:计算AX中有符号数的绝对值中有符号数的绝对值cmp ax,0cmp ax,0jge nonnegjge nonneg;条件满足(;条件满足(AX0AX0),转移),转移neg axneg ax;条件不满足,求补(即绝对值条件不满足,求补(即绝对值P43P43)nonneg:nonneg: mov result,axmov result,ax ;保存结果;保存结果;不恰当的分支;不恰当的分支c

32、mp ax,0cmp ax,0jl yesnegjl yesneg;条件满足(;条件满足(AXAX0 0),转移),转移jmp nonnegjmp nonnegyesneg:yesneg: neg axneg ax;条件满足,求补;条件满足,求补nonneg:nonneg: mov result,axmov result,ax ;保存结果;保存结果显示两位压缩显示两位压缩BCD码值(码值(0099),要求不显示前导),要求不显示前导0BCD db 04HMov dl, BCDTest dl, 0f0HJz one Mov cl,4 mov dl, BCDShr dl,cl and dl,0fH

33、Or dl, 30H one: or dl, 30H Mov ah, 2 mov ah,2Int 21H int 21H例例3.6 从键盘输入一个字符串,将其中小写从键盘输入一个字符串,将其中小写字母转换为大写字母,然后原样显示。字母转换为大写字母,然后原样显示。 自己看并且调试自己看并且调试第第3章:章:3.5 循环程序设计循环程序设计 结束结束 初始化初始化 循环的初始状态循环的初始状态 循环体循环体 循环的工作部分循环的工作部分及修改部分及修改部分 计数控制循环计数控制循环条件控制循环条件控制循环修改部分修改部分控制条件控制条件Y YN N第第3章:将章:将BL中中ASCII字符用二进制

34、数显示(字符用二进制数显示(参例参例3.8)mov cx,8;CX8(循环次数)(循环次数)again:shl bl,1;左移进;左移进CF,从高位开始显示从高位开始显示mov dl,0;MOV指令不改变指令不改变CFadc dl,30h;DL030HCF;CF若是若是0,则,则DL 0 的的ASCII码码;CF若是若是1,则,则DL 1 的的ASCII码码mov ah,2int 21h;显示;显示dl中字符中字符loop again;CX减减1,如果,如果CX未减至未减至0,则循环,则循环第第3章:例章:例3.9 求数组元素的最大值和最小值求数组元素的最大值和最小值;数据段数据段arrayd

35、w 10;假设一个数组,其中;假设一个数组,其中头个数据头个数据10表示元素个数表示元素个数dw -3,0,20,900,587,-632,777,234,-34,-56;这是一个有符号字量元素组成的数组;这是一个有符号字量元素组成的数组maxaydw ?;存放最大值;存放最大值minaydw ?;存放最小值;存放最小值初始化:循环次数元素个数初始化:循环次数元素个数1循环体:逐个比较求最大、小值循环体:逐个比较求最大、小值循环控制:比较完所有数据循环控制:比较完所有数据第第3章:例章:例3.9 代码段代码段;代码段;代码段lea si,arraymov cx,si;取得元素个数;取得元素个数

36、dec cx;减;减1后是循环次数后是循环次数add si,2mov ax,si;取出第一个元素给;取出第一个元素给AX,AX用于暂存最大值用于暂存最大值mov bx,ax;取出第一个元素给;取出第一个元素给BX,BX用于暂存最小值用于暂存最小值初始化第第3章:例章:例3.9 代码段(续)代码段(续)maxck: add si,2cmp si,ax;与下一个数据比较;与下一个数据比较jle minckmov ax,si;AX取得更大的数据取得更大的数据jmp nextminck:cmp si,bxjge nextmov bx,si;BX取得更小的数据取得更小的数据next:loop maxck

37、;计数循环;计数循环mov maxay,ax ;保存最大值;保存最大值mov minay,bx;保存最小值;保存最小值循环体例例3.10 从键盘接收一个十进制个位数从键盘接收一个十进制个位数N,然后显示然后显示N次问号次问号“?”例例3.11 记录某个字存储单元数据中记录某个字存储单元数据中1的个数的个数,以十进制形式显示结果。,以十进制形式显示结果。例例3.12 现有一个以现有一个以“0”结尾的字符串,要结尾的字符串,要求删除其中的空格字符。求删除其中的空格字符。自己看并且调试自己看并且调试第第3章:章: 3.6 子程序设计子程序设计 3.6.1 过程定义和子程序编写过程定义和子程序编写格式

38、(过程伪指令格式(过程伪指令PROC和和ENDP):):过程名过程名PROC NEAR|FAR;过程体过程体过程名过程名ENDP可选的参数可选的参数NEAR|FAR指定过程的调用属性。指定过程的调用属性。NEARNEAR属性(段内近调用)的过程只能被属性(段内近调用)的过程只能被相同代相同代码段码段的其他程序调用的其他程序调用FARFAR属性(段间远调用)的过程可以被属性(段间远调用)的过程可以被相同或相同或不同代码段不同代码段的程序调用的程序调用第第3章:子程序编写注意事项章:子程序编写注意事项子程序要利用过程定义伪指令声明子程序要利用过程定义伪指令声明子程序最后利用子程序最后利用RET指令

39、返回主程序,主指令返回主程序,主程序执行程序执行CALL指令调用子程序指令调用子程序子程序开始应该保护使用到的寄存器内容,子程序开始应该保护使用到的寄存器内容,子程序返回前相应进行恢复子程序返回前相应进行恢复-堆栈堆栈子程序应安排在代码段的主程序之外,最子程序应安排在代码段的主程序之外,最好放在主程序执行终止后的位置(好放在主程序执行终止后的位置(返回返回DOS后、汇编结束后、汇编结束END伪指令前伪指令前),也可),也可以放在主程序开始执行之前的位置以放在主程序开始执行之前的位置第第3章:例章:例3.15 用用显示器功能调用显示器功能调用输出一个字符的子程序输出一个字符的子程序;主程序;主程

40、序mov al,?;主程序提供显示字符;主程序提供显示字符call dpchar;调用子程序;调用子程序;子程序:显示;子程序:显示AL中的字符中的字符dpchar proc;过程定义,过程名为;过程定义,过程名为dpcharpush ax;顺序入栈,保护寄存器;顺序入栈,保护寄存器push bxmov bx,0mov ah,0eh;显示器显示器0EH号输出一个字符功能号输出一个字符功能int 10hpop bx;逆序出栈,恢复寄存器;逆序出栈,恢复寄存器pop axret;子程序返回;子程序返回dpchar endp;过程结束;过程结束第第3章:例章:例3.15源程序源程序;wjl315.a

41、sm.model small.stack.codestart:mov ax,datamov ds,axmov al,?;主程序提供显示字符;主程序提供显示字符call dpchar;调用子程序;调用子程序mov ax,4c00hint 21h主程序部分主程序部分本程序不需要数据段本程序不需要数据段第第3章:例章:例3.15源程序(续)源程序(续)dpchar proc;过程定义,过程名为;过程定义,过程名为dpcharpush ax;顺序入栈,保护寄存器;顺序入栈,保护寄存器push bxmov bx,0mov ah,0eh ;显示器显示器0EH号输出一个字符功能号输出一个字符功能int 10

42、hpop bx;逆序出栈,恢复寄存器;逆序出栈,恢复寄存器pop axret;子程序返回;子程序返回dpchar endp;过程结束;过程结束end start第第3章:章:3.7 宏宏(Macro)汇编汇编宏宏是具有是具有“宏名宏名”的一段汇编语句序列的一段汇编语句序列宏宏需要先需要先定义定义,然后在程序中进行,然后在程序中进行宏调用宏调用由于形式上类似其它指令,所以常称其为由于形式上类似其它指令,所以常称其为宏指令宏指令宏指令实际上是宏指令实际上是一段代码序列的缩写一段代码序列的缩写;在;在汇编时,汇编程序用对应的代码序列替代汇编时,汇编程序用对应的代码序列替代宏指令宏指令因为是在汇编过程

43、中实现的因为是在汇编过程中实现的宏展开宏展开,所以,所以常称为常称为宏汇编宏汇编第第3章:章:1. 宏定义宏定义 宏定义宏定义由一对宏汇编伪指令由一对宏汇编伪指令MACRO和和ENDM来完成,格式如下:来完成,格式如下:宏名宏名 MACRO 形参表形参表;宏定义体;宏定义体ENDM其中宏名是符合语法的标识符,同一源程其中宏名是符合语法的标识符,同一源程序中该名字定义唯一。序中该名字定义唯一。宏定义体宏定义体中不仅可中不仅可以是硬指令序列,还可以是伪指令语句序以是硬指令序列,还可以是伪指令语句序列列宏指令实际上是一段代码的缩写宏指令实际上是一段代码的缩写第第3章:章:2. 宏调用宏调用宏定义之后

44、就可以使用它,即宏定义之后就可以使用它,即宏调用宏调用:宏名宏名 实参表实参表宏调用的格式同一般指令一样:在使用宏调用的格式同一般指令一样:在使用宏指令宏指令的的位置写下宏名,后跟实体参数;如果有多个参数,位置写下宏名,后跟实体参数;如果有多个参数,应按形参顺序填入实参,也用逗号分隔应按形参顺序填入实参,也用逗号分隔在汇编时,宏指令被汇编程序用对应的代码序列在汇编时,宏指令被汇编程序用对应的代码序列替代,这就是替代,这就是宏展开宏展开宏展开宏展开的具体过程是:当汇编程序扫描源程序遇的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即到已有定义的宏调用时,即用相应的宏定义体完用相应的宏定

45、义体完全替代源程序的宏指令全替代源程序的宏指令,同时用位置匹配的实参,同时用位置匹配的实参对形参进行取代对形参进行取代第第3章:宏的实例章:宏的实例1dispcharmacro char;宏定义宏定义mov ah,2;宏定义体宏定义体mov dl,charint 21hendmdispchar ?;宏调用(宏指令)宏调用(宏指令) 1mov ah,2;宏展开(宏展开(lstlst文件)文件) 1mov dl,? 1int 21h第第3章:宏的实例章:宏的实例2dispmsgmacro message;宏定义宏定义mov ah,9;宏定义体宏定义体lea dx,messageint 21hendmdispmsg string;宏调用(宏指令)宏调用(宏指令) 1mov ah,9;宏展开宏展开 1lea dx,string 1int 21h第第3章:宏与子程序的比较章:宏与子程序的比较仅是源程序级的仅是源程序级的简化简化:宏:宏调用调用在汇编时在汇编时进行程序语进行程序语句的展开,不需要返回;句的展开,不需要返回;不减小目标程序,执行速不减小目

温馨提示

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

评论

0/150

提交评论