东南大学电子信息工程之微机学5学时汇编语言

上传人:cn****1 文档编号:569728593 上传时间:2024-07-30 格式:PPT 页数:83 大小:2.85MB
返回 下载 相关 举报
东南大学电子信息工程之微机学5学时汇编语言_第1页
第1页 / 共83页
东南大学电子信息工程之微机学5学时汇编语言_第2页
第2页 / 共83页
东南大学电子信息工程之微机学5学时汇编语言_第3页
第3页 / 共83页
东南大学电子信息工程之微机学5学时汇编语言_第4页
第4页 / 共83页
东南大学电子信息工程之微机学5学时汇编语言_第5页
第5页 / 共83页
点击查看更多>>
资源描述

《东南大学电子信息工程之微机学5学时汇编语言》由会员分享,可在线阅读,更多相关《东南大学电子信息工程之微机学5学时汇编语言(83页珍藏版)》请在金锄头文库上搜索。

1、东南大学电子信息工程之东南大学电子信息工程之微机学微机学5学时汇编语言学时汇编语言2本章内容本章内容l汇编语言源程序的格式汇编语言源程序的格式l伪操作命令伪操作命令lDOS及及BIOS功能调用功能调用34563.2.1 分析分析1分段结构分段结构l可以看出,汇编语言源程序是可以看出,汇编语言源程序是分段结构分段结构的形式。的形式。一个汇编源程序由若干个段一个汇编源程序由若干个段(Segment)组成。组成。每个段以每个段以SEGMENT语句开始,以语句开始,以ENDS结束。结束。整个源程序以整个源程序以END语句结尾。语句结尾。l这里所说的汇编语言源程序的这里所说的汇编语言源程序的段段和第一章

2、中的和第一章中的CPU管理的管理的存储器的存储器的段段是不同的概念。是不同的概念。汇编语言的段是逻辑段;汇编语言的段是逻辑段;8086CPU管理的存储器的段是物管理的存储器的段是物理段理段(共有共有4个:数据段、附加段、堆栈段、代码段,对应个:数据段、附加段、堆栈段、代码段,对应4个段寄存器:个段寄存器:DS、ES、SS和和CS)。一个汇编语言源程序中可以有多个逻辑段。一个汇编语言源程序中可以有多个逻辑段。l上例中共有两个逻辑段:上例中共有两个逻辑段:data和和code。7分析分析2注:注:功能号功能号09H的的int 21中断中断功能描述功能描述: 输出一个字符串到标准输出设备上。输出一个

3、字符串到标准输出设备上。入口参数入口参数: AH09H DS : DX待输出字符的地址待输出字符的地址说明说明:待显示的字符串以:待显示的字符串以$作为其结束标志作为其结束标志 代码段开头执行了一次功能号代码段开头执行了一次功能号09H的的21号号DOS中断,用于在中断,用于在屏幕上显示字符串。关于屏幕上显示字符串。关于DOS功能调用功能调用,后文将有详细解释。,后文将有详细解释。此处先列出功能号此处先列出功能号09H的的21号号DOS中断的相关资料:中断的相关资料:最后两行最后两行(MOV AX,4C00h、INT 21h)也是一个也是一个DOS功能调用。功能调用。注:注:功能号功能号4CH

4、的的int 21中断中断功能描述功能描述: 终止程序的执行,并可返回一个代码终止程序的执行,并可返回一个代码 入口参数入口参数: AH4CH AL返回的代码返回的代码 8汇编语言开发过程汇编语言开发过程 源程序源程序源程序源程序 : : 文件名文件名文件名文件名.asm.asm目标程序目标程序目标程序目标程序: :文件名文件名文件名文件名.obj.obj可执行文件可执行文件可执行文件可执行文件: :文件名文件名文件名文件名.exe.exeFinishFinish编辑器,如编辑器,如notepad.exe汇编器,如汇编器,如masm.exe链接器,如链接器,如link.exe调试器,如调试器,如

5、debug.exe9开发工具开发工具 (了解了解)X86+Windows平台下常用的汇编编译器有:平台下常用的汇编编译器有:lMicrosoft公司的公司的 MASMlBorland公司的公司的 TASMl开源社区的开源社区的 NASMMASM是是微软微软推出的宏汇编语言,自发布以来已有多次版本更推出的宏汇编语言,自发布以来已有多次版本更新,下页表格中列出了几个较为典型的版本。新,下页表格中列出了几个较为典型的版本。注:注:容易与之混淆的是容易与之混淆的是MASM32,它是,它是Steve Hutchesson以个人以个人名义发布、基于名义发布、基于MASM而构建的软件包。其版本号和而构建的软

6、件包。其版本号和MASM的版本号是不同的,比如的版本号是不同的,比如MASM32V8使用的汇编编使用的汇编编译器是译器是MASM6。MASM32的最新版本为的最新版本为MASM32V12。10MASM版本历史版本历史(了解了解) MASM 4.00 最先广泛使用的一个最先广泛使用的一个MASM版本,适用于版本,适用于DOS下的汇编编程下的汇编编程MASM 5.00 开始支持开始支持.code .data写法的段定义格式写法的段定义格式(即即“简化段定义格式简化段定义格式”)MASM 6.00 1992年发布年发布,可执行文件名从可执行文件名从Masm.exe改为改为Ml.exe 开始支持开始支

7、持 .if/.endif这样的高级语法这样的高级语法 开始支持开始支持invoke伪指令来简化带参数的子程序调用伪指令来简化带参数的子程序调用MASM 6.152000年年4月发布月发布MASM 8.00随随VS2005一起发布,是目前为止最新的版本一起发布,是目前为止最新的版本11开发工具开发工具 (了解了解)Masm5适合进行适合进行DOS程序开发;程序开发;Masm6以后的版本开始支持以后的版本开始支持Win32程序开发。程序开发。(微软官方发布的微软官方发布的Masm6所附的所附的link.exe是是Segmented Executable Linker,只能开发,只能开发DOS程序;

8、要进行程序;要进行Win32开发必须配备开发必须配备Incremental Linker,该类型的,该类型的link.exe可以从可以从Visual Studio中获取。开发中获取。开发Win32程序推荐使用程序推荐使用MASM32开发包开发包)开发开发DOS程序的程序的Masm下载地址:下载地址:Masm5.00 罗云彬的编程乐园罗云彬的编程乐园 http:/211.90.241.130:22366/view.asp?file=51Masm615 For Dos aogo汇编小站汇编小站 http:/ (了解了解)使用使用MASM 5.013开发步骤演示开发步骤演示 (了解了解)使用使用MA

9、SM 6.15 For DOS143.2.2 语句的类型语句的类型l汇编语言源程序中的语句主要有以下两种类型:汇编语言源程序中的语句主要有以下两种类型:指令性语句指令性语句指示性语句指示性语句指令性语句指令性语句主要由主要由CPU指令组成,对应实际的机器指令;指令组成,对应实际的机器指令;(比如比如“Hello例例”中的中的 MOV DS , AX )指示性语句指示性语句又称伪操作语句,主要由伪操作指令组成。又称伪操作语句,主要由伪操作指令组成。(比如比如“Hello例例”中的中的 code SEGMENT ) 15语句的组成语句的组成l汇编语言的语句可以有汇编语言的语句可以有14个组成部分,

10、如下所示:个组成部分,如下所示:名字名字 操作码操作码/伪操作码伪操作码 操作数操作数 ;注释注释带方括号的部分表示可选项。以带方括号的部分表示可选项。以“Hello例例”中的几条语句为例:中的几条语句为例:名字名字 操作码操作码/伪操作码伪操作码 操作数操作数注释注释dataSEGMENTmsg DBHello, World!$start:MOVAX , dataENDstart163.2.3 语句的组成语句的组成名字名字l名字名字在在指令性语句指令性语句中,名字是一个标号,实际上就是指令的符号中,名字是一个标号,实际上就是指令的符号地址。比如地址。比如“start : MOV AX , d

11、ata”中的中的 start: 。并非每条指令。并非每条指令性语句都必须有标号。但如果有了这个标号,程序中其他地方性语句都必须有标号。但如果有了这个标号,程序中其他地方就可引用这个标号,比如执行跳转或者就可引用这个标号,比如执行跳转或者CALL调用。指令性语句调用。指令性语句中的标号后面通常有一个冒号。中的标号后面通常有一个冒号。标号有三种属性:标号有三种属性:段段、偏移量偏移量和和类型类型。段段属性是定义标号的程序段的段地址。属性是定义标号的程序段的段地址。偏移量偏移量表示标号所在段的起始地址到定义该标号的地址之间表示标号所在段的起始地址到定义该标号的地址之间的字节数。的字节数。标号的标号的

12、类型类型有两种:有两种:NEAR和和FAR。前者可以在段内被引用,。前者可以在段内被引用,地址指针为两个字节;后者可以在其他段中被引用,地址指针地址指针为两个字节;后者可以在其他段中被引用,地址指针为为4个字节。个字节。17语句的组成语句的组成名字名字在在指示性语句指示性语句中,名字可以是变量名、段名、过程名。中,名字可以是变量名、段名、过程名。比如比如“Hello例例”中中“data SEGMENT”中的中的data是段名,是段名, “msg DB Hello, World!$”中的中的msg是变量名。是变量名。指示性语句中的标号后面通常没有冒号。指示性语句中的标号后面通常没有冒号。变量也有

13、三种属性:变量也有三种属性:段段、偏移量偏移量和和类型类型。段段属性是变量所代表的数据所在段的段地址。属性是变量所代表的数据所在段的段地址。偏移量偏移量表示变量所在段的起始地址与变量的地址之间的字节数。表示变量所在段的起始地址与变量的地址之间的字节数。变量的变量的类型类型有:有: BYTE、WORD、DWORD(四字节)、(四字节)、QWORD(八字(八字节)和节)和TBYTE(十字节)等,表示数据区中存取操作对象的大小。(十字节)等,表示数据区中存取操作对象的大小。183.2.4 语句的组成语句的组成操作码操作码/伪操作码伪操作码l操作码操作码/伪操作码伪操作码在汇编语言中在汇编语言中操作码

14、操作码以助记符的形式存在。以助记符的形式存在。8086/8088 CPU的助的助记符总共约有记符总共约有90多种,比如多种,比如MOV、ADC等。等。关于所有的助记符,参见第二章指令系统。关于所有的助记符,参见第二章指令系统。指示性语句中的指示性语句中的DB、SEGMENT、ENDS、ASSUME、END等等都是都是伪操作码伪操作码,而不是,而不是CPU指令的助记符。指令的助记符。它们在程序中的作用是它们在程序中的作用是定义变量的类型、定义段以及命令汇编定义变量的类型、定义段以及命令汇编程序程序(masm.exe)结束汇编结束汇编 等。它们是等。它们是指示汇编程序指示汇编程序(masm.exe

15、)完成汇编完成汇编,本身不产生对应的机器码。,本身不产生对应的机器码。关于伪操作码的具体作用和使用方法,下文有专门章节讨论。关于伪操作码的具体作用和使用方法,下文有专门章节讨论。193.2.5 语句的组成语句的组成操作数操作数l操作数操作数对于对于CPU指令,可能有单操作数和双操作数,也可能无操作数;指令,可能有单操作数和双操作数,也可能无操作数;伪指令可能有更多个操作数。伪指令可能有更多个操作数。可以用作操作数的有:可以用作操作数的有:常数、寄存器、标号、变量常数、寄存器、标号、变量和和表达式表达式。常数常数十进制数,如十进制数,如99D或或99。后面加字母。后面加字母“D”,或者什么也不加

16、。,或者什么也不加。十六进制数,如十六进制数,如64H,0F800H,后面加一个字母,后面加一个字母“H”;如果最;如果最高位数值不是高位数值不是09,前面要再加一个数字,前面要再加一个数字0。(以避免和寄存器名以避免和寄存器名称如称如“AH”冲突冲突)ASCII常数,例如常数,例如A、8、cat,字符应该放在单引号中。,字符应该放在单引号中。20语句的组成语句的组成操作数操作数寄存器寄存器8086/8088的寄存器可以用作指令的操作数。的寄存器可以用作指令的操作数。8086/8088 CPU的的寄存器有:寄存器有:8位寄存器:位寄存器:AH、AL、BH、BL、CH、CL、DH、DL。16位寄

17、存器:位寄存器:AX、BX、CX、DX、SI、DI、BP、SP、DS、ES、SS、CS。标号标号标号代表一条指令的符号地址,因此可以作为转移、过程调用标号代表一条指令的符号地址,因此可以作为转移、过程调用CALL 以及循环控制以及循环控制 LOOP 等指令的操作数。等指令的操作数。比如比如“HELLO例例”中中“END start”,start就是一个标号。就是一个标号。21语句的组成语句的组成操作数操作数变量变量变量是存储器中某个数据区的名字,因此在指令中可以作为存变量是存储器中某个数据区的名字,因此在指令中可以作为存储器操作数。储器操作数。如如“Hello例例”中的:中的:LEA DX ,

18、 msg 其中其中 msg 就是一个在数据区定义的变量(就是一个在数据区定义的变量(msg DB Hello, World!$)。)。表达式表达式汇编语言中的表达式按其性质可以分为两种:数值表达式和地汇编语言中的表达式按其性质可以分为两种:数值表达式和地址表达式。址表达式。数值表达式数值表达式产生一个数值结果,只有大小,没有属性。产生一个数值结果,只有大小,没有属性。地址表达式地址表达式的结果不是一个单纯的数值,它有三种属性:段、的结果不是一个单纯的数值,它有三种属性:段、偏移量和类型。偏移量和类型。22语句的组成语句的组成操作数操作数构成表达式必然有构成表达式必然有运算符运算符。表达式中常用

19、运算符有以下几种:。表达式中常用运算符有以下几种:算术运算符,如算术运算符,如 +、-、*、/和和MOD(模除模除)这些算术运算符可用于数值表达式,运算结果是一个数值。在这些算术运算符可用于数值表达式,运算结果是一个数值。在地址表达式中通常只使用其中的地址表达式中通常只使用其中的+和和 两种运算符两种运算符。逻辑运算符逻辑运算符 ,如,如 AND、OR、XOR和和NOT逻辑运算符只用于数值表达式中对数值进行按位逻辑运算。对逻辑运算符只用于数值表达式中对数值进行按位逻辑运算。对地址进行逻辑运算是没有意义的。地址进行逻辑运算是没有意义的。不要把逻辑运算符如不要把逻辑运算符如AND、OR、XOR和和

20、NOT等与同样名称等与同样名称的的CPU指令相混淆。前者可对整常数进行按位逻辑运算,是在汇指令相混淆。前者可对整常数进行按位逻辑运算,是在汇编时进行;后者的操作数可以是寄存器、存储器和立即数,是在编时进行;后者的操作数可以是寄存器、存储器和立即数,是在程序运行时由程序运行时由CPU执行。比如:执行。比如:ANDAL,01011010B;这里的这里的AND是指令助记符是指令助记符MOVAL,01011010B AND 11110000B ;这里的;这里的AND是逻辑运算符是逻辑运算符23语句的组成语句的组成操作数操作数关系运算符关系运算符 如如 EQ(等于等于)、NE(不等不等)、LT(小于小于

21、)、GT(大于大于)、LE(小于或等于小于或等于)、GE(大于或等于大于或等于)等。等。参与关系运算的必须是两个数值,或同一段中的两个存储参与关系运算的必须是两个数值,或同一段中的两个存储单元地址,但运算结果只能是两个特定的数值之一。当关系不单元地址,但运算结果只能是两个特定的数值之一。当关系不成立(假)时,结果为成立(假)时,结果为0;当关系成立(真)时,结果为;当关系成立(真)时,结果为0FFFFH(-1)。例如:例如:MOV AX,4 EQ 3 ;关系不成立,故关系不成立,故(AX) 0MOV AX, 4 NE 3;关系成立,故关系成立,故(AX) 0FFFFH24语句的组成语句的组成操

22、作数操作数分析运算符和合成运算符分析运算符和合成运算符 如如 OFFSET、SEG、TYPE 、SIZE和和LENGTH等;合成运算符有等;合成运算符有PTR、THIS、SHORT等。等。分析运算符用以分析一个存储器操作数的属性,如段、偏分析运算符用以分析一个存储器操作数的属性,如段、偏移量或类型等。合成运算符则可以规定存储器操作数的某个属移量或类型等。合成运算符则可以规定存储器操作数的某个属性,例如类型。性,例如类型。OFFSET用于获取一个标号或变量的偏移地址,如:用于获取一个标号或变量的偏移地址,如:MOV SI , OFFSET DATA1是将变量是将变量DATA1的偏移地址送至的偏移

23、地址送至SI寄存器。寄存器。其效果等同于:其效果等同于:LEA SI , DATA1 25语句的组成语句的组成操作数操作数SEG用于获取标号或变量的段址,如:用于获取标号或变量的段址,如:MOV AX , SEG ARRAYMOV DS , AX是将变量是将变量ARRAY的段地址送入的段地址送入DS寄存器。寄存器。TYPE的运算结果是一个数值,这个数值与存储器操作数类型的运算结果是一个数值,这个数值与存储器操作数类型属性的关系如下:属性的关系如下: TYPE返回值返回值操作数类型操作数类型TYPE返回值返回值操作数类型操作数类型1BYTE1NEAR2WORD2FAR4DWORD26语句的组成语

24、句的组成操作数操作数TYPE运算符的例子运算符的例子VAR DW ?ARRAY DD 10 DUP(?)STRDB This is a testMOV AX , TYPE VAR;(AX) 2MOV BX , TYPE ARRAY;(BX) 4MOV CX , TYPE STR;(CX) 1LENGTH 如果一个变量已用重复操作符如果一个变量已用重复操作符DUP说明其变量的个说明其变量的个数,则利用数,则利用LENGTH获取这个变量的个数。如果未用获取这个变量的个数。如果未用DUP说明,说明,则得到的结果为则得到的结果为1。比如上例中比如上例中 , LENGTH ARRAY 运算结果为运算结果

25、为10。 27语句的组成语句的组成操作数操作数SIZE 如果一个变量已用重复操作符如果一个变量已用重复操作符DUP说明,则利用说明,则利用SIZE运运算符可得到分配给该变量的字节总数。如果未用算符可得到分配给该变量的字节总数。如果未用DUP说明,则说明,则得到的结果是得到的结果是TYPE运算的结果。运算的结果。比如上例中比如上例中 , SIZE ARRAY 运算结果为运算结果为10440。由此。由此可知,可知,SIZE的运算结果等于的运算结果等于LENGTH的运算结果乘以的运算结果乘以TYPE的的运算结果。运算结果。 PTR 是一个合成运算符,用于指定存储器操作数的类型。是一个合成运算符,用于

26、指定存储器操作数的类型。比如比如 INC BYTE PTR BX SI ,指令中利用指令中利用PTR运算符明确规定存储器操作数的类型为运算符明确规定存储器操作数的类型为BYTE(字节字节),因此,本指令将一个,因此,本指令将一个8位存储器的内容加位存储器的内容加1。28语句的组成语句的组成操作数操作数THIS 也可以指定存储器操作数的类型。使用也可以指定存储器操作数的类型。使用THIS运算符可以运算符可以使标号或变量的类型具有灵活性。例如要求对同一个数据区,既使标号或变量的类型具有灵活性。例如要求对同一个数据区,既可以字节作为单位,又可以字作为单位进行存取,则可以用以下可以字节作为单位,又可以

27、字作为单位进行存取,则可以用以下语句:语句:AREAW EQU THIS WORDAREAB DB 100 DUP (?)上面的上面的AREAW和和AREAB代表同一个数据区,其中共有代表同一个数据区,其中共有100个字个字节,但节,但AREAW的类型为的类型为WORD,而,而AREAB的类型为的类型为BYTE。SHORT 指定一个标号的类型为指定一个标号的类型为SHORT(短标号),即标号到(短标号),即标号到引用标号的指令间的距离在引用标号的指令间的距离在-128127之间。短标号可用于无条之间。短标号可用于无条件转移和条件转移指令中。使用短标号的指令比使用默认的近标件转移和条件转移指令中

28、。使用短标号的指令比使用默认的近标号的指令少一个字节。号的指令少一个字节。29语句的组成语句的组成操作数操作数方括号方括号 间接寻址指令的存储器操作数要在寄存器名间接寻址指令的存储器操作数要在寄存器名BX、BP、SI或或DI外面加上方括号,以表示存储器地址。又如,变址寻址外面加上方括号,以表示存储器地址。又如,变址寻址指令的存储器操作数既要用算术运算符将指令的存储器操作数既要用算术运算符将SI或或DI与一个位移量与一个位移量做运算,又要在外面加上方括号来表示存储器地址。做运算,又要在外面加上方括号来表示存储器地址。MOV CL , BXMOV AL , SI+5段超越运算符段超越运算符“ :

29、” 是是“:”(冒号)跟在段寄存器名(冒号)跟在段寄存器名(DS、ES、SS或或CS)之后表示段超越,用以给一个存储器操作数指定一个)之后表示段超越,用以给一个存储器操作数指定一个段属性,而不管其原来隐含的段是什么。例如:段属性,而不管其原来隐含的段是什么。例如:MOV AX , ES : SIHIGH和和LOW 获取一个数值或地址表达式的高位和低位字节。获取一个数值或地址表达式的高位和低位字节。STUFF EQU 0ABCDH MOV AH , HIGH STUFF ; (AH) 0ABH MOV AL , LOW STUFF ; (AL) 0CD H30语句的组成语句的组成操作数操作数如果

30、一个表达式中同时具有多个运算符,那么按照如果一个表达式中同时具有多个运算符,那么按照以下规则进行运算:以下规则进行运算:优先级高的先运算,优先级低的后运算;优先级高的先运算,优先级低的后运算;同一优先级按表达式中从左到右的顺序进行运算;同一优先级按表达式中从左到右的顺序进行运算;圆括号可提升运算优先级,圆括号内的运算符总是在其任何圆括号可提升运算优先级,圆括号内的运算符总是在其任何相邻的运算之前进行。相邻的运算之前进行。各种运算符的优先级顺序如下页图表所示。表中同一行的各种运算符的优先级顺序如下页图表所示。表中同一行的运算符具有同等优先级。运算符具有同等优先级。31语句的组成语句的组成操作数操

31、作数优先级优先级运算符运算符优先级优先级运算符运算符1LENGTH,SIZE, ( ), ,6,2: (段超越预算符)(段超越预算符)7EQ,NE,LT,LE,GT,GE3PTR,OFFSET,SEG,TYPE,THIS8NOT4HIGH,LOW9AND5*,/,MOD,SHL,SHR10OR,XOR高高低低323.2.6 语句的组成语句的组成注释注释l注释注释和其他语言一样,汇编语言中的注释仅用于提高程序的和其他语言一样,汇编语言中的注释仅用于提高程序的可读性可读性。汇编语言中的注释前面要求加上分号(汇编语言中的注释前面要求加上分号(;)。)。如果注释内容较多,超过一行,则换行以后前面还要加

32、上分号。如果注释内容较多,超过一行,则换行以后前面还要加上分号。注释也可以从一行的最前面开始。注释也可以从一行的最前面开始。汇编程序汇编程序(masm.exe)对注释不予理会,即注释对汇编后产生的对注释不予理会,即注释对汇编后产生的目标程序目标程序没有任何影响。没有任何影响。333.3 伪操作指令伪操作指令l指示性语句中的伪操作指令,因其表示形式类似于指示性语句中的伪操作指令,因其表示形式类似于CPU指令,故称其为指令,故称其为“伪指令伪指令”。l伪指令与伪指令与CPU指令的区别:指令的区别:CPU指令是给指令是给 CPU 的指令,对应的指令,对应CPU的特定操作,如加法运算;的特定操作,如加

33、法运算;而伪指令是给而伪指令是给 汇编程序汇编程序 (masm.exe)的指令,指示汇编程序进行的指令,指示汇编程序进行操作,比如定义段、定义数据。操作,比如定义段、定义数据。CPU指令在汇编后产生一一对应的指令在汇编后产生一一对应的 目标代码目标代码 ,伪指令不产生与,伪指令不产生与之对应的目标代码。之对应的目标代码。l下面列出下面列出“Hello例例”的汇编源码及其对应的机器码的汇编源码及其对应的机器码 对比体会伪指令的作用。对比体会伪指令的作用。34Hello, World! 的汇编源代码的汇编源代码35Hello, World! 的机器代码的机器代码36Hello, World! 机器

34、代码的分析机器代码的分析可以看到,编译后的机器代码中,可以看到,编译后的机器代码中,伪指令伪指令都已经不见了。原来都已经不见了。原来的代码段中每条指令性语句都对应一条机器码。的代码段中每条指令性语句都对应一条机器码。汇编源代码中的第一句汇编源代码中的第一句MOV AX , data经编译后变成经编译后变成MOV AX , 1449。这是因为编译器。这是因为编译器 (masm.exe) 将数据段放在将数据段放在 1449 : 0000 1449 : 0000 的位的位置。然后将置。然后将DS : DX指向该位置,通过指向该位置,通过INT21的的09H中断将其显示中断将其显示出来。出来。资料回顾

35、:资料回顾: 功能号功能号09H的的int 21中断中断功能描述功能描述: 输出一个字符串到标准输出设备上。输出一个字符串到标准输出设备上。入口参数入口参数: AH09H DS:DX待输出字符的地址待输出字符的地址说明说明:待显示的字符串以:待显示的字符串以$作为其结束标志作为其结束标志 37Hello, World! 机器代码的分析机器代码的分析l下图使用下图使用 d 1449:0000显示了数据段中的内容:显示了数据段中的内容:38Review(1)l汇编语言源程序中语句的类型汇编语言源程序中语句的类型n指令性语句指令性语句 由由CPU指令组成指令组成n指示性语句指示性语句 由伪指令组成由

36、伪指令组成l汇编语言语句的组成汇编语言语句的组成n1、名字、名字u指令性语句中的名字是一个标号指令性语句中的名字是一个标号u指示性语句中的名字可以是变量名、段名、过程名指示性语句中的名字可以是变量名、段名、过程名n2、操作码、操作码/伪操作码伪操作码39Review(2)n3、操作数、操作数u常数常数u寄存器寄存器u标号标号u变量变量u表达式表达式算术运算符算术运算符逻辑运算符逻辑运算符关系运算符关系运算符分析运算符和合成运算符分析运算符和合成运算符各种运算符的优先级各种运算符的优先级n4、注释、注释403.3 伪操作命令伪操作命令l宏汇编程序宏汇编程序MASM提供了数十种伪操作。提供了数十种

37、伪操作。(这里也揭示了操作码和伪操作码的区别:这里也揭示了操作码和伪操作码的区别:伪操作码随伪操作码随编译器编译器的不同而不同;的不同而不同;而操作码随而操作码随CPU的不同而不同。的不同而不同。)l根据伪操作的功能,大致可以分为下列几类:根据伪操作的功能,大致可以分为下列几类:41伪操作指令分类伪操作指令分类伪操作类型伪操作类型举例举例处理器方式伪操作处理器方式伪操作.8086数据定义伪操作数据定义伪操作DBDB、DWDW、DDDD符号定义伪操作符号定义伪操作EQUEQU、LABEL段定义伪操作段定义伪操作SEGMENT/ENDSSEGMENT/ENDS、ASSUMEASSUME过程定义伪操

38、作过程定义伪操作PROC/ENDPPROC/ENDP模块定义与连接伪操作模块定义与连接伪操作NAME、END、PUBLIC、EXTRN宏处理伪操作宏处理伪操作MACRO/ENDMMACRO/ENDM、PURGE条件伪操作条件伪操作IF、IFE、IFDEF列表伪操作列表伪操作.LIST、TITLE、PAGE其他伪操作其他伪操作COMMENT、.RADIX42处理器方式伪操作处理器方式伪操作(了解了解)l处理器方式伪操作处理器方式伪操作用于指示用于指示汇编编译器汇编编译器使用何种使用何种CPU的指令系统。的指令系统。l常用的有以下几种:常用的有以下几种:.8086 指示汇编程序只汇编指示汇编程序只

39、汇编8086/8088的指令系统。程序中若出现的指令系统。程序中若出现80286或或80386的指令,则编译会出错。的指令,则编译会出错。如果程序中不定义任何处理器方式伪操作,则汇编程序默认即如果程序中不定义任何处理器方式伪操作,则汇编程序默认即是是.8086方式。方式。.386P指示汇编程序汇编指示汇编程序汇编8086/8088以及所有以及所有80286和和80386(包括保护(包括保护方式和非保护方式)的指令。方式和非保护方式)的指令。433.3.2 数据定义伪指令数据定义伪指令l数据定义伪操作数据定义伪操作用于定义变量类型、给变量赋值。用于定义变量类型、给变量赋值。l常用的有以下几种:常

40、用的有以下几种: 数据定义伪操作的一般格式是数据定义伪操作的一般格式是:变量名变量名 伪操作伪操作 操作数操作数 ,操作数操作数 操作数可以是常数、表达式或字符串,但每项操作数的值操作数可以是常数、表达式或字符串,但每项操作数的值不能超过伪操作所定义的数据类型限定的范围。不能超过伪操作所定义的数据类型限定的范围。操作符操作符DBDWDDDQDT定义定义字节字节(1B)字字(2B)双字双字(4B)四字四字(8B)十字节十字节(10B)44例例1:DATA_B DB 10, 5, 10HDATA_W DW 100H, -4DATA_D DD 0FFFBH汇编后的内存分配情况汇编后的内存分配情况如如

41、右图右图所示。所示。05H10H00H01HFCHFFHFBHFFH00H00H0AHDATA_BDATA_BDATA_WDATA_WDATA_DDATA_D10105 510H10H100H100H- - - -4 40FFFBH0FFFBH45例例2:操作数可以是字符串,例如操作数可以是字符串,例如STR DB HELLO汇编后的情况如图:汇编后的情况如图:注意下面两个定义的不同之处:注意下面两个定义的不同之处:DBAB ;41H在低字节,在低字节,42H在高字节在高字节DW AB ;42H在低字节,在低字节,41H在高字节在高字节STRHELLO48H45H4CH4CH4FH46用用DW

42、定义字符串只允许包含两个字符,定义字符串只允许包含两个字符,否则必须用否则必须用DB指令;指令;字符串的个数不超过字符串的个数不超过255个;个;字符串必须用单引号引起来。字符串必须用单引号引起来。几点说明:几点说明:47操作数操作数?用来保留存储空间,但不存入数据。用来保留存储空间,但不存入数据。例例3:ABC DB 0,1,2,3,4,OK,$ RSV DW ?,?,?,?,?,?,?,?l复制操作符复制操作符DUP:重重复复的的数数据据可可以以使使用用复复制制操操作作符符DUP,如如上上面面RSV亦可写成:亦可写成: RSV DW 8DUP(?)483.3.3 符号定义伪操作符号定义伪操

43、作l符号定义伪操作符号定义伪操作用于给一个用于给一个符号符号重新命名,或定义新重新命名,或定义新的类型属性等。这里的符号可以是汇编语言中所用的的类型属性等。这里的符号可以是汇编语言中所用的变量名、标号名、过程名、记录名、寄存器名以及指变量名、标号名、过程名、记录名、寄存器名以及指令助记符等。令助记符等。l常用的常用的符号定义伪操作有符号定义伪操作有EQU、LABELlEQU格式:格式: 名字名字 EQU 表达式表达式作用:作用:用名字代替一个数值,或一个较长的表达式。用名字代替一个数值,或一个较长的表达式。举例举例:HPIXEL EQU 1024VPIXEL EQU 768SCREENEQU

44、HPIXEL * VPIXEL49符号定义伪操作符号定义伪操作l格式:格式: 名字名字 = 表达式表达式作用:作用: 类似类似 EQU,区别在于,区别在于“ = ”可以对一个名字重复定义。可以对一个名字重复定义。举例举例:COUNT = 10MOV CX, COUNT;(CX) 10COUNT = COUNT -1MOV BX, COUNT;(BX) 9lLABEL格式:格式: 名字名字 LABEL 表达式表达式作用:作用: 定义标号或变量的类型。定义标号或变量的类型。举例举例:AREAW LABEL WORDMOV AREAW , AX ;AX送送AREAW的第的第1、2字节中字节中503.

45、3.4 段定义伪操作段定义伪操作l段定义伪操作段定义伪操作用于在汇编语言源程序中定义逻辑段。用于在汇编语言源程序中定义逻辑段。l常用的段常用的段定义伪操作有定义伪操作有SEGMENT/ENDS、ASSUMElSEGMENT/ENDS格式:格式: 段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别类别作用:作用: 定义一个逻辑段定义一个逻辑段举例举例:STACK SEGMENT DB 100 DUP( ? )STACK ENDS“定位类型定位类型”告诉编译器如何确定逻辑段的边界在存储器中的位置,告诉编译器如何确定逻辑段的边界在存储器中的位置,即对齐方式。有即对齐方式。有PARA、

46、BYTE、WORD和和PAGE四种。四种。“组合类型组合类型”告诉编译器在装入程序时各个逻辑段如何组合。告诉编译器在装入程序时各个逻辑段如何组合。“类别类别”的作用是在连接时决定各逻辑段的装入顺序。的作用是在连接时决定各逻辑段的装入顺序。51段定义伪操作段定义伪操作lASSUME格式:格式: ASSUME 段寄存器段寄存器 : 段名段名 , 段寄存器段寄存器 : 段名段名 , 说明:说明: 将某一个将某一个段寄存器段寄存器和某一个和某一个逻辑段逻辑段进行关联。进行关联。 “段名段名”可以是曾用可以是曾用 SEGMENT 操作符定义过的一个段操作符定义过的一个段名,或是在一个标号或变量前面加上名

47、,或是在一个标号或变量前面加上 SEG 构成的表达式,构成的表达式,还可以是关键字还可以是关键字NOTHING。 需要注意的是,需要注意的是,ASSUME仅仅是通知编译器有关段寄存仅仅是通知编译器有关段寄存器和逻辑段的关系,并没有为段寄存器赋予实际的初值。器和逻辑段的关系,并没有为段寄存器赋予实际的初值。举例举例:ASSUME CS : CODE , DS : DATA1 , SS : STACK ASSUME DS : SEG AREA1 ASSUME ES : NOTHING ;取消前面取消前面ASSUME对对ES的设置的设置 523.3.5 过程定义伪操作过程定义伪操作l过程定义伪操作过

48、程定义伪操作命令为命令为PROC / ENDP。 lPROC / ENDP格式:格式: 过程名过程名 PROC NEAR / FAR RET 过程名过程名 ENDP作用:作用: 定义一个过程,赋予过程一个名字,并指出过程的类型,定义一个过程,赋予过程一个名字,并指出过程的类型,并指出该过程的类型是并指出该过程的类型是NEAR或或FAR。如果没有特别指明,则认。如果没有特别指明,则认为过程类型是为过程类型是NEAR。伪操作码。伪操作码ENDP标志过程定义结束。标志过程定义结束。 注意:注意:PROC和和ENDP必须成对出现。必须成对出现。53 过程的类型有两种:过程的类型有两种: NEAR(默认

49、类型默认类型)表示段内调用;表示段内调用; (SP)(SP-2); (SP+1): (SP)(IP); FAR表示段间调用。表示段间调用。 调用一个过程的格式为:调用一个过程的格式为:CALL 543.3.6 模块定义与连接伪操作(了解)模块定义与连接伪操作(了解)l在编写规模较大的汇编语言程序时,可将程序划分成几在编写规模较大的汇编语言程序时,可将程序划分成几个独立的源程序模块,分别进行汇编,最后统一连接。个独立的源程序模块,分别进行汇编,最后统一连接。各个模块之间可以相互进行各个模块之间可以相互进行符号符号访问。访问。l命令为命令为NAME、END、PUBLIC 和和 EXTRN。 lNA

50、ME格式:格式: Name 模块名模块名作用:作用: 指定源文件汇编后的目标文件名称指定源文件汇编后的目标文件名称lEND格式:格式: END 标号标号作用:作用: 表示源程序到此结束,对于表示源程序到此结束,对于END后面语句不予理会后面语句不予理会55模块定义与连接伪操作(了解)模块定义与连接伪操作(了解)lPUBLIC格式:格式: PUBLIC 符号符号 , 作用:作用: 说明本模块中的某些符号是公共的,即这些符号可以供将说明本模块中的某些符号是公共的,即这些符号可以供将被连接在一起的其他模块使用被连接在一起的其他模块使用说明:说明: “符号符号”可以是本模块中定义的变量、标号或数值的名

51、字,可以是本模块中定义的变量、标号或数值的名字,包括用包括用PROC定义的过程名等。定义的过程名等。lEXTRN格式:格式: EXTRN 名字:类型名字:类型 , 作用:作用: 说明本模块中所用的某些符号是外部的,即这些符号在将说明本模块中所用的某些符号是外部的,即这些符号在将被连接在一起的其他模块中定义(定义这些符号的模块中还必须被连接在一起的其他模块中定义(定义这些符号的模块中还必须用用PUBLIC说明)。说明)。563.3.7 宏处理伪操作宏处理伪操作l如果在程序中需要多次使用一个程序段,可将其定义为如果在程序中需要多次使用一个程序段,可将其定义为宏宏。每次需要时,直接进行调用,称为。每

52、次需要时,直接进行调用,称为宏调用宏调用。【利用【利用过程过程( PROC )可以实现类似功能。)可以实现类似功能。 区别在于:区别在于:宏宏在编译在编译时就插入每个宏调用处(这称为时就插入每个宏调用处(这称为“宏扩展宏扩展”);而);而过程过程是在执行时是在执行时进行跳转。进行跳转。过程过程具有更优的具有更优的空间空间效率,而效率,而宏宏则具有更优的则具有更优的时间时间效效率。】率。】 MACRO/ENDM格式:格式: 宏指令名宏指令名 MACRO ; (宏定义体宏定义体) ENDM作用:作用: 将将宏指令名宏指令名定义为定义为宏定义体宏定义体中包含的程序段。中包含的程序段。57宏处理伪操作

53、宏处理伪操作l宏定义伪操作宏定义伪操作允许带允许带参数参数,从而具有更强的通用性。,从而具有更强的通用性。l例:定义一个宏,用于两个压缩的例:定义一个宏,用于两个压缩的BCD数相加,结果放数相加,结果放在第一个操作数中。在第一个操作数中。DECADDMACRO OPR1 , OPR2MOV AL , OPR1ADD AL , OPR2DAAMOV OPR1 , ALENDMl下面使用下面使用debug来观察该例中来观察该例中“宏扩展宏扩展”是如何进行的:是如何进行的:58源文件源文件59反汇编并执行观察结果反汇编并执行观察结果603.4 DOS和和BIOS调用(了解)调用(了解)lDOS 和和

54、 BIOS为用户提供了两组系统服务程序。为用户提供了两组系统服务程序。lBIOS是是 IBM PC的基本的基本IO系统,包括系统测试程序、系统,包括系统测试程序、初始化引导程序、一部分中断矢量装入程序以及部分外初始化引导程序、一部分中断矢量装入程序以及部分外设的服务程序。这些程序都固化在主板上的设的服务程序。这些程序都固化在主板上的ROM中。中。lDOS是是 IBM PC的操作系统,负责管理系统的所有资源。的操作系统,负责管理系统的所有资源。其中包括大量可供用户调用的服务程序。其中包括大量可供用户调用的服务程序。lDOS和和BIOS调用不是使用调用不是使用CALL命令,而采用软中断指命令,而采

55、用软中断指令令 INT n。61DOS和和BIOS调用调用l用户程序控制用户程序控制PC机硬件的方式机硬件的方式使用高级语言提供的功能控制硬件使用高级语言提供的功能控制硬件调用方便,但灵活性较低、速度较慢。调用方便,但灵活性较低、速度较慢。使用使用DOS提供的程序控制硬件提供的程序控制硬件调用较为方便,程序可移植性好,编程简单。调用较为方便,程序可移植性好,编程简单。使用使用BIOS提供的程序控制硬件提供的程序控制硬件这种控制比较低层,因而可移植性差,但效率更高。这种控制比较低层,因而可移植性差,但效率更高。直接访问硬件直接访问硬件要求用户对硬件非常熟悉。此种方式只用于两种情况:为了获得要求用

56、户对硬件非常熟悉。此种方式只用于两种情况:为了获得高效率,或是为了获得高效率,或是为了获得DOS和和BIOS不支持的功能。不支持的功能。62DOS调用调用l8086指令系统中,有一条软中断指令指令系统中,有一条软中断指令 INT n。当当n= 51FH时,调用时,调用BIOS服务程序;服务程序;当当n=203FH时,调用时,调用 DOS服务程序。服务程序。l下表列出了部分下表列出了部分DOS软中断的功能:软中断的功能:中断号中断号功能功能INT 20H程序正常退出程序正常退出INT 21H系统功能调用系统功能调用INT 22H结束退出结束退出INT 28H-2FHDOS专用专用63INT 21

57、H调用调用l其中其中 INT 21H是一个具有完整功能的服务程序,一般称之是一个具有完整功能的服务程序,一般称之为为DOS系统功能调用系统功能调用。是。是最最常用的常用的DOS中断。中断。lINT 21H中断具有近中断具有近90个子功能,大致分为个子功能,大致分为4个方面:个方面: 设备管理、目录管理、文件管理和其他。设备管理、目录管理、文件管理和其他。l系统功能调用系统功能调用(INT 21H)的使用步骤如下:的使用步骤如下:置系统功能号置系统功能号n (放入放入AH)置入口参数置入口参数执行执行INT 21H分析出口参数分析出口参数64INT 21H调用示例调用示例l例例:从键盘读入一个字

58、符从键盘读入一个字符, 判断是判断是 Y 还是还是 N , 以执行对应操作。以执行对应操作。资料:资料: 功能号功能号01H的的int 21H中断中断功能描述功能描述:从标准输入设备:从标准输入设备(如:键盘如:键盘)读入一个字符读入一个字符功能号功能号: AH 01H,过滤掉控制字符,并回显,过滤掉控制字符,并回显出口参数出口参数: AL 输入字符的输入字符的ASCII码码 KEY:MOV AH , 1INT 21H;执行调用执行调用CMP AL , YJE YESCMP AL , NJE NOJMP KEY;输入其他字符,退回继续等待输入输入其他字符,退回继续等待输入YES :NO:65B

59、IOS调用调用l下面列出了部分下面列出了部分BIOS中断:中断:中断号中断号功能功能INT 09H键盘输入键盘输入INT 10H显示服务显示服务INT 0EH磁盘驱动器输入磁盘驱动器输入/输出输出INT 13H直接磁盘服务直接磁盘服务 INT 16H键盘服务键盘服务 INT 19H重启系统重启系统关于关于BIOS中断的所有中断号内容(从中断的所有中断号内容(从05H1FH),参见书附录),参见书附录3.366Review伪操作类型伪操作类型举例举例处理器方式伪操作处理器方式伪操作.8086数据定义伪操作数据定义伪操作DBDB、DWDW、DDDD符号定义伪操作符号定义伪操作EQUEQU、LABE

60、L段定义伪操作段定义伪操作SEGMENT/ENDSSEGMENT/ENDS、ASSUMEASSUME过程定义伪操作过程定义伪操作PROC/ENDPPROC/ENDP模块定义与连接伪操作模块定义与连接伪操作NAME、END、PUBLIC、EXTRN宏处理伪操作宏处理伪操作MACRO/ENDMMACRO/ENDM、PURGE条件伪操作条件伪操作IF、IFE、IFDEF列表伪操作列表伪操作.LIST、TITLE、PAGE其他伪操作其他伪操作COMMENT、.RADIX67BIOS调用调用lBIOS调用的使用步骤如下:调用的使用步骤如下:置系统功能号置系统功能号n (放入放入AH)置入口参数置入口参数

61、执行执行 INT n分析出口参数分析出口参数l举键盘输入服务(举键盘输入服务(INT 16H)为例。其主要功能有三个,)为例。其主要功能有三个,分别用于分别用于读键盘读键盘、读扩展键盘读扩展键盘和和读取功能键,读取功能键,分别对应功分别对应功能号能号0、1、2(AH0、1、2)。)。 下面一段程序的功能是:下面一段程序的功能是:按下按下F1和和F2键,分别执行两段不键,分别执行两段不同的程序,按其他键则转至错误处理。同的程序,按其他键则转至错误处理。68INT 16H调用示例调用示例资料:资料: 功能号功能号00H的的int 16H中断中断功能描述功能描述: 从键盘读入字符从键盘读入字符 入口

62、参数入口参数: AH00H 出口参数出口参数: AH键盘的扫描码键盘的扫描码 AL字符的字符的ASCII码码 MOV AH , 0INT 16H; 执行调用执行调用CMP AL , 0JNE ERROR; 若为字符键,转若为字符键,转 ERRORCMP AH , 3BH; F1 键码为键码为 3BHJE TT1CMP AH , 3CH; F2 键码为键码为 3CHJE TT2JMP ERRTT1:;处理;处理 F1 键功能键功能TT2:;处理;处理 F2 键功能键功能ERR: 资料:资料:键码键码又称又称键盘扫描码键盘扫描码,F1 键码为键码为 3BHF2 键码为键码为 3CH69INT 10

63、H调用示例调用示例l从上页的例子中,可以看出,从上页的例子中,可以看出,同样的功能,往往既可以用同样的功能,往往既可以用BIOS中断调用来实现,也可以用中断调用来实现,也可以用DOS中断调用来实现。中断调用来实现。比比如磁盘服务、键盘服务、显示字符等。差别在于:如磁盘服务、键盘服务、显示字符等。差别在于:BIOS中中断调用往往功能更强大、控制更灵活。断调用往往功能更强大、控制更灵活。l例:例:INT 10H功能号功能号09H,“在当前光标位置显示字符在当前光标位置显示字符”。MOV AH , 9;显示字符显示字符MOV AL , a;字符字符MOV BL , 0Ch; 0表示背景黑色,表示背景

64、黑色,0Ch表示字符红色表示字符红色MOV BH , 0;第第0页页MOV CX , 8;字符重复个数字符重复个数INT 10h70INT 10H调用示例调用示例运行结果运行结果提示提示:由于程序运行在由于程序运行在“虚拟虚拟”的的8086模式下,模式下,在操作硬件时跟纯在操作硬件时跟纯DOS仍存在一定差异。仍存在一定差异。如果程序直接双击运行时结果跟预期不符,如果程序直接双击运行时结果跟预期不符,(比如窗口一闪而过)(比如窗口一闪而过)可使用可使用debug加载然后输入加载然后输入g运行。运行。71汇编语言设计举例汇编语言设计举例l字符串查找字符串查找 内存中已经存有一张内存中已经存有一张表

65、表,要求从键盘上输入一,要求从键盘上输入一个个字符串字符串,然后在表中查找该字符串,如有,则在屏幕上显,然后在表中查找该字符串,如有,则在屏幕上显示示“OK!”;如果没有,则显示;如果没有,则显示“NO!”;若输入字符串长度;若输入字符串长度超过内存中表的长度,则显示超过内存中表的长度,则显示“Wrong! The string is too long!”逻辑分析:逻辑分析:查找可以分两步进行,先在表中搜索字符串的查找可以分两步进行,先在表中搜索字符串的第一个字符第一个字符,如有,再比较字符串的如有,再比较字符串的其他字符其他字符是否一致。是否一致。功能可行性分析:功能可行性分析:在屏幕上显示

66、字符串可以使用功能号在屏幕上显示字符串可以使用功能号 09H的的21号中断;号中断;从键盘上接收字符串可以使用功能号从键盘上接收字符串可以使用功能号0AH的的21号中断。号中断。教材教材 P21372流程图流程图显示提示符显示提示符从键盘接收提示符从键盘接收提示符字符串首址送字符串首址送SI,表首址送,表首址送DI字符串长度送字符串长度送BX,表长度送,表长度送CX表长表长=串长串长搜索、匹配等工作搜索、匹配等工作开始开始返回返回显示显示“串太长串太长”具体见教材具体见教材P21473资料资料1: 功能号功能号09H的的int 21H中断中断功能描述功能描述:显示字符串:显示字符串 (串尾字符

67、为串尾字符为$,但不显示但不显示)入口参数入口参数: AH09HDS:DX被显示字符串的首地址被显示字符串的首地址出口参数出口参数:无:无data SEGMENTmsg DB Hello, World!$data ENDScode SEGMENTASSUME CS : code , DS : dataMAINPROC NEARstart: MOV AX , data MOVDS , AX LEA DX , msg MOV AH , 9hINT 21hMOV AH , 4ChINT 21hMAINENDPcode ENDSEND start例如例如: :74资料资料2: 功能号功能号0AH的的i

68、nt 21H中断中断功能描述功能描述:从标准输入设备:从标准输入设备(如:键盘如:键盘)读入一个字符串,遇到读入一个字符串,遇到“回车键回车键”结束结束输入输入 。入口参数入口参数: AH0AHDS:DX存放输入字符的起始地址存放输入字符的起始地址接受输入字符串缓冲区的定义说明:接受输入字符串缓冲区的定义说明:1、第一个字节为缓冲区的最大容量;、第一个字节为缓冲区的最大容量;2、第二个字节为实际输入的字符数、第二个字节为实际输入的字符数(不包括回车键不包括回车键) ;3、从第三个字节开始存放实际输入的字符串;、从第三个字节开始存放实际输入的字符串;4、字符串以回车键结束,回车符是接受的最后一个

69、字符;、字符串以回车键结束,回车符是接受的最后一个字符;5、若输入的字符数超过缓冲区的最大容量,则多出的部分被丢弃,、若输入的字符数超过缓冲区的最大容量,则多出的部分被丢弃, 直到输入直到输入“回车回车”键才结束输入。键才结束输入。 例如:例如:BUFFDB 80 , ? , 80 DUP(?);最多接受最多接受80个字符个字符(含回车符含回车符)出口参数出口参数:无:无75源码分析源码分析1DATASEGMENTTABLEDBABCDEFGHIJKLMNOPQRSTUVWXYZSTR1DBPlease enter a string: , 0DH , 0AH ,$STR2DBWrong! Th

70、e string is too long! $STR3DBNo! $STR4DBOK! $BUFFERDB40DB?DB40 DUP( ? )TAB_LENEQU26DATA ENDSSTACKSEGMENTSTACKDB100 DUP(?)STACKENDS 堆栈段定义堆栈段定义 数据段数据段 定义定义76源码分析源码分析2CODESEGMENTASSUME CS : CODE , DS : DATA , ES : DATA , SS : STACKSEARCHPROCFARSTART:MOV AX , DATAMOV DS , AXMOV ES , AXLEADX , STR1 ;MOV

71、AH , 09 ;INT21H ; 显示提示符显示提示符77源码分析源码分析3LEADX , BUFFER;参见;参见“0AH号系统调用号系统调用”资料资料MOVAH , 0AHINT21H;从键盘接收字符串;从键盘接收字符串MOVSI , DX;(SI) 串首址串首址INCSIMOVBL , SI;参阅;参阅“0AH号系统调用号系统调用”资料资料MOVBH , 0;(BX) 实际输入字符串长度实际输入字符串长度INCSI;将;将SI指向输入字符串首字母指向输入字符串首字母LEADI , TABLE;(DI) 表首址表首址MOVCX , TAB_LEN;(CX) 表长度表长度CMPCX , B

72、X;表长;表长 = 串长?串长?JNCGOON;是,转;是,转GOONLEADX , STR2;JMP EXIT;否则显示串太长;否则显示串太长78源码分析源码分析4GOON:CLD MOVAL , SI;(AL) 字符串第一个字符字符串第一个字符SCAN:REPNZ SCASB;在表中搜索第一个字符;在表中搜索第一个字符JZMATCH;找到,转;找到,转MATCHERROR:LEADX , STR3;否则,显示;否则,显示NO!JMPEXITMATCH:INCCXCMPCX , BX;剩余表长;剩余表长 = 串长?串长?JCERROR;否,显示;否,显示NO!PUSHCXPUSHSIPUSH

73、DIMOVCX , BXDECDIREPZCMPSB;比较串中其余字符;比较串中其余字符79源码分析源码分析5POPDIPOPSIPOPCXJZFOUND;找到字符串,转;找到字符串,转FOUNDJCXZERROR;否则,若全表搜索完,显示;否则,若全表搜索完,显示No!JMPSCAN;全表未搜索完,转;全表未搜索完,转 SCANFOUND:DECDI;( DI ) 字符串偏移地址字符串偏移地址LEADX , STR4;显示;显示OK!EXIT:MOVAH , 09HINT21H;显示退出字符串;显示退出字符串MOV AH, 4CHINT21HSEARCHENDPCODEENDSENDSTAR

74、T80如何阅读汇编代码如何阅读汇编代码(供参考供参考)对于较长的汇编代码,可通过对于较长的汇编代码,可通过“分块法分块法”阅读。也就是根据阅读。也就是根据记忆中的既有模板,将源码拆成多个记忆中的既有模板,将源码拆成多个“功能块功能块”。这要求对一。这要求对一些基本模板要有一定印象。些基本模板要有一定印象。(比如:功能号(比如:功能号09H的的INT21调用模板;调用模板;查找字符串、对比字符串的模板。一些常用功能的实现往往有其相对固查找字符串、对比字符串的模板。一些常用功能的实现往往有其相对固定的套路,在源码中能较容易看出。大家可以自己试着总结。)定的套路,在源码中能较容易看出。大家可以自己试

75、着总结。)同时可以借助于一些标记,比如同时可以借助于一些标记,比如“INT xx”往往标记着一个往往标记着一个功能块的结束,那么可以循着往上寻找出一个完整的功能块;功能块的结束,那么可以循着往上寻找出一个完整的功能块;“标号标号”也可以帮助拆分功能块,尤其是书写优秀的源码,往也可以帮助拆分功能块,尤其是书写优秀的源码,往往采用有意义、一目了然的标号。往采用有意义、一目了然的标号。总之,阅读汇编源码要注意积累。在阅读别人源码时要加总之,阅读汇编源码要注意积累。在阅读别人源码时要加以留心并注意总结,逐步提升自己水平。以留心并注意总结,逐步提升自己水平。81汇编语言程序设计小节l寻址方式寻址方式存储器操作数的寻址方式;存储器操作数的寻址方式;l指令系统指令系统8088/8086指令系统;指令系统;l汇编语言汇编语言掌握各种掌握各种“格式格式”、规则等;、规则等;l汇编高手汇编高手勇于实践,触类旁通!勇于实践,触类旁通!82题题2-11、题、题2-12、题、题2-13 题题3-1、 题题3-4、 题题3-5、 题题3-7 作业作业结束结束

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

最新文档


当前位置:首页 > 办公文档 > 工作计划

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