第五章-汇编语言程序设计课件.ppt
第五章第五章 汇编语言程序设计汇编语言程序设计 程序是计算机命令(语句)的有序集合。程序是计算机命令(语句)的有序集合。机器语言、汇编语言、高级语言机器语言、汇编语言、高级语言 机器语言机器语言是一种用二进制数表示指令和数据,能是一种用二进制数表示指令和数据,能被机器直接识别的语言。被机器直接识别的语言。汇编语言弥补了机器语言的不足,采用助记符编汇编语言弥补了机器语言的不足,采用助记符编程。但也是程。但也是面对机器面对机器的,要求程序员对机器指令系的,要求程序员对机器指令系统、内存空间分配了如指掌,地址是汇编语言关键统、内存空间分配了如指掌,地址是汇编语言关键所在,执行速度快,但可移植性差。所在,执行速度快,但可移植性差。高级语言是面向过程的,程序员没必要了解内存高级语言是面向过程的,程序员没必要了解内存分配,更符合人的思维方式,执行速度相对慢一些,分配,更符合人的思维方式,执行速度相对慢一些,可移植性好。可移植性好。5.1汇编语言的基本语法汇编语言的基本语法 汇编语言源程序中的语句可以分为三种类型:汇编语言源程序中的语句可以分为三种类型:指令语句,伪指令语句和宏指令语句。指令语句,伪指令语句和宏指令语句。(1)指令语句:它是能产生目标代码,指令语句:它是能产生目标代码,CPU 可可以执行的能完成特定功能的语句。以执行的能完成特定功能的语句。(2)伪指令语句:它是一种不产生目标代码的语伪指令语句:它是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应如何汇编。句,它仅仅在汇编过程中告诉汇编程序应如何汇编。伪指令语句是汇编程序在汇编时使用的。伪指令语句是汇编程序在汇编时使用的。(3)宏指令语句宏指令语句:它是一种编程者利用伪指令语它是一种编程者利用伪指令语句自己定义的语句句自己定义的语句。1.伪指令的语句格式伪指令的语句格式 1)标号)标号 标号名字段,它是任选字段。目标名后面标号名字段,它是任选字段。目标名后面不能用冒不能用冒号号“:”,标号名可以是常量名、变量名、过程名、结,标号名可以是常量名、变量名、过程名、结构名、记录名等。可以作为指令语句和伪指令语句的操构名、记录名等。可以作为指令语句和伪指令语句的操作数,这时,标号名表示一个常量或存储器地址。作数,这时,标号名表示一个常量或存储器地址。2)伪指令)伪指令 助记符或伪操作字段,不可省略。伪指令种类很助记符或伪操作字段,不可省略。伪指令种类很多,如定义数据伪指令多,如定义数据伪指令DB,DW,DD;段定义伪指令;段定义伪指令SEGMENT;定义过程伪指令;定义过程伪指令PROC;。它们是伪。它们是伪指令语句要求汇编程序完成的具体操作命令指令语句要求汇编程序完成的具体操作命令 3)操作数)操作数 本字段是否需要,需要几个,需要什么样的操作本字段是否需要,需要几个,需要什么样的操作数等都由伪指令字段中伪指令来确定。操作数可以是数等都由伪指令字段中伪指令来确定。操作数可以是一个常数(二进制、十进制、十六进制等)、字符串、一个常数(二进制、十进制、十六进制等)、字符串、常量名、变量名、标号、一些专用的符号(如常量名、变量名、标号、一些专用的符号(如BYTE,FAR,PARA等)。等)。4)注释)注释 任选字段,它必须以分号为开始,它的作用与指任选字段,它必须以分号为开始,它的作用与指令语句的注释字段相同。令语句的注释字段相同。2.常数、变量和标号常数、变量和标号 常数、变量和标号是汇编语言能识别的数据项,常数、变量和标号是汇编语言能识别的数据项,它是指令和伪指令语句中操作数的基本组成部分。它是指令和伪指令语句中操作数的基本组成部分。一个数据项包含有它的数值和属性两部分,这两部一个数据项包含有它的数值和属性两部分,这两部分对一条语句汇编成机器目标代码都有直接关系。分对一条语句汇编成机器目标代码都有直接关系。1)常数常数 常数是没有任何属性的纯数值。在汇编期间,它常数是没有任何属性的纯数值。在汇编期间,它的值已能完全确定,且在程序运行中,它也不会发生的值已能完全确定,且在程序运行中,它也不会发生变化。变化。2)变量变量 变量是代表存放在某些存储单元的数据,这些数据变量是代表存放在某些存储单元的数据,这些数据在程序运行期间随时可以修改。为了便于对变量的访在程序运行期间随时可以修改。为了便于对变量的访问,它常常以变量名的形式出现在程序中,它可以认问,它常常以变量名的形式出现在程序中,它可以认为是存放数据存储单元的符号地址。为是存放数据存储单元的符号地址。(1)变量的定义与预置:定义变量就是给变量分)变量的定义与预置:定义变量就是给变量分配存储单元,且对这个存储单元赋予一个符号名配存储单元,且对这个存储单元赋予一个符号名变量名,同时将这些存储单元预置初值。变量名,同时将这些存储单元预置初值。定义变量是用数据定义伪指令定义变量是用数据定义伪指令DB,DW,DD等。等。例如:例如:VAR_DATASEGMENT DATA1 DB 12H DATA2 DB 34H DATA3 DW 5678H VAR_DATA ENDS(2)数据定)数据定义伪义伪指令:指令:为为数据数据项项分配存分配存储单储单元并元并预预置初置初值值。变量名变量名表达式表达式1,表达式,表达式2,数值表达式。数值表达式。DA_BYTEDB 50H,50 DA_WORD DW0A3F1H,4981H?表达式:不带引号的?表示可预置任何内容。?表达式:不带引号的?表示可预置任何内容。DA_BDB?,?DA_WDW?,?字符串表达式:对于字符串表达式:对于DB伪指令,为字符串中每一个伪指令,为字符串中每一个字符分配一个字节单元。字符串必须是用引号括起来且字符分配一个字节单元。字符串必须是用引号括起来且不超过不超过255个字符。字符串自左至右以字符的个字符。字符串自左至右以字符的ASCII码按码按地址递增的排列顺序依次存放地址递增的排列顺序依次存放。STRING1 DBABCDEFSTRING2 DW AB,CD,EF STRING3 DD AB,CD 带带DUP表达式:表达式:DUP是定义重复数据操作符。是定义重复数据操作符。变量名变量名表达式表达式1,DUP(表达式表达式2)D_B1 DB 20H DUP(?)D_B2 DB 10H DUP(ABCD)D_W1 DW 10H DUP(4)3)标号标号 标号是一条指令目标代码的符号地址,它常作为标号是一条指令目标代码的符号地址,它常作为转移指令(含子程序调用指令)的操作数。转移指令(含子程序调用指令)的操作数。LOP1:LOOPLOP1JNENEXTNEXT:(1)段属性)段属性(2)偏移量属性:)偏移量属性:(3)距离属性:)距离属性:NEAR(近);(近);FAR(远)(远)(1)SEG格式:格式:SEG功能是求符号名所在段的段基址。功能是求符号名所在段的段基址。(2)OFFSET格式:格式:OFFSET 功能是求符号名所在段的偏移地址。功能是求符号名所在段的偏移地址。(3)TYPE格式:格式:TYPE 功能是获得符号名类型值。功能是获得符号名类型值。3.运算符运算符(4)SIZE格式:格式:SIZE 功能是获得为符号名分配的字节数。为符号名定功能是获得为符号名分配的字节数。为符号名定义的数据项必须是用重复格式义的数据项必须是用重复格式DUP()定义的。定义的。(5)PTR格式:格式:PTR 功能是定义符号名为新类型。如,设内存变量功能是定义符号名为新类型。如,设内存变量D1是字节属性,把它的两个字节内容送到是字节属性,把它的两个字节内容送到AX中中 MOV AX,WORD PTR D1 5.2 伪指令伪指令 伪指令没有对应的机器指令,它不是由伪指令没有对应的机器指令,它不是由86系列系列CPU来执行,而是由来执行,而是由MASM-86识别,并完成相应的识别,并完成相应的功能。它在很大程度上规定了功能。它在很大程度上规定了MASM-86的性能,因的性能,因此也可称之为汇编命令。此也可称之为汇编命令。1.符号定义伪指令(赋值语句)符号定义伪指令(赋值语句)1)EQU格式:格式:EQU 2)格式:格式:=2.内存数据定义伪指令内存数据定义伪指令 1)字节定义伪指令字节定义伪指令DB格式:格式:名字名字 DB 3)4字节定义伪指令字节定义伪指令DD格式:格式:名字名字 DD 2)字定义伪指令字定义伪指令DW格式:格式:名字名字 DW 3.段定义伪指令段定义伪指令 1).SEGMENT/ENDS格式:格式:SEGMENT定位方式定位方式连接方式连接方式类类 型名型名 ENDS 段定义伪指令为程序的汇编和连接说明了段名、段定义伪指令为程序的汇编和连接说明了段名、段的各种属性以及段的开始和结束。段名是自定义符,段的各种属性以及段的开始和结束。段名是自定义符,开始的段名与结束的段名必须相同。段的长度不超过开始的段名与结束的段名必须相同。段的长度不超过64KB。(1)定位方式(定位类型)定位方式(定位类型Align):定位方式指定):定位方式指定段的起始地址边界,方式有段的起始地址边界,方式有4种。种。PAGE指定起始地址的低指定起始地址的低8位是位是0,即其值能,即其值能被被256整除(称为页对齐)。整除(称为页对齐)。PARA指定起始地址的低指定起始地址的低4位是位是0,即其值能,即其值能被被16整除(称为段对齐)。这是系统隐含定位方式。整除(称为段对齐)。这是系统隐含定位方式。WORD指定起始地址的最低位是指定起始地址的最低位是0,即其值,即其值能被能被2整除(称为字对齐)。整除(称为字对齐)。BYTE指定起始地址是任意值(称为字节对指定起始地址是任意值(称为字节对齐)。齐)。(2)连接方式(组合类型):连接方式告诉连接程)连接方式(组合类型):连接方式告诉连接程序,本段与其他段可按某种方式连接,它有序,本段与其他段可按某种方式连接,它有6种选择。种选择。PUBLIC告诉连接程序本段与其他同名同类告诉连接程序本段与其他同名同类别的段连接起来,公用一个段的起始地址,形成一个物别的段连接起来,公用一个段的起始地址,形成一个物理段。理段。STACK表示本段是堆栈段,连接方式同表示本段是堆栈段,连接方式同PUBLIC,连接后的段起始地址在,连接后的段起始地址在SS寄存器中。连接程寄存器中。连接程序要求源程序至少要有一个堆栈段,否则提示错误,此序要求源程序至少要有一个堆栈段,否则提示错误,此时,系统取约定堆栈段值。时,系统取约定堆栈段值。空缺(空缺(NONE)表示本段不与任何段连接,这表示本段不与任何段连接,这是系统隐含连接方式。是系统隐含连接方式。COMMON表示本段与同名同类型的段共用同表示本段与同名同类型的段共用同一段起始地址,即同名同类段相重叠,段的长度是最一段起始地址,即同名同类段相重叠,段的长度是最长段的长度。长段的长度。MEMORY表示本段在连接时定位在所有段之表示本段在连接时定位在所有段之上,即高地址处。上,即高地址处。AT表达式表达式表示本段定位在表达式值指定的段地表示本段定位在表达式值指定的段地址处。址处。2).ASSUME 格式:格式:ASSUME 段寄存器:段定义名段寄存器:段定义名1,段寄,段寄存器:段定义名存器:段定义名2,ASSUME伪指令告诉汇编程序,将某一个段寄存伪指令告诉汇编程序,将某一个段寄存器设置为存放某一个逻辑段的段地址,即明确指出源程器设置为存放某一个逻辑段的段地址,即明确指出源程序中的序中的逻辑段与物理段之间的关系逻辑段与物理段之间的关系。当汇编程序汇编一。当汇编程序汇编一个逻辑段时,即可利用相应的段寄存器寻址该逻辑段中个逻辑段时,即可利用相应的段寄存器寻址该逻辑段中的指令或数据。在一个源程序中,的指令或数据。在一个源程序中,ASSUME伪指令定伪指令定义符应该放在可执行程序开始位置的前面。义符应该放在可执行程序开始位置的前面。ASSUME伪指令只是通知汇编程序有关段寄存器伪指令只是通知汇编程序有关段寄存器与逻辑段的关系,并没有给段寄存器赋予实际的初值。与逻辑段的关系,并没有给段寄存器赋予实际的初值。用户需要通过指令给有关段寄存器赋值。用户需要通过指令给有关段寄存器赋值。.STACK 64 .DATA DATA1 DB 15H DATA2 DB 29H SUM DB?.CODE 3.简化段定义简化段定义 “.CODE”、“.DATA”和和“.STACK”来分别对应寄存来分别对应寄存器器CS、DS和和SS。例如以下代码片段:例如以下代码片段:MAIN PROC FARMOV AX,DATA MOV DS,AX STSEG SEGMENT DB 64 DUP (?)STSEG ENDS4 过程(子程序)定义伪指令过程(子程序)定义伪指令 格式:格式:PROCNEAR(或(或 FAR)ENDP 定义过程是为实现子程序调用而设的。调用格式为:定义过程是为实现子程序调用而设的。调用格式为:CALL 过程起始名和终止名必须相同。过程起始名和终止名必须相同。5 模块定义与连接伪指令模块定义与连接伪指令 1)NAME格式:格式:NAME模块名模块名 该伪指令说明程序模块的开始,并指出模块名。该伪指令说明程序模块的开始,并指出模块名。模块名是自定义符,它不能是系统保留字,每次汇模块名是自定义符,它不能是系统保留字,每次汇编只能出现一次。若该伪指令默认,则取编只能出现一次。若该伪指令默认,则取TITLE语句语句中的页标题前中的页标题前6个字符;若没有个字符;若没有TITLE语句,则取源语句,则取源程序文件名为模块名。程序文件名为模块名。2)END 格式:格式:END启动标号或过程名启动标号或过程名 该伪指令告诉汇编程序源文件结束,对于该伪指令告诉汇编程序源文件结束,对于END后的后的语句可以不予理会,并给出执行程序的入口位置。语句可以不予理会,并给出执行程序的入口位置。END伪指令将标号的段值和偏移地址分别提供给伪指令将标号的段值和偏移地址分别提供给CS和和IP寄存器。方括号中的标号是任选项。如果有多个模寄存器。方括号中的标号是任选项。如果有多个模块连接在一起,则只有主模块的块连接在一起,则只有主模块的END语句使用标号。语句使用标号。6.列表伪操作列表伪操作 1)LIST 汇编程序遇到伪操作汇编程序遇到伪操作.LIST时,禁止其后的源程时,禁止其后的源程序和目标代码在列表文件中输出,直到下一个序和目标代码在列表文件中输出,直到下一个.LIST为止。为止。.LIST伪操作规定将后面的源程序和目标代码伪操作规定将后面的源程序和目标代码列表输出。这个伪操作相当于列表文件的默认状态。列表输出。这个伪操作相当于列表文件的默认状态。2)TITLE 格式:格式:TITLE 标题名标题名 功能是指定列表文件每一页的标题名,标题名功能是指定列表文件每一页的标题名,标题名可以是不超过可以是不超过80个字符的字符串。个字符的字符串。当源程序中未用当源程序中未用NAME伪操作时,由伪操作时,由TITLE伪操伪操作指定的标题名的前六个字符,同时作为汇编以后得作指定的标题名的前六个字符,同时作为汇编以后得到的目标程序的模块名。到的目标程序的模块名。如:如:TITLE Main Program 3)PAGE 伪操作命令用来在汇编程序中设置列表文件每伪操作命令用来在汇编程序中设置列表文件每页的长度(行数)和每行的宽度(列数)。页长可以页的长度(行数)和每行的宽度(列数)。页长可以是是10255行,默认值为行,默认值为50行;行宽为行;行宽为60132字符,字符,默认值为默认值为80字符。字符。7.其他伪操作其他伪操作 1)RADIX 通常,汇编语言源程序中常数的默认基数为十进通常,汇编语言源程序中常数的默认基数为十进制数,伪操作命令制数,伪操作命令.RADIX可以改变这个默认的基数,可以改变这个默认的基数,格式为:格式为:.RADIX 表达式表达式 2)定位伪指令)定位伪指令 ORG 格式:格式:ORG 该伪指令把以下语句定义的内存数据或程序,从该伪指令把以下语句定义的内存数据或程序,从表达式指定的起点(偏移地址)开始连续存放,直至遇表达式指定的起点(偏移地址)开始连续存放,直至遇到新的到新的ORG指令。表达式的值是一个无符号数。它一指令。表达式的值是一个无符号数。它一般用于数据段或代码段中。般用于数据段或代码段中。5.3 系统功能调用系统功能调用 DOS(Disk Operation System)和)和BIOS(Basic Input and Output System)为用户提供了两组系统)为用户提供了两组系统服务程序。服务程序。用户程序可以调用这些系统服务程序用户程序可以调用这些系统服务程序。但在调用时应注意:但在调用时应注意:第一,不用第一,不用CALL命令命令;第二,不用这些系统服务程序的名称,而采用软中断第二,不用这些系统服务程序的名称,而采用软中断 指令指令INT n;第三,用户程序也不必与这些服务程序的代码连接。第三,用户程序也不必与这些服务程序的代码连接。BIOS是微机的基本是微机的基本I/O系统。包括系统测试程系统。包括系统测试程序、初始化引导程序、一部分中断矢量装入程序及外序、初始化引导程序、一部分中断矢量装入程序及外部设备的服务程序。由于这些程序固化在部设备的服务程序。由于这些程序固化在ROM中,中,只要机器通电,用户便可以调用它们。只要机器通电,用户便可以调用它们。DOS是微机的操作系统,负责管理系统的所有是微机的操作系统,负责管理系统的所有资源,协调微机的操作,其中包括大量的可供用户资源,协调微机的操作,其中包括大量的可供用户调用的服务程序,完成设备的管理及磁盘文件的管调用的服务程序,完成设备的管理及磁盘文件的管理。理。第一个途径是普通用户第一个途径是普通用户从键盘输入命令,从键盘输入命令,DOS的的COMMAND.COM模块接收、模块接收、识别、处理键入的命令。识别、处理键入的命令。第二个途径是高级用户第二个途径是高级用户通过用户程序去调用通过用户程序去调用DOS和和BIOS中的服务程序,高级中的服务程序,高级用户需要对操作系统有较深用户需要对操作系统有较深入的了解。入的了解。1)用户与用户与DOS的关系的关系2)用户程序控制微机硬件的方式用户程序控制微机硬件的方式 2.DOS系统功能调用系统功能调用 8086/8088指令系统中,每执行一条软中断指令指令系统中,每执行一条软中断指令INT n,就调用一个相应的中断服务程序。,就调用一个相应的中断服务程序。当当n=51FH时,调用时,调用BIOS中的服务程序,中的服务程序,当当n=203FH时,调用时,调用DOS中的服务程序。其中,中的服务程序。其中,INT 21H是一个具有多种功能的服务程序,一般称是一个具有多种功能的服务程序,一般称之为之为DOS系统功能调用系统功能调用。DOS中断的中断的规规定,定,输输入入口参数,然后入入口参数,然后执执行行INT指指令,最后分析出口参数。令,最后分析出口参数。INT 21H 具有具有80个子功能中断服务程序,子功能个子功能中断服务程序,子功能的编号称为功能号。的编号称为功能号。INT 21H功能大致可以分为四个功能大致可以分为四个方面,方面,即设备管理、目录管理、文件管理和其他。即设备管理、目录管理、文件管理和其他。设备管理:键盘输入、显示器输出、打印机输出、设备管理:键盘输入、显示器输出、打印机输出、串行设备输入串行设备输入/输出、初始化磁盘、选择当前磁盘、取输出、初始化磁盘、选择当前磁盘、取剩余磁盘空间等。剩余磁盘空间等。目录管理:查找目录项、查找文件、置目录管理:查找目录项、查找文件、置/取文件属取文件属性、文件改名等。性、文件改名等。文件管理:打开、关闭、读文件管理:打开、关闭、读/写、删除文件等,这写、删除文件等,这是是DOS提供给用户的最重要的系统功能调用。提供给用户的最重要的系统功能调用。其他功能:终止程序、置其他功能:终止程序、置/取中断矢量、分配内存、取中断矢量、分配内存、置置/取日期及时间等。取日期及时间等。功能调用的格式:功能调用的格式:传送入口参数到指定寄存器中;传送入口参数到指定寄存器中;功能号送入功能号送入AH寄存器;寄存器;INT 21H 有的程序没有入口参数,则只需安排后两个语句,有的程序没有入口参数,则只需安排后两个语句,调用结束后,系统将出口参数送到指定寄存器中或从调用结束后,系统将出口参数送到指定寄存器中或从屏幕上显示出来。屏幕上显示出来。1号号DOS系统功能调用,使用格式如下所示:系统功能调用,使用格式如下所示:MOV AH,1 INT 21H 1)键盘输入单字符)键盘输入单字符 没有入口参数,执行时,系统等待键盘输入,待程没有入口参数,执行时,系统等待键盘输入,待程序员按下任何一键,系统先检查是否序员按下任何一键,系统先检查是否Ctrl-Break键,键,如果是则退出,否则将该键字符的如果是则退出,否则将该键字符的ASCII码置入码置入AL寄寄存器中,并在存器中,并在屏幕上显示该字符屏幕上显示该字符。0AH号系统功能调用,将键盘输入的字符串写入到内号系统功能调用,将键盘输入的字符串写入到内存缓冲区中,缓冲区第一字节能存放的字节数,第二字存缓冲区中,缓冲区第一字节能存放的字节数,第二字节留给系统填写实际键入的字符个数,第三个字节开始节留给系统填写实际键入的字符个数,第三个字节开始存放键入的字符串,最后键入回车(存放键入的字符串,最后键入回车()键表示字符串)键表示字符串结束。实际键入的字符数不足填满缓冲区时,则其余字结束。实际键入的字符数不足填满缓冲区时,则其余字节填节填“0”;实际键入的字符数超过缓冲区的容量,则超;实际键入的字符数超过缓冲区的容量,则超出的字符将被丢失,而且响铃,表示向程序员发出警告。出的字符将被丢失,而且响铃,表示向程序员发出警告。2)键盘输入字符串)键盘输入字符串 BUFDB20DB?DB20,DUP(?)MOV DX,OFFSET BUF MOV AH,0AH INT21H;定义缓冲区;定义缓冲区;0AH号系统号系统 功能调用功能调用 2号系统功能调用,使用格式如下所示:号系统功能调用,使用格式如下所示:MOV DL,AMOV AH,2INT21H 执行执行2号系统功能调用时,将置入号系统功能调用时,将置入DL寄存器中的字寄存器中的字符从屏幕上显示输出(或打印机打印输出)。符从屏幕上显示输出(或打印机打印输出)。3)输出单字符)输出单字符4 4)输出字符串)输出字符串 9号系统功能调用,其功能是将指定的内存缓冲区中号系统功能调用,其功能是将指定的内存缓冲区中的字符串从屏幕上显示输出来(或打印输出)。缓冲区的字符串从屏幕上显示输出来(或打印输出)。缓冲区中的字符串必须以中的字符串必须以“$”字符作为结束标志。字符作为结束标志。BUF DB good bye$MOV DX,OFFSET BUFMOV AH,9INT21H 执行执行9号系统功能调用时,将内存缓冲区号系统功能调用时,将内存缓冲区BUF中存放中存放的字符串(以的字符串(以“$”字符为结束)送屏幕显示输出(或字符为结束)送屏幕显示输出(或送打印机打印输出)。送打印机打印输出)。3.BIOS中断调用中断调用 BIOS是固化在是固化在ROM中的一组中的一组I/O驱动程序,它为驱动程序,它为系统各主要部件提供设备级控制,还为汇编语言程序系统各主要部件提供设备级控制,还为汇编语言程序设计者提供了字符设计者提供了字符I/O操作。与操作。与DOS功能调用相比,功能调用相比,BIOS有如下特点:有如下特点:(1)调用)调用BIOS程序虽然比调用程序虽然比调用DOS程序要复杂一程序要复杂一些,但运行速度快,功能更强;些,但运行速度快,功能更强;(2)DOS的中断功能只是在的中断功能只是在DOS的环境下适用,的环境下适用,而而BIOS功能调用不受任何操作系统的约束;功能调用不受任何操作系统的约束;(3)某些功能只有)某些功能只有BIOS具有。具有。5.4 汇编器的功能及汇编过程汇编器的功能及汇编过程 汇编汇编器的主要功能是将由器的主要功能是将由汇编语汇编语言(助言(助记记符)符)编编写的写的源程序翻源程序翻译译成用机器成用机器语语言(二言(二进进制代制代码码)编编写的目写的目标标程程序。序。DATASEGMENT 存放数据项的数据段存放数据项的数据段DATAENDSEXTRASEGMENT 存放数据项的附加段存放数据项的附加段EXTRAENDSSTACK1 SEGMENTPARASTACK 作堆栈用的堆栈段作堆栈用的堆栈段STACK1 ENDSCOSEG SEGMENTASSUMECS:COSEG,DS:DATAASSUMESS:STACK1,ES:EXTRA START PROC FAR MOVAX,DATAMOV DS,AX 存放指令序列存放指令序列COSEGENDSEND START 计算机执行程序计算机执行程序“从头到尾从头到尾”,逐条顺序执行,直,逐条顺序执行,直到程序结束。到程序结束。1.简单程序(顺序程序)简单程序(顺序程序)【例例1】用数据运算指令,对两个用数据运算指令,对两个16位数做加法运算。位数做加法运算。这两个数从地址这两个数从地址10050H开始连续存放,低位在小地址开始连续存放,低位在小地址一端,结果存放在这两个数之后。一端,结果存放在这两个数之后。DATA SEGMENT ORG 50H Data1 DW?Data2 DW?Data3 DW?DATA ENDS STACK SEGMENT STA1 DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FAR PUSH DS XOR AX,AX PUSH AX;返回返回DOSMOV AX,DATAMOV DS,AX ;DS1000HMOV SI,50H ;被加数指针被加数指针SI50HMOV DI,52H ;加数指针加数指针DI52HMOV BX,54H ;和的指针和的指针BX54HCLC ;清清CFXOR AX,AX ;清清AXMOV AX,SI ;取一个字到取一个字到AXADC AX,DI ;AXAXDI+CFMOV BX,AX ;存一个字到存一个字到BXCOSEG ENDSENDSTART 【例例2】将内存将内存10050H单元的内容拆成两段,每段单元的内容拆成两段,每段4位,并将它们分别存入内存位,并将它们分别存入内存10051H和和10052H单元。单元。即即10050H单元中的低单元中的低4位放入位放入10051H的低的低4位,位,10050H单元中的高单元中的高4位放入位放入10052H的低的低4位,而位,而10051H和和10052H的高的高4位均为零。位均为零。DATA SEGMENT ORG 50H Data1 DB?Data2 DB?Data3 DB?DATA ENDS STACK SEGMENT STA1 DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FAR PUSH DS XOR AX,AX PUSH AX;返回返回DOSMOV AX,DATAMOV DS,AX ;DS1000H MOV SI,50H ;需拆字节的指针需拆字节的指针SI=50H MOV AL,SI ;取一个字节到取一个字节到AL中中 AND AL,0FH ;把把AL的前的前4位清位清0 MOV SI+1,AL ;把得到的后把得到的后4位放到位放到 10051H单元单元 MOV AL,SI ;再取出需拆字节放到再取出需拆字节放到AL中中 MOV CL,4 SHR AL,CL ;逻辑右移四次,前逻辑右移四次,前4位补位补0 MOV SI+2,AL ;放入放入10052H单元单元 COSEG ENDSENDSTART 分支程序是利用条件转移指令,使程序执行到某一分支程序是利用条件转移指令,使程序执行到某一指令后,根据条件是否满足,来改变程序的执行次序。指令后,根据条件是否满足,来改变程序的执行次序。程序使计算机有了判断的功能。经常先用比较指令或程序使计算机有了判断的功能。经常先用比较指令或数据操作及位检测指令改变标志寄存器各个标志位。数据操作及位检测指令改变标志寄存器各个标志位。然后用条件转移指令进行分支。然后用条件转移指令进行分支。【例例1】求求AX累加器和累加器和BX寄存器中两个无符号数之寄存器中两个无符号数之差的绝对值,结果放在内存差的绝对值,结果放在内存2800H单元中。单元中。2.分支程序分支程序 .MODEL SMALL .STACK 64 .DATA ORG 2800H AbsData DW?.CODEABSPRGPROC FAR MOV AX,DATA MOV DS,AX CLC ;清除清除CF MOV CX,AX SUB AX,BX ;AXAXBX,影响影响CF JC Low ;CF1转转AA去执行(即去执行(即AXBX时转移)时转移)MOV DI,2800H ;结果指针结果指针DI2800H MOV DI,AX ;结果送到结果送到2800H和和2801H单元单元 JMP Out ;暂停暂停Low:SUB BX,CX ;BXBXCX Out:MOV DI,AbsData MOV DI,BXABSPRG ENDP END 【例例2】编制程序,从外设编制程序,从外设71号端口中取一个数号端口中取一个数M,判断其值是否在判断其值是否在10和和20之间,即之间,即10M20。如果。如果M20H,则送,则送0FFH给外设给外设73H端口;如果端口;如果M10,则,则送送00H给外设给外设73H;如果;如果10M20,则送,则送88H给外设给外设73H。.MODEL SMALL.STACK 64.DATAPrtAdd1 DB 71HPrtAdd2 DB 73H.CODEPRTPRG PROC FARMOV AX,DATA MOV DS,AX IN AL,PrtAdd1;(AL)71H端口的字节端口的字节 CLC ;CF=0 CMP AL,10;将将(AL)与与10比较比较 JCValLow10 ;小于小于10转转ValLow10 CMP AL,20;将将(AL)与与20相比较相比较 JC Val10To20 ;10(AL)0,则继续循环,则继续循环 JA T10toAsc BINToASCPRG ENDP END4 子程序设计子程序设计 子程序是一个独立的程序段,确切地说,它是被其他子程序是一个独立的程序段,确切地说,它是被其他程序(如主程序)调用的程序。一般是有公用性、重程序(如主程序)调用的程序。一般是有公用性、重复性或有相对独立性的程序应设计成子程序,这种结复性或有相对独立性的程序应设计成子程序,这种结构给程序设计与调试带来许多方便。构给程序设计与调试带来许多方便。子程序调用实际是程序的转移,但它与转移指令有子程序调用实际是程序的转移,但它与转移指令有所不同,转子程序所不同,转子程序CALL执行时要保护返回地址,而执行时要保护返回地址,而转移指令不考虑返回问题。每个子程序都有转移指令不考虑返回问题。每个子程序都有RET指令指令负责把推入堆栈的返回地址弹出送负责把推入堆栈的返回地址弹出送IP或或CS:IP(段间(段间返回),实现子程序返回。返回),实现子程序返回。子程序设计与应用应注意的问题子程序设计与应用应注意的问题:(1)现场保护与恢复:调用子程序时,可能要使用)现场保护与恢复:调用子程序时,可能要使用被占用了的寄存器,子程序执行完毕返回时,要保证调被占用了的寄存器,子程序执行完毕返回时,要保证调用程序按原有状态继续正常执行,需要对这些寄存器的用程序按原有状态继续正常执行,需要对这些寄存器的内容加以保护,称为现场保护。子程序执行完毕后再恢内容加以保护,称为现场保护。子程序执行完毕后再恢复被保护的寄存器的内容,称为现场恢复。复被保护的寄存器的内容,称为现场恢复。(2)参数传递:调用程序与子程序之间需要进行相)参数传递:调用程序与子程序之间需要进行相关信息或数据的传递。将子程序需要从调用程序获取关信息或数据的传递。将子程序需要从调用程序获取的参数称为的参数称为入口参数入口参数,将子程序需要返回给调用程序,将子程序需要返回给调用程序的参数称为的参数称为出口参数出口参数。寄存器传递:选定某些通用寄存器,但因寄存器数寄存器传递:选定某些通用寄存器,但因寄存器数量有限,适合于参数较少的情况。量有限,适合于参数较少的情况。存储单元(参数表)传递:适合于参数较多的情存储单元(参数表)传递:适合于参数较多的情况,但要求事先在内存内建立一个参数表。况,但要求事先在内存内建立一个参数表。堆栈传递:堆栈具有后进先出的特性,在多重调堆栈传递:堆栈具有后进先出的特性,在多重调用中各重参数的层次很分明,适合于参数多且子程序用中各重参数的层次很分明,适合于参数多且子程序有嵌套、递归调用的情况。有嵌套、递归调用的情况。【例例1】找出一个数据找出一个数据块中的最大数。其中,数块中的最大数。其中,数据块的长度据块的长度1,并且放在,并且放在内存内存2001H单元中,而数单元中,而数据块本身是从据块本身是从2002H单元单元开始存放的,最后,把找开始存放的,最后,把找出的最大值放到出的最大值放到2000H单单元中,假设这段数据块中元中,假设这段数据块中的数都是无符号的的数都是无符号的8位数,位数,请设计成一段可调用的子请设计成一段可调用的子程序。程序。.MODEL SMALL .STACK 64 .CODEMAXPRGPROC FAR MOV AX,DATA MOV DS,AXMAX:PUSHF PUSHAX PUSHCX PUSHSIMOV SI,2001H;指针指向放数据块长度的单元指针指向放数据块长度的单元MOV CL,SI ;取出来作为循环次数取出来作为循环次数INC SI ;指针指向第一个数指针指向第一个数MOV AL,00H ;设置最大值设置最大值00MOV CH,00H ;初始化初始化LP:CLC ;清除进位位;清除进位位 CMP AL,SI ;取出数与最大值比较;取出数与最大值比较 JNC AA ;AL中数大,跳过去中数大,跳过去 MOV AL,SI ;把大数放到;把大数放到AL中保存中保存AA:INC SI ;指针下移;指针下移 LOOP LP ;次数减;次数减1,判循环结束否,判循环结束否 MOV 2000H,AL;把最大值放到指定单元保存;把最大值放到指定单元保存 POP SI POP CX POP AX POPF RETMAXPRG ENDPEND 例例2 内存中有一数组,其首地址为内存中有一数组,其首地址为ARRAY,求该数组,求该数组所有元素之和(不超过所有元素之和(不超过16位数)并存于内存位数)并存于内存SUM单元中,单元中,请编写子程序实现。请编写子程序实现。.MODEL SMALL .STACK 64 .CODEArraySumPRGPROC FAR MOV AX,DATA MOV DS,AX CLC;CF=0 CMP CX,0;判断是否结束判断是否结束 JZ EXITMOV AX,0;(AX)=0 A_Sum:ADD AL,SI;加数组中的一个元素加数组中的一个元素ADC AH,0INCSILOOPA_Sum POPF EXIT:RETArraySumPRG ENDP END .MODEL SMALL .STACK 64 .CODEArraySumPRGPROC FAR MOV AX,DATA MOV DS,AX PUSHF PUSH AX PUSH CX PUSH BP PUSH SI PUSH DI MOV SI,BX ;数组首地址数组首地址(BX)+1:(BX)(SI)MOV BP,BX+2 ;数组长度单元地址数组长度单元地址(BX+3):(BX+2)(BP)MOV CX,D