1、 本章主要教学内容本章主要教学内容.汇编语言和汇编程序的基本概念汇编语言和汇编程序的基本概念 .伪指令语句的格式、功能及应用伪指令语句的格式、功能及应用.汇编语言源程序书写规则、语句格式及程序分段汇编语言源程序书写规则、语句格式及程序分段.汇编语言源程序的建立、汇编、连接、调试及运行汇编语言源程序的建立、汇编、连接、调试及运行 .程序设计方法程序设计方法第第4章章 汇编语言程序设计汇编语言程序设计 第第4章章 汇编语言程序设计汇编语言程序设计 本章教学目的及要求本章教学目的及要求 l l 理解汇编语言和汇编程序的概念、特点及其应用。理解汇编语言和汇编程序的概念、特点及其应用。l l 掌握汇编语
2、言源程序的书写规则、语句的基本格掌握汇编语言源程序的书写规则、语句的基本格式、程序的分段结构。式、程序的分段结构。l l 熟悉汇编语言的基本表达、伪指令语句及其应用。熟悉汇编语言的基本表达、伪指令语句及其应用。l l 熟悉汇编语言程序的上机运行、调试过程,掌握熟悉汇编语言程序的上机运行、调试过程,掌握基本操作技能。基本操作技能。l l 能够独立编写和分析汇编程序能够独立编写和分析汇编程序1 汇编语言和汇编程序的基本概念汇编语言和汇编程序的基本概念 第第4章章 汇编语言程序设计汇编语言程序设计2 汇编语言源程序书写格式汇编语言源程序书写格式 3 8086汇编语言中的标识符汇编语言中的标识符、表达
3、式和运算符表达式和运算符 5 DOSDOS功能调用功能调用 4 伪指令语句伪指令语句 6 汇编语言程序设计基础汇编语言程序设计基础 4.1 汇编语言和汇编程序的基本概念汇编语言和汇编程序的基本概念 1、汇编语言 汇编语言是一种介于汇编语言是一种介于机器语言机器语言和和高级语言高级语言之间之间的计算机编程语言,是一种面向机器的语言。它和的计算机编程语言,是一种面向机器的语言。它和机器码有一一对应的关系,所以允许程序员用汇编机器码有一一对应的关系,所以允许程序员用汇编语言直接对寄存器、存储器、语言直接对寄存器、存储器、I/O端口以及端口以及CPU内部内部的许多硬件进行操作,因此用汇编语言可以编写出
4、的许多硬件进行操作,因此用汇编语言可以编写出高质量的程序,用汇编语言编写的程序占用内存少,高质量的程序,用汇编语言编写的程序占用内存少,执行速度快。执行速度快。v机器码指令构成的指令系统叫机器语言(二进机器码指令构成的指令系统叫机器语言(二进制代码)。机器语言是能被计算机识别的惟一制代码)。机器语言是能被计算机识别的惟一语言。语言。例如:例如:MOV AX,im (B8)MOV DX,im (BA)MOV CX,im (B9)MOV BX,im (BB)PUSH AX (50)PUSH DX (52)PUSH CX (51)PUSH BX (53)POP AX (58)POP DX (5A)P
5、OP CX (59)POP BX (5B)汇编语言程序必须先翻译成机器语言汇编语言程序必须先翻译成机器语言程序才能执行。程序才能执行。由汇编语言程序翻译成机器语言程序的过程,由汇编语言程序翻译成机器语言程序的过程,称为称为汇编。汇编。完成汇编过程的系统程序称为完成汇编过程的系统程序称为汇编语汇编语言程序言程序或称为或称为源程序。源程序。汇编汇编语言程序语言程序翻译翻译机器机器语言程序语言程序执行执行2、汇编程序汇编程序 用汇编语言编写的源程序在输入计算机后,需要将其翻用汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称译成目标程序,计算机才能执行
6、相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序。为汇编,完成汇编任务的程序称为汇编程序。有 基 本 汇 编有 基 本 汇 编 A S MA S M(A s s e m b l e rA s s e m b l e r)和 宏 汇 编)和 宏 汇 编 M A S MM A S M(MacroAssemblerMacroAssembler)两种。)两种。汇编程序以汇编语言源程序文件作为输入,并由它产生汇编程序以汇编语言源程序文件作为输入,并由它产生两种输出文件:目标程序文件和源程序列表文件。两种输出文件:目标程序文件和源程序列表文件。目标程序文件经连接定位后由计算机执行;目标程序文
7、件经连接定位后由计算机执行;源程序列表文件将列出源程序、目标程序的机器语源程序列表文件将列出源程序、目标程序的机器语言代码及符号表。言代码及符号表。汇编程序汇编程序vASM 小汇编小汇编vMASM 宏汇编宏汇编推荐两个汇编网站推荐两个汇编网站http:/http:/3、汇编语言源程序的结构汇编语言源程序的结构 一般来说,一个完整的汇编源程序应由三一般来说,一个完整的汇编源程序应由三个程序段组成,即代码段、数据段和堆栈段,个程序段组成,即代码段、数据段和堆栈段,每个段都以每个段都以SEGMENT开始,以开始,以ENDS结束,结束,代码段包含程序要执行的指令;堆栈段用来在代码段包含程序要执行的指令
8、;堆栈段用来在内存中建立一个堆栈区;数据段用来在内存中内存中建立一个堆栈区;数据段用来在内存中建立一个适当容量的工作区,以存放程序中所建立一个适当容量的工作区,以存放程序中所需的数据。需的数据。注意:一个源程序中,代码段是必须的,而数据注意:一个源程序中,代码段是必须的,而数据段和堆栈段可以没有或有其中一个。段定义时段和堆栈段可以没有或有其中一个。段定义时一般最后定义代码段。一般最后定义代码段。STACK SEGMENTPARA STACK STACK DB500 DUP(0)STACK ENDSDATA SEGMENTDATA ENDSCODE SEGMENTMAIN PROCFAR ASS
9、UMECS:CODE,DS:DATA,ES:DATA,SS:STACK PUSHDS MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX MOVES,AX RETMAIN ENDPCODE ENDS ENDMAIN定义堆栈段定义堆栈段定义数据段定义数据段定义代码段定义代码段SEGMENTENDSSEGMENTENDSSEGMENTENDSMAIN PROCFARMAIN ENDPENDv例例4-1 编写一个两字相加的程序编写一个两字相加的程序DSEG SEGMENTDATA1 DW 0F865HDATA2 DW 360CHDSEG ENDSESEG SEGMENTSUM DW
10、 2 DUP(?)ESEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEG,ES:ESEGSTART:MOV AX,DSEGMOV DS,AXMOV AX,ESEGMOV ES,AXLEA SI,SUMMOV AX,DATA1 ADD AX,DATA2MOV ES:SI,AXHLTCSEG ENDSEND START代码段:代码段:CODE数据段:数据段:DATA堆栈段:堆栈段:STACK4.1.2 4.1.2 汇编语言源程序的语句类型和语句格式汇编语言源程序的语句类型和语句格式 1语句类型语句类型 8086宏汇编宏汇编MASM使用的语句可以分成使用的语句可以分成
11、3种类型:种类型:指令语句:这类指令能够产生目标代码,是指令语句:这类指令能够产生目标代码,是CPU可以执行可以执行的能够完成特定功能的语句,主要由机器指令组成。在汇编时的能够完成特定功能的语句,主要由机器指令组成。在汇编时一条指令语句被翻译成对应的机器码,对应着特定的操作。一条指令语句被翻译成对应的机器码,对应着特定的操作。伪指令语句:伪指令语句是为汇编程序和连接程序提供一伪指令语句:伪指令语句是为汇编程序和连接程序提供一些必要控制的管理性语句,它不产生目标代码,仅仅在汇编过些必要控制的管理性语句,它不产生目标代码,仅仅在汇编过程中告诉汇编程序应如何汇编,并完成相应的伪操作。程中告诉汇编程序
12、应如何汇编,并完成相应的伪操作。宏指令语句:宏指令语句是由编程者按照一定的规则来定宏指令语句:宏指令语句是由编程者按照一定的规则来定义的一种较义的一种较“宏大宏大”的指令,可包括多条指令或伪指令的指令,可包括多条指令或伪指令。2 2语句格式语句格式 一般情况下,汇编语言的语句可以由一般情况下,汇编语言的语句可以由以下几以下几部分组成:部分组成:名字名字 操作码操作码 操作数操作数 ;注释;注释 名字是一个符号,它表示本条语句的符号地址。一般名字是一个符号,它表示本条语句的符号地址。一般来说,名字可以是标号和变量,统称为标识符。来说,名字可以是标号和变量,统称为标识符。注意:标号和变量都具备注意
13、:标号和变量都具备3 3种属性种属性段属性、偏移属性及段属性、偏移属性及类型属性。类型属性。操作码可以是机器指令、伪指令和宏指令的助记符。操作码可以是机器指令、伪指令和宏指令的助记符。操作数字段是操作码的操作对象。操作码在完成相应操作数字段是操作码的操作对象。操作码在完成相应的操作时要求有一系列的操作数。当有两个或两个以上的的操作时要求有一系列的操作数。当有两个或两个以上的操作数时,各操作数之间用逗号隔开。操作数时,各操作数之间用逗号隔开。注释字段是以注释字段是以“;”开头的说明部分,可以用英文或开头的说明部分,可以用英文或者中文书写。注释字段是语句的非执行部分者中文书写。注释字段是语句的非执
14、行部分 。4.1.3 80864.1.3 8086汇编语言中的标识符、表达式和运算符汇编语言中的标识符、表达式和运算符1、标识符(标号,变量,名字)标识符(标号,变量,名字)汇编语言每条语句的第一个字段是它的名字字段,名字汇编语言每条语句的第一个字段是它的名字字段,名字可以是标号或变量,这两者又称为标识符。可以是标号或变量,这两者又称为标识符。重点是要掌握其组成规则和它的重点是要掌握其组成规则和它的3个属性。个属性。2、表达式和运算符表达式和运算符 在表达式中,运算符充当着重要的角色。在表达式中,运算符充当着重要的角色。8086宏汇编有算术运算符、逻辑运算符、关系运算符、分宏汇编有算术运算符、
15、逻辑运算符、关系运算符、分析运算符和综合运算符共析运算符和综合运算符共5种。种。下面分别讨论下面分别讨论5种运算符的作用:种运算符的作用:DSEG SEGMENTDATA1 DW 0F865HDATA2 DW 360CHDSEG ENDSESEG SEGMENTSUM DW 2 DUP(?)(?)ESEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEG,ES:ESEGSTART:MOV AX,DSEGMOV DS,AXMOV AX,ESEGMOV ES,AXLEA SI,SUMMOV AX,DATA1ADD AX,DATA2 MOV ES:SI,AXHLTCSEG
16、 ENDSEND START(1)算术运算符用于完成算术运算,有(加法)、(减法)、(乘法)、(除法)、MOD(求余)、SHL(左移)、SHR(右移)共7种运算。(2)逻辑运算符的作用是对其操作数进行按位操作。逻辑运算符有AND(与)、OR(或)、XOR(异或)和NOT(非)。(3)关系运算符的运算对象是两个性质相同的项目。其结果为:关系成立或不成立。有EQ(相等)、NE(不相等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)共6种。(4)分析运算符是对存储器地址进行运算的。有5个:SEG(求段基值)、OFFSET(求偏移量)、TYPE(求变量类型)、LENGTH(求变量
17、长度)和SIZE(求字节数)。(5)综合运算符可以用来建立和临时改变变量或标号的类型以及存储器操作数的存储单元类型,而忽略当前的属性,所以又称为属性修改运算符。有6个综合运算符:PTR、段属性前缀、SHORT、THIS、HIGH 和LOW。4-2 伪指令语句伪指令语句 在汇编语言中,伪指令是给汇编程序的命令,在汇编过程中由汇编程序进行处理。例如定义数据、分配存储区、定义段及定义过程等都采用伪指令表示。4.2.1 数据定义伪指令数据定义伪指令 数据定义伪指令用来定义一个变量的类型,并将所需要的数据放入指定的存储单元中,也可以只给变量分配存储单元,而不赋予特定的值。1.1.数据定义伪指令的一般格式
18、为:数据定义伪指令的一般格式为:变量名变量名 伪指令伪指令 操作数操作数 ,操作数,操作数 ;注释;注释 2.常用的常用的数据定义伪指令数据定义伪指令 定义字节变量伪指令定义字节变量伪指令DBDB 定义字变量伪指令定义字变量伪指令DWDW 定义双字变量伪指令定义双字变量伪指令DDDD 定义四字变量伪指令定义四字变量伪指令DQDQ 定义十字节变量伪指令定义十字节变量伪指令DTDT例:例:DATA1 DB 5,6,7 DATA2 DW 1,2,1A34H DATA3 DD 5,6,1A34HDATA1050607DATA201000200341ADATA30500000006v定义重复变量伪指令定
19、义重复变量伪指令DUP格式:格式:例例 DATA1DB10 DUP (0);定义;定义DATA1为为10个个“0”组成的字节变量组成的字节变量DATA2DW2 DUP (?)(?);定义;定义DATA2为为2个不确定数值的字变量个不确定数值的字变量DATA3DB4 DUP (1,2 DUP(50H);定义;定义DATA3为(为(1,50H,50H)重复)重复4次共次共12个字个字节的字节变量节的字节变量 DBDWDD变量名变量名n DUP (表达式)(表达式)4.2.2 符号定义伪指令符号定义伪指令 符号定义伪指令的用途是给一个符号重新命符号定义伪指令的用途是给一个符号重新命名,或定义新的类型
20、属性等。这些符号可以包括汇名,或定义新的类型属性等。这些符号可以包括汇编语言的变量名、标号名、过程名、寄存器名以及编语言的变量名、标号名、过程名、寄存器名以及指令助记符等。指令助记符等。常用的符号定义伪指令有常用的符号定义伪指令有EQU、LABLE。4.2.3 段定义伪指令段定义伪指令一个完整的源程序由一个完整的源程序由3个段组成:堆栈段、数据段、个段组成:堆栈段、数据段、代码段。代码段。SEGMENT:定义一个段开始。一个段必须有一个:定义一个段开始。一个段必须有一个名称来标识。名称来标识。ENDS:说明一个段的结束,和:说明一个段的结束,和SEGMENT成对使成对使用。用。格式:格式:段名
21、段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别类别 段名段名 ENDS4.2.4 ASSUME 段分配伪指令段分配伪指令 格式:格式:ASSUME 段寄存器:段名段寄存器:段名 ,段寄存器:段,段寄存器:段名,名,用于说明源程序中定义的段或组由哪个寄存器去寻用于说明源程序中定义的段或组由哪个寄存器去寻址,即建立寄存器与段间的对应关系。址,即建立寄存器与段间的对应关系。例:例:CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKMOV AX,DATAMOV DS,AXCODE ENDS4.2.5 定义过程的伪指令定义过程的伪指令PROC和和EN
22、DP过程:具有一定功能的程序段(相当于一个子程序)过程:具有一定功能的程序段(相当于一个子程序)格式:格式:过程名过程名 PROC 类型类型 RET 过程名过程名 ENDP说明:说明:过程体内应至少有一条过程体内应至少有一条RET指令,以便返指令,以便返回被调用处。一个过程可以调用另一个过程,回被调用处。一个过程可以调用另一个过程,也可以调用过程本身。也可以调用过程本身。举例:举例:FARNEAR一个延时一个延时100ms 的子程序,过程定义为:的子程序,过程定义为:SOFTDLYPROCMOV BL,10DELAY:MOVCX,2801WAIT:LOOPWAITDECBLJNZDELAYRE
23、TSOFTOLYENDPPUSH BXPUSH CXPOP CX POP BX小循环小循环大循环大循环宏定义格式:宏定义格式:宏指令名宏指令名 MACRO 形式参量形式参量1,形参,形参2,ENDMv宏指令名是一个宏调用的依据(必须要写,与标号规宏指令名是一个宏调用的依据(必须要写,与标号规定一致)定一致)v 形式参量表形式参量表 可有可无,可以是一个,也可以有多个,可有可无,可以是一个,也可以有多个,在有多个时,各参量之间应用逗号分开。在有多个时,各参量之间应用逗号分开。v宏定义符宏定义符MACRO和宏定义结束符和宏定义结束符ENDM成对出现。成对出现。v宏体:宏体:MACROENDM之间。
24、之间。宏体宏体4.2.6 宏命令伪指令宏命令伪指令宏调用格式:宏调用格式:宏指令名宏指令名 实参实参1,实参,实参2,宏调用中的实参应与宏定义中的形参一一对应,但宏调用中的实参应与宏定义中的形参一一对应,但在在IBM宏汇编中,数量上不一定一致,若实参多于形宏汇编中,数量上不一定一致,若实参多于形参,则多余部分被忽略,若实参少于形参,则多余的参,则多余部分被忽略,若实参少于形参,则多余的形参按空对待。形参按空对待。例:例:若对若对AL中的数据进行算术左移中的数据进行算术左移4位的操作,在某程位的操作,在某程序中被多次使用,可对该指令组进行宏定义。序中被多次使用,可对该指令组进行宏定义。SHIFT
25、MACROMOVCL,4SALAL,CLENDM宏体宏体MOV AL,02HSHIFT例:用宏定义一个梯形面积公式。设上底为例:用宏定义一个梯形面积公式。设上底为x,下底为下底为y,高为高为hxyhMOVAL,XADDAL,YMOVBL,HMULBLSHRAX,1MOVAREA,AXTAREA MACRO X,Y,h,AREA ENDM 现已知一梯形上底为现已知一梯形上底为8,下底为,下底为10,高为,高为5。求此梯形面积。求此梯形面积。MOVAL,08HADDAL,0AHMOV BL,05HMULBLSHRAX,1MOV BX,AXTAREA 08H,0AH,05H,BX,34H 4.2.7
26、 模块定义与连接伪指令模块定义与连接伪指令 在编写规模较大的汇编语言源程序时,可以将整在编写规模较大的汇编语言源程序时,可以将整个程序划分为几个独立的源程序,称之为模块。个程序划分为几个独立的源程序,称之为模块。将各模块分别进行汇编,生成各自的目标程序,将各模块分别进行汇编,生成各自的目标程序,最后将它们连接成为一个完整的可执行程序。最后将它们连接成为一个完整的可执行程序。各模块之间可以相互进行符号访问。各模块之间可以相互进行符号访问。为了进行模块之间连接和实现相互的符号访问,为了进行模块之间连接和实现相互的符号访问,以便进行变量传送,通常使用以下几个伪指令:以便进行变量传送,通常使用以下几个
27、伪指令:NAME、END、PUBLIC。不同的寻址方式的灵活应用不同的寻址方式的灵活应用vidata 用一个常量来表示地址,可用于直接用一个常量来表示地址,可用于直接定位一个内存单元。定位一个内存单元。例:例:1000hvbx 用一个变量来表示内存地址,可用于间用一个变量来表示内存地址,可用于间接定位一个内存单元。接定位一个内存单元。vbx+idata 用一个变量和常量表示地址,可用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个在一个起始地址的基础上用变量间接定位一个内存单元。内存单元。vbx+si 用两个变量表示地址。用两个变量表示地址。vbx+si+idata 用两个变
28、量和一个常量表示地用两个变量和一个常量表示地址。址。编程,将编程,将data段中每个单词的头一个字母改为大写字母。段中每个单词的头一个字母改为大写字母。assumecs:code,ds:datadatasegmentdb1.file db2.edit db3.search db4.view db5.options db6.help dataendscodesegmentstart:0123456789ABCDEF00001.file00102.edit00203.search00304.view00405.options00506.help编程,将编程,将data段中每个单词改为大写字母。段中
29、每个单词改为大写字母。assumecs:code,ds:datadatasegmentdbibm dbdec dbdos dbvax dataendscodesegmentstart:0123456789abcdef0000ibm0010dec0020dos0030vax0040start:mov ax,datamov ds,axmov bx,0mov cx,4s1:mov dx,cxmov si,0mov cx,3s2:mov al,bx+siand al,0dfhmov bx+si,alinc siloop s2add bx,16mov cx,dxloop s1编程,将编程,将data段中
30、每个单词的前四个字母改为大写字母。段中每个单词的前四个字母改为大写字母。assumecs:code,ds:data,ss:stackstacksegmentdw0,0,0,0,0,0,0,0stackendsdatasegmentdb1.display db2.brows db3.replace db4.modify dataendscodesegmentstart:0123456789abcdef00001.display00102.brows00203.replace00304.modify 在存储器系统中,内存器高端在存储器系统中,内存器高端8K的的ROM中存放有中存放有基本输入输出系统
31、(基本输入输出系统(Basic Input/Output System,BIOS)例行程序。例行程序。BIOS给给PC系列的不同微处理器提供了兼容系列的不同微处理器提供了兼容的系统加电自检、引导装入、主要的系统加电自检、引导装入、主要I/O设备的处理程序设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来极大方便。程序员功能调用,给程序员编程带来极大方便。程序员不必了解硬件的具体细节,可直接使用指令设置参数,不必了解硬件的具体细节,可直接使用指令设置参数,并中断调用并中断调用BIOS例行程序,所以利用例
32、行程序,所以利用BIOS功能调用编功能调用编写的程序简洁,可读性好,而且易于移植。写的程序简洁,可读性好,而且易于移植。4.3 DOS 4.3 DOS系统功能调用系统功能调用 磁盘操作系统(磁盘操作系统(Disk Operating System)是)是PC机上最重要的操作系统,它是由软盘或硬盘提供的。机上最重要的操作系统,它是由软盘或硬盘提供的。它的两个它的两个DOS模块模块IBMBIO.COM和和IBMDOS.COM使使BIOS使用起来更方便。因为使用起来更方便。因为DOS模块提供了更多更必模块提供了更多更必要的测试,使要的测试,使DOS操作比使用相应功能的操作比使用相应功能的BIOS操作
33、更操作更简易,而且简易,而且DOS对硬件的依赖性更少些。对硬件的依赖性更少些。DOS模块和模块和ROM BIOS的关系如下图所示。的关系如下图所示。功能调用号AH置入口参数执行“INT 21H”分析出口参数系统功能调用的方法DOS功能调用与功能调用与BIOS功能都通过软件中断调用。在功能都通过软件中断调用。在中断调用前需要把功能号装入中断调用前需要把功能号装入AH寄存器,把子功能寄存器,把子功能号装入号装入AL寄存器,除此之外,还需要在寄存器,除此之外,还需要在CPU的寄存的寄存器中提供专门的调用参数。一般来说,调用器中提供专门的调用参数。一般来说,调用DOS或或BIOS功能时,有以下几个步骤
34、:功能时,有以下几个步骤:1、键盘单字符输入、键盘单字符输入(1号调用号调用)格式:格式:MOV AH,1 INT 21H功能功能:等待从键盘输入一个字符并将输入字符的ASCII码码送入寄存器AL中,碰到CTRL+Break则退出。2、显示输出、显示输出(2号调用号调用)格式:格式:MOV AH,2 MOV DL,待显字符的,待显字符的ASCII码码 INT 21H功能功能:将DL中的字符送显示器显示,若为CTRL+Break的ASCII码码则退出。3、键盘输入字符串、键盘输入字符串(10号调用号调用)格式:格式:LEA DX,缓冲区首偏移地址,缓冲区首偏移地址 MOV AH,10 INT 2
35、1H功能功能:从键盘上往指定缓冲区中输入字符串并送显示器显示。如:如:BUF DB 81 DB?DB 80 DUP(0)注注:缓冲区应按规定的格式定义。:缓冲区应按规定的格式定义。BUF第一字节规定了缓冲区的大小,从第一字节规定了缓冲区的大小,从键盘输入的字符串从第三个字节存放,第二键盘输入的字符串从第三个字节存放,第二个字节存放实际输入的字符个数。个字节存放实际输入的字符个数。例例4-9从键盘上输入字符串从键盘上输入字符串HELLO,并在串尾加结束标志,并在串尾加结束标志$DATASEGMENTSTRING DB 10,0,10 DUP(?)(?);定义缓冲区;定义缓冲区DATAENDSCO
36、DESEGMENTASSUME CS:CODE,DS:DATAMOV AX,DATAMOV DS,AX;数据段初始化;数据段初始化LEA DX,string;取缓冲区偏移地址;取缓冲区偏移地址MOV AH,0AH;功能号输入;功能号输入INT 21H;DOS功能调用功能调用MOV CL,STRING+1;取字符个数;取字符个数XOR CH,CHADD DX,CX;得到字符串尾地址;得到字符串尾地址MOV BX,DXMOV BYTE PTR BX+2,$MOV AH,4CHINT 21H;返回;返回DOSCODEENDSEND STARTv屏幕显示程序举例屏幕显示程序举例屏幕显示程序举例v内存地
37、址空间内存地址空间B8000HBFFFFH共共32KB为为25 行行 80列的彩色字符模式显示缓冲区。列的彩色字符模式显示缓冲区。v显示器每屏可显示显示器每屏可显示2580=2000个字,其中每个字,其中每个字占个字占2个字节,低字节为符号,高字节为字个字节,低字节为符号,高字节为字符属性。显示缓冲区可分符属性。显示缓冲区可分8页显示,默认情况页显示,默认情况下从第下从第0页开始显示。页开始显示。v屏幕显示位置与内存地址的关系屏幕显示位置与内存地址的关系:0:1:2:3:50:51:9e:9fB800:0012348081158159:A01:1402:1E03:28045:78012:7D0
38、:DC023:E6024:F0025例:第例:第4行,第行,第2列列PA=B8000+A04+(22)=B8000+280+4 =B8284H第第M 行行,第第N 列的地址为列的地址为:PA=B8000H+M A0H+2 Nv显示缓冲区中显示缓冲区中,内容的描述内容的描述:0:1:50:51:9e:9f128182159160B800:01:A02:78013 A 76H :F0025每个字在内存中占用每个字在内存中占用2字节,低字节(偶地址)为字符内字节,低字节(偶地址)为字符内容,容,高字节(奇地址)为字符属性。高字节(奇地址)为字符属性。字符属性格式:字符属性格式:76543210含义含
39、义 BLRGBIRGB 闪烁闪烁 背景背景 高亮高亮 前景色前景色v编程在屏幕中间分别显示绿色、绿底红色、白编程在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串底蓝色的字符串“welcome to masm!”要显示的字符要显示的字符Data segmentdb welcome to masm!Data ends要写入的内存地址:要写入的内存地址:EA=12A0H+240=7D0HStart:mov ax,datamov ds,axmov ax,0b800hmov es,axmov cx,16mov bx,0mov di,7d0hS:mov al,bxmov ah,02mov es:di,a
40、xmov ah,24hmov es:di+0a0h,axmov ah,71hmov es:di+140h,axinc bxadd di,2loop sv程序举例一、顺序程序例:4-16编写S=86H*34H-21H的程序,式中的三个数均为无符号数。例:4-171)找最大数,最小数2)求和3)统计(大于,小于,等于)4)字母大小写转换一个源程序执行的过程一个源程序执行的过程第一步:编写汇编源程序第一步:编写汇编源程序v使用工具:使用工具:可使用各种文本编辑工具(记事本、可使用各种文本编辑工具(记事本、写字板、写字板、WORD等),我们使用等),我们使用DOS下的下的EDIT文本编辑器。文本编辑器
41、。v功能:功能:产生一个存储源程序的文本文件。产生一个存储源程序的文本文件。v使用方法:使用方法:在在DOS下运行下运行EDIT.EXE程序。程序。1、C:EDIT2、输入汇编源程序并保存为输入汇编源程序并保存为.asm文件。文件。第二步:对源程序进行编译第二步:对源程序进行编译v使用工具:使用工具:使用使用MASM5.0编译器编译器v功能:功能:使用编译器对源程序文件进行编译,生成使用编译器对源程序文件进行编译,生成包含机器代码的目标文件包含机器代码的目标文件(.obj)。)。v使用方法:使用方法:在在DOS下运行下运行MASM.EXE程序。程序。1、C:MASM MASM.EXE2、输入要
42、进行编译的源程序文件路径及名称。、输入要进行编译的源程序文件路径及名称。3、输入进行编译后产生的目标文件保存的路径及、输入进行编译后产生的目标文件保存的路径及名称。名称。4、输入列表文件名:、输入列表文件名:5、输入交叉文件名:、输入交叉文件名:第三步:对目标文件进行连接第三步:对目标文件进行连接v使用工具:使用工具:使用使用 LINK.EXE连接器连接器v功能:功能:对目标文件进行连接,从而得到一个可执对目标文件进行连接,从而得到一个可执行文件行文件.EXE。v使用方法:使用方法:在在DOS下运行下运行LINK.EXE程序。程序。1、C:MASM LINK.EXE2、输入要进行连接的目标文件
43、路径及名称。、输入要进行连接的目标文件路径及名称。3、输入进行连接后产生的可执行文件、输入进行连接后产生的可执行文件.Exe 保存保存的路径及名称。的路径及名称。4、输入映像文件名:、输入映像文件名:5、输入库文件名:、输入库文件名:第四步:跟踪、调试、运行程序第四步:跟踪、调试、运行程序v使用工具:使用工具:Debugv使用方法:使用方法:在在DOS下运行下运行DEBUG.EXE程程序。序。1、C:DEBUG xxx.EXEv以简化的方式进行编译和连接以简化的方式进行编译和连接 忽略中间文件,将产生的目标文件和可执行忽略中间文件,将产生的目标文件和可执行文件保存在当前路径下。文件保存在当前路
44、径下。C:MASM MASM XXX;C:MASM LINK XXX;连接的作用:连接的作用:v当源程序较大时,编译器会将源程序文件分成当源程序较大时,编译器会将源程序文件分成多个部分来编译,每个源程序编译成为目标文多个部分来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接在一起,生成件后,再用连接程序将它们连接在一起,生成一个可执行文件。一个可执行文件。v程序中调用了某个库文件中的内容时,需要将程序中调用了某个库文件中的内容时,需要将这个库文件和该程序生成的目标文件连接在一这个库文件和该程序生成的目标文件连接在一起。起。v一个源程序编译后,得到了存有机器码的目标一个源程序编译后,得
45、到了存有机器码的目标文件,目标文件中有的内容不能直接生成可执文件,目标文件中有的内容不能直接生成可执行文件,必须通过连接程序将这些内容处理为行文件,必须通过连接程序将这些内容处理为最终可执行的信息。最终可执行的信息。可执行文件中的程序装入内存并运行的原理可执行文件中的程序装入内存并运行的原理CPU内存硬盘DATA SEGMENTDATA ENDSCODE SEGMENTCODE ENDScommand操作系统的外壳操作系统的外壳操作系统是由多个功能模块组成的庞大、复杂的软件系统。操作系统是由多个功能模块组成的庞大、复杂的软件系统。任何通用的操作系统,都要提供一个称为外壳(任何通用的操作系统,都
46、要提供一个称为外壳(shell)的)的程序,用户使用这个程序来操作计算机系统进行工作。程序,用户使用这个程序来操作计算机系统进行工作。DOS中有一个程序中有一个程序,在在DOS中称为命令解中称为命令解释器,也就是释器,也就是DOS系统的外壳。系统的外壳。DOS启动时,先完成其他重要的初始化工作,然后运行启动时,先完成其他重要的初始化工作,然后运行command,command 运行后,在屏幕上显示出运行后,在屏幕上显示出“C:”,然后等待用户的输入。然后等待用户的输入。如果用户要执行一个程序,则输入该程序的可执行文件的如果用户要执行一个程序,则输入该程序的可执行文件的名称,名称,command
47、首先根据文件名找到可执行文件,然后将首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置这个可执行文件中的程序加载入内存,设置CS:IP指向程指向程序的入口。此后,序的入口。此后,command 暂停运行,由暂停运行,由CPU运行程序。运行程序。程序运行结束后,返回到程序运行结束后,返回到command中。中。在在DOS中可执行文件中可执行文件.EXE中程序加载的过程中程序加载的过程内存内存xxxx:0000PSPxxxx+10h:0000程程序序1、找到一段起始地址为、找到一段起始地址为xxxx:0000的容量足够的空闲内存区。的容量足够的空闲内存区。2、在这段内存区的
48、前、在这段内存区的前256个字节中,个字节中,创建一个称为程序段前缀(创建一个称为程序段前缀(PSP)的数据区,的数据区,DOS要利用要利用PSP来和被来和被加载的程序进行通信;加载的程序进行通信;3、从、从xxxx+10H:0开始,将程序装开始,将程序装入,程序的地址被设为入,程序的地址被设为xxxx+10H:04、将该内存区的段地址存入、将该内存区的段地址存入DS中,中,初始化其他相关寄存器后,设置初始化其他相关寄存器后,设置CS:IP指向程序入口。指向程序入口。注意:注意:PSP区和程序区虽然物理地址连续,但为更区和程序区虽然物理地址连续,但为更好的区分,好的区分,DOS将它们划分到不同的段中。将它们划分到不同的段中。程序加载后,程序加载后,ds=xxxx 为程序加载的段地址。为程序加载的段地址。数据区数据区堆栈区堆栈区代代码码区区