1、第4章 汇编语言程序格式,汇编程序功能 伪操作 汇编语言程序格式 汇编语言程序的上机过程,4.1汇编程序功能,EDIT MASM LINK图4.1汇编语言程序的建立及汇编过程,源文件 .asm,编 辑 程 序,连 接 程 序,汇 编 程 序,目标文 件. obj,可执 行文件 .exe,一、汇编语言源程序和汇编程序,汇编程序的作用就是把源程序文件(ASM文件)转换成用二进制代码表示的目标程序文件(OBJ文件)。,汇编程序的主要功能有: 检查源程序。 测出源程序语法错误,并给出错误。 产生目标程序,并可给出列表文件 展开宏指令。,1、汇编语言源程序汇编语言源程序是用汇编语言编写的程序,简称汇编语
2、言程序。汇编语言程序通过编辑程序在计算机中建立汇编语言源程序文件(ASM文件)。,2、汇编程序将汇编语言源程序编译成目标程序的加工程序称为汇编程序。这一加工过程称为汇编。,二、为运行汇编语言程序 要在磁盘上建立如下文件:,1、EDIT.EXE (编辑程序),2、MASM.EXE (汇编程序),3、LINK.EXE (连接程序),4、DEBUG.COM(调试程序),5、EXE2BIN.EXE(将EXE文件转换成COM文件)可选,伪指令属于汇编控制命令,它所指示的操作是由汇编程序在汇编源程序时完 成的,在汇编时,它不产生目标代码,在将源程序汇编成目标程序后,它就 不复存在了。,4.2伪指令,伪指令
3、又称为伪操作,伪指令是汇编语言程序设计的一个重要部分,由于汇编程序在汇编过程中无法区分源程序中的分段情况,哪些是数据,哪些是指令,也无法识别数据的类型,以及源程序在哪结束,因此,80X86宏汇编语言提供了多种伪指令,它主要告诉汇编程序如何正确地将汇编源程序汇编成目标程序。伪指令语句功能:指示汇编程序在汇编源程序时完成某些工作,比如完成数据定义、分配存储区、指示程序结束等。一条伪指令语句也由四个字段组成,其一般格式如下:符号名 伪指令符 操作数 ;注释,4.2伪指令,一、段结构伪指令,编制一个80X86汇编语言源程序,段是基础,这有两方面含义:一是必须按段来构造程序,二是在程序执行时,要凭借四个
4、段寄存器对各个段的存储单元进行访问。段结构伪指令主要有两条语句,即段定义伪指令和段寻址伪指令。,4.2伪指令,(一)、段定义伪指令,1、段定义伪指令的格式,段名 SEGMENT 定位类型 组合类型 类别 段体段名 ENDS,2、段定义伪指令的功能,指定逻辑段的名字、范围、段的起始边界、段与段之间的连接关系。,段定义伪指令中的SEGMENT和ENDS用于定义一个逻辑段,使用时必 须成对出现,分别表示段的起始和结束。,4.2伪指令,(二)、段寻址伪指令,1、段寻址伪指令的格式,ASSUME 段寄存器:段名 【,段寄存器:段名 】,2、段寻址伪指令的功能,主要用于指示汇编程序哪些段是当前段 以及这些
5、段与段寄存器之间的对应关系。,例:ASSUME CS:CODE , DS:DATA , SS:STACK,CODEDATASTACK,CS,DS,SS,对段寻址伪指令的几点说明:, 段寄存器名可为CS、DS、SS、ES四者之一。段名是指用SEGMENT/ ENDS语句已定义的段名,也可以是表达式“SEG 变量或标号”,或者是关键字NOTHING; (使用NOTHING时,来取消段寄存器与段之间的对应关系)。 ASSUME伪指令设置在代码段内,第一个ASSUME语句一般放在段定义语句之后,是说明性语句。 在一个代码段中,如果没有另外的ASSUME伪指令重新设置,原有ASSUME语句的设置一直有效
6、。 不在当前段中的变量和数据存储单元均是不可访问的,否则,会在汇编时产生错误或运行时造成混乱,产生逻辑上的错误,得出错误结果。 ASSUME伪指令不产生任何目标代码,它仅仅是告诉汇编程序,哪些段是当前段,而且它们分别由哪个段寄存器指向。 汇编程序不能检查在程序运行期间段寄存器内容是否与上述ASSUME语句的设置一致。如果在程序中间用ASSUME语句重建了DS或ES与某段的关系时,就一定要紧跟着将这个新段首地址送入DS或ES中,否则,会因段寄存器的内容未更改而使得后面数据的读写仍在原来的数据段中进行,这样的错误,系统是检查不出来的,即出现逻辑错误。,定位类型,定位类型说明段的起始地址应有怎样的边
7、界,它们 可以是: PARA: 指定段的起始地址必须从小段边界开始,即段起始地址的最低的十六进制数必须为0。这样偏移地址可以从0开始。(默认) BYTE: 该段可以从任何地址开始。这样起始偏移地址可能不为0。 WORD: 该段必须从字的边界开始,即段起始地址必须为偶数。 DWORD: 该段必须从双字的边界开始,即段起始地址的最低的十六进制数必须为4的倍数。 PAGE:该段必须从页的边界开始,即段起始地址的最低的两位十六进制数必须为0。(能被256整除),组合类型,组合类型说明程序连接时的段合并方法,它们可以是:PRIVATE: 该段为私有段,在连接时将不与其他模块中的同名分段合并。(默认) P
8、UBLIC: 该段连接时可以把不同模块中的同名段相连接而形成一个段,其连接次序由连接命令指定。每一分段都从小段的边界开始,因此各模块的原有段之间可能存在小于16个字节的空隙。(MEMORY与PUBLIC同义) COMMON: 该段连接时可以把不同模块中的同名段重叠而形成一个段,由于各同名段有相同的起始地址,所以会产生覆盖。COMMON的连接长度时各分段中的最大长度。重叠部分的内容取决于排列在最后一段的内容。 STACK: 把不同模块中的同名段组合而形成一个堆栈段。该段的长度为原有段的总和,各原有段之间无PUBLIC所连接段中的间隙,而且栈顶可自动指向连接后形成的大堆栈段的栈顶。 AT expr
9、ession:使段地址是表达式所计算出来的16位值。但它不能用来指定代码段。,类别,在引号中给出连接时组成段的类型名。类别说明并不能把相同类别的段合并起来,但在连接后形成的装入模块中,可以把它们的位置靠在一起。(LINK MUSIC+GROUND),例: STACK1 SEGMENT PARA STACK STACKDB 80 DUP (0)STACK1 ENDS,TITLE伪指令可指定每一页上打印的标题。同时,若程序中没有 NAME伪指令,则汇编程序将用text 中的前6个字符作为模块名。 text最多可有60个字符。,若程序中既无NAME又无TITLE伪指令,则将用源程序名作为模块名。 所
10、以NAME及TITLE伪指令并不是必要的,但一般常使用TITLE,以 便在列表文件中能打印出标题来。,4.2伪指令,二、源程序开始和结束伪指令,(一)源程序开始伪指令在源程序开始处可以用NAME或TITLE为模块取名字。,TITLE伪指令如果程序中没有NAME伪指令,则也可使用TITLE伪指令。格式:TITLE text, NAME伪指令格式:NAME 模块名汇编程序将以给出的“模块名”作为模块的名字。,其中,地址表达式为可选项,若选用地址表达式,则表示此程序是主程序,它可以单独执行,其地址表达式为该程序的启动地址,即程序开始运行的第一条指令的地址,例如,“END START”,此START是
11、第一条指令的标号;若不选用表达式,则说明此程序为一子程序,不能单独运行,只能被其它程序调用。,4.2伪指令,二、源程序开始和结束伪指令,(二)源程序结束伪指令格式:END 地址表达式 功能:该语句为源程序的最后一个语句,用以标志整个程序的结束,即告诉汇编程序汇编工作到此结束。,4.2伪指令,1、常用的数据定义伪指令有DB、DW、DD、DQ、DT。格式:变量 数据定义伪指令 表达式 ,表达式,功能:定义数据存储区,类型由数据定义伪指令确定,初值由表达式给定。,三、数据定义伪指令,例:DATA SEGMENTDATA1 DB 12H,34H,56H,78H,9AHDATA2 DW 1234H,56
12、78HDATA3 DD 12345678HDATA ENDS,DATA1,DATA2,DATA3,2、符号定义伪指令符号定义伪指令用于为程序中多次出现的同一个常量或表达式定义为一个标识符,以便在源程序中以标识符来代替对应的常量或表达式。符号定义伪指令有以下两种。(1)等价伪指令EQU格式:符号名 EQU 表达式功能:为常量或表达式及其它各种符号定义一个等价的符号名,但它不申请分配存储单元。,三、数据定义伪指令,说明: 表达式可以是常量或数值表达式;地址表达式;变量、标号或指令助记符. 符号名不占存储单元,没有段、偏移和类型3种属性. 在同一源程序中,使用EQU定义的符号不能与本程序中的其它符号
13、名同名;另外,同一符号不能用EQU伪指令重新定义。,EQU伪指令主要有以下3方面应用: 定义符号常量。用符号名表示常量、数值表达式。 EQU与属性运算符PTR或THIS连用,可以给变量或标号定义新的类型属性并重新命名。但其段属性和偏移属性不变。 利用EQU可以用一个符号名替代一个复杂的地址表达式和其它一些符号,如指令助记符、变量名、标号、段名、寄存器名、宏定义名等。,三、数据定义伪指令,(2)等号伪指令格式:符号名 = 表达式功能:该语句的功能与EQU语句类似,不同的是等号伪指令能对所定义的符号名多次重新定义,且以最后一次定义的值为准。,汇编程序在汇编源程序时,每遇到一新段,就为该段设置一个初
14、 值为0的汇编地址计数器,汇编程序使用汇编地址计数器记载正 在汇编的数据或指令的目标代码在当前段内的偏移地址。,4.2伪指令,当前汇编地址计数器的值可用符号$表示,用户可在程序中直接使用$,表示引用当前汇编地址计数器的值。例如:ARRAY DW 4000H,5000H,6000HCOUNT EQU ($ - ARRAY)/ 2,ARRAY ARRAY+1 ARRAY+2 ARRAY+3 ARRAY+4 ARRAY+5 ARRAY+6,COUNT,四、定位伪指令ORG与汇编地址计数器($),ORG伪指令格式: ORG 数值表达式功能:将数值表达式的值赋给汇编地址计数器。,汇编地址计数器的值可以用
15、定位伪指令ORG设置。,$,4.3汇编语言程序格式(数据与运算符),汇编语言的指令语句和伪指令语句操作数一般为常量、变量、标号、 表达式。,一、常量,(1)数值常量数值常量分为整数和实数。例如:11100011B ,45693 ,0FF2AH ,356703Q都是正确的整数形式. 又如:543.567,45.23,1.2E2,45.4E9都是正确的实数形式。,常量是没有任何属性的纯数值,它的值在汇编期间已能完全确定, 且在程序运行中也不会发生变化。常量分为数值常量、字符串常 量和符号常量,它主要用于指令语句中的立即数或伪指令语句中 给变量赋初值等。,(2)字符串常量字符串常量是用单引号括起来的
16、一个字符或多个字符。字符串常量以单引号中各字符的ASCII码形式存储在内存中,如A,在内存中就是41H,12就是31H,32H。使用时可在单引号内直接写字符序列,如12AB,也可写字符的ASCII码,ASCII码之间用逗号分隔(此时不需要用单引号),如31H,32H,41H,42H表示字符串12AB。,(3)符号常量符号常量是指用EQU伪指令或赋值语句“=”定义过的符号名,可作操作数项或在表达式中使用。,一、常量,二、变量,在汇编语言中,变量是一个数据存储单元的名称,即数据存放地址 的符号表示。它代表存放在某些存储单元的数据,这些数据在程序 运行期间随时可以改变。为方便访问变量,在程序中通过变
17、量名来 使用变量。,(1)变量的定义变量通常在数据段或附加段中使用数据定义伪指令来定义,定义变量就 是给数据分配存储单元,有时为存储单元赋予一个变量名,并可同时为这些存储单元预置初值。,数据定义伪指令的格式为:变量名 DB(DW、DD、DQ、DT) 表达式1,表达式2,,其中:变量名是可选项,它仅代表所定义数据存储区第一个单元的地址;DB、DW、DD、DQ和DT是伪指令符,具体一条数据定义伪指令取5种之一。DB定义的是字节类型的变量,每个表达式被分配1个字节单元。DW定义的是字类型的变量,每一个表达式被分配1个字单元(2个字节)。DD定义的是双字类型的变量,每一个表达式被分配2个字单元(4个字
18、节)。DQ定义的是四字类型的变量,每一个表达式被分配4个字单元(8个字节)。DT定义的是十字节类型的变量,每一个表达式被分配10个字节单元。,表达式1,表达式2是给变量或指定的存储单元赋予初值,它们有以下几种形式: (a)数值表达式 数据定义伪指令可以为一个或连续的存储单元设置数值初值。 (b)字符串表达式 对于DB伪指令,字符串的长度允许超过2个字符,但不能超过255个字符,字符串必须用单引号括起来,它可为字符串中的每个字符分配1字节单元,字符串从左至右以字符的ASCII码形式按地址递增的顺序依次存放。 (c)?表达式不带引号的?,用于为变量预留内存单元,暂时不存入数据,即表示所定义的变量无
19、确定的初值。 例如:A DW ?,?为变量A预留2个字单元。 (d)地址表达式操作数为地址表达式时,只适用于DW和DD这两种数据定义伪指令。如果地址表达式为一变量(标号)名,用DW伪指令则是取它的偏移地址来初始化变量;用DD伪指令则是取它的段首地址和偏移地址来初始化变量。 (e)带DUP的表达式格式为:n DUP (表达式),其中n为重复因子,只能取正整数,它表示定义了n个相同的数据存储单元。,数据定义伪指令的格式为:变量名 DB(DW、DD、DQ、DT) 表达式1,表达式2,,数据定义伪指令举例,DATA SEGMENTVAR1 DB 10HVAR2 DB ?,?,?VAR3 DB ABCD
20、VAR4 DW AB,CDVAR5 DB 2 DUP(1,2)VAR6 DW 2 DUP(AB)VAR7 DB 4 DUP (6, 3 DUP (5) ,7) DATA ENDS,10H,VAR1,VAR2,VAR3,VAR4,VAR5,VAR6,VAR71,二、变量 (2)变量的属性,(c)类型属性(TYPE)变量的类型属性表示存储变量时所占存储单元的字节个数。,由于存储器是分段使用的,因而源程序定义的变量具有3个属性:,(a)段属性(SEG)变量的段属性是指定义变量时它所在段的段首地址。,(b)偏移属性(OFFSET)变量的偏移属性是指所在段的段首地址到定义该变量的位置之间的字节数(即偏移
21、地址)。上述的段属性和偏移属性值就构成了一个变量的逻辑地址。,定义后的变量,在程序中的引用有两种情况:,二、变量(3)变量的使用,(b)在数据定义伪指令DW和DD中,操作数字段可直接引用已定义过的变量名。如: A DB 50H,40HB DW AC DD B,(a)在指令语句中,采用存储器操作数的几种寻址方式,除寄存器间接寻址方式不使用变量名外,其余各种寻址方式均可使用变量名。例如,某数据段已定义一变量ARRAY:ARRAY DW 5000H,4000H则在指令中可以使用如下指令:MOV AX,ARRAY+2MOV AX,ARRAY等。,三、标号,标号是一条指令语句的符号地址,在汇编源程序中,
22、只有在需要转向 一条指令语句时,才为该指令语句设置标号,以便在控制转移指令中 直接引用这个标号。标号一般在代码段中定义和引用。由于标号代表 了指令的符号地址,所以标号也有3个属性:,(c)类型属性(TYPE)。标号的类型属性表示了它的转移特性,即该标号是作为段内还是段间转移(或调用)指令的目标地址。标号的类型属性有2种:NEAR类型和FAR类型。,(a)段属性(SEG)。标号的段属性是指标号定义所在段的段首地址。,(b)偏移属性(OFFSET)。标号的偏移属性是指标号所在段的段首地址到该标号的字节距离。,四、表达式和运算符,汇编语言的指令语句和伪指令语句中,表达式是操作数项的常见形式, 表达式
23、是由常量、变量、标号用运算符连接而成有意义的式子。表达式 分为数值表达式和地址表达式,任一表达式的值只计算一次,表达式的 计算是在源程序汇编过程中进行的,而不是在程序运行中进行的,汇编 程序将表达式计算后得到一个数值或一个地址。,在8086汇编语言中,运算符分为:算术运算符、逻辑运算符、关系运算 符、数值返回运算符、属性运算符和字节分离运算符。,(1)数值表达式数值表达式是由常量与算术运算符、逻辑运算符或关系运算符构成的有意义的式子。数值表达式在汇编期间进行运算,运算结果为一数值常量,它只有大小而没有属性。,(2)地址表达式地址表达式是由常量、变量、标号、寄存器(BX、BP、SI、DI)内容(
24、用寄存器名加方括号表示)和运算符组成的有意义的式子。单个的变量、标号、寄存器的内容是地址表达式的特例。,地址表达式中可以使用算术运算符中的“+”、“-”运算符和关系运 算符。在地址表达式中,常用的形式是:变量常量。,地址表达式除使用数值表达式的运算符外,还可以使用特殊算符。 包括属性运算符、数值返回运算符、分离运算符等。,(一)、表达式,(a)属性运算符属性运算符主要用于临时修改变量、标号或某个内存单元中的操作数的类型属性。 段超越前缀“:”。其格式为:段寄存器名:地址表达式或 段名:地址表达式MOV AX,ES:SI 类型运算符PTR。其使用格式为:类型 PTR 地址表达式根据地址表达式的不
25、同值,类型可以是BYTE、WORD、DWORD、NEAR、FAR等。DATA2 DW 1234HMOV AL , BYTE PTR DATA2 定义类型伪操作符LABEL。 其格式为:变量名或标号 LABEL 类型DATA1 LABEL DBDATA2 DW 1234HMOV AL , DATA1,地址表达式使用的特殊运算符,地址表达式使用的特殊运算符,(b)数值返回运算符数值返回运算符有5种,这些运算符的运算对象必须是变量或标号,其功能是分离出变量或标号的段、偏移地址及类型的属性值,运算结果为一数值常量。 SEG运算符格式:SEG 变量或标号功能:分离出其后变量或标号所在段的段首地址。 OF
26、FSET运算符格式:OFFSET 变量或标号功能:分离出其后变量或标号的偏移地址。 TYPE运算符格式:TYPE 变量或标号功能:分离出其后变量或标号的类型值。 LENGTH运算符格式:LENGTH 变量功能:取出变量所含的数据存储单元个数。该运算符只对变量起作用,它的取值根据定义该变量时数据定义伪指令后面第一个表达式的形式而定。如果第一个表达式为重复子句“n DUP (表达式)”的形式,则取值为前面的重复因子n。如果为其它形式的表达式,则取值均为1。 SIZE运算符格式:SIZE 变量功能:取出变量所含的数据存储区的总字节数。其返回值为该变量的LENGTH值和TYPE值的乘积,即:LENGT
27、H 变量 * YTPE 变量。,例: ARRAY DW 1,2,3 FEES DW 100 DUP (0) TABLE DB ABCDADD SI , TYPE ARRAYMOV CX , LENGTH FEESMOV CX , LENGTH ARRAYMOV CX , LENGTH TABLEMOV AX , SIZE FEESMOV AX , SIZE ARRAYMOV AX , SIZE TABLEMOV BX , OFFSET OPR1MOV AX , SEG OPR1,ADD SI,2MOV CX,100MOV CX,1MOV CX,1MOV AX,200MOV AX,2MOV AX
28、,1MOV BX,0005HMOV AX,0100H,(c)分离运算符 分离高字节运算符HIGH。格式:HIGH 常量或地址表达式功能:用来分离出其后16位常量或地址表达式的偏移地址的高字节。 分离低字节运算符LOW。格式:LOW 常量或地址表达式功能:用来分离出其后16位常量或地址表达式的偏移地址的低字节。 (d)其他运算符SHORT运算符:用于说明其后的标号在短距离(-128-127之间)内。()运算符用于改变运算的优先级别。 运算符用于表示间接寻址。,地址表达式使用的特殊运算符,4.4汇编语言程序的上机过程,一、基本汇编语言程序的结构源程序是由多各段组成的,一个可执行的汇编源程序一般至少
29、由一个代码段,其中包含可执行的语句。二、段寄存器的装入,ASSUME 伪指令只能建立当前段与段寄存器之间的对应关系,但 它不能将段寄存器赋予相应段的段基值,段寄存器的装入需要 程序的方法来实现,这四个段寄存器的装入方法略有不同。,1、DS和ES的装入在程序中,使用数据传送语句来实现DS和ES的装入。,例:DATA1 SEGMENTARRAY DB 12HDATA1 ENDSDATA2 SEGMENTARRAY1 DB 14H DUP (?)DATA2 ENDSCODE SEGMENTASSUME CS:CODE , DS:DATA1, ES:DATA2START: MOV AX , DATA1
30、MOV DS , AXMOV AX , DATA2MOV ES , AXCODE ENDSEND START,2、SS的装入在段定义伪指令的组合类型项中,使用STACK参数,并在段寻址伪指令ASSUME语句中把该段与SS相关联。,例:STACK1 SEGMENT PARA STACKDB 80H DUP (?)STACK1 ENDSCODE SEGMENTASSUME CS:CODE , SS:STACK1START: CODE ENDSEND START,SS将自动装入STACK1段的段基值,堆栈指针SP也将自动 指向堆栈栈底的存储单元。(本例:(SP)=80H ),2、SS的装入如果在段定
31、义伪指令的组合类型中未使用STACK参数,或者是在程序中要调换到另一个堆栈,这时可以使用和DS类似的装入方法,使用数据传送语句来实现SS的装入,但注意,除对SS赋值外,还要对SP进行赋值。,例:STACK1 SEGMENT DB 80H DUP (?)TOP LABEL WORDSTACK1 ENDSCODE SEGMENTASSUME CS:CODE , SS:STACK1START: MOV AX , STACK1MOV SS , AXMOV SP , OFFSET TOP CODE ENDSEND START,3、CS的装入CS-段基值 IP-提供下一条将要执行的目标代码的偏移量CPU在
32、执行指令之前根据CS和IP的内容来从内存中提取指令,装入CS和IP。 按照结束伪指令指定的地址装入CS和IP.,CODE SEGMENTASSUME CS:CODE START: CODE ENDSEND START,起始地址可以省略,但一般在主程序中不被省略,在子程 序中可被省略。,3、CS的装入CS-段基值 IP-提供下一条将要执行的目标代码的偏移量CPU在执行指令之前根据CS和IP的内容来从内存中提取指令,装入CS和IP。在程序运行期间,当执行某些指令时,CPU自动修改CS和IP,使它们指向新的代码段。,例如:执行段间过程调用指令CALL和段间返回指令RET;执行段间无条件转移指令JMP
33、;响应中断及中断返回指令;执行硬件复位操作等。,4.4汇编语言程序的上机过程,三、程序返回DOS的两种方式。,1、方式1(框架1) CODE SEGMENT MAIN PROC FAR ;将用户程序设置成过程ASSUME CS:CODE , DS:DATA , SS:STACK1 START: PUSH DS ;将PSP起始单元段地址压入堆栈SUB AX , AX PUSH AX ;将PSP起始单元偏移地址压入堆栈MOV AX , DATAMOV DS , AXRET ;返回DOS MAIN ENDP CODE ENDSEND START,DATA SEGMENTARRAY DB 12H DA
34、TA ENDS,STACK1 SEGMENT PARA STACKDB 80H DUP (?) STACK1 ENDS,每个应用程序在装入之前,DOS系统都 为程序生成一个100字节的段前缀PSP, 放在程序的最前面。PSP是一个程序控 制块,第一、二字节是指令INT 20H,该 指令结束程序,正常返回DOS。,三、程序返回DOS的两种方式。,2、方式2(框架2)CODE SEGMENTMAIN PROC FAR ;将用户程序设置成过程ASSUME CS:CODE , DS:DATA , SS:STACK1START: MOV AX , DATAMOV DS , AXMOV AX , STAC
35、K1MOV SS , AXMOV SP , OFFSET TOPMOV AH,4CHINT 21H ;返回DOSMAIN ENDPCODE ENDSEND START,STACK1 SEGMENT DB 80H DUP (?)TOP LABEL WORDSTACK1 ENDS,4.4汇编语言程序的上机过程,四、汇编程序的开发1、建立汇编语言源程序在MASM目录下使用EDIT建立一个文件名.ASM的汇编语言源文件。,DATA SEGMENTARRAY DW 4000H,5000H,6000H COUNT EQU ($ - ARRAY)/ 2 DATA ENDS CODE SEGMENTASSUM
36、E CS:CODE , DS:DATA START: MOV AX,DATAMOV DS,AXMOV DL,COUNT ;在显示器上显示变量COUNT的值ADD DL,30HMOV AH,02H INT 21HMOV AH,4CHINT 21H CODE ENDSEND START,上机过程:,进入编辑页面,编辑结束后,选择FILE下拉菜单中的SAVE项存盘,再选EXIT项退出。,编辑结束界面后,在D:MASM后输入MASM A,进行汇编。,按回车键直到再次出现D:MASM,如下图所示。,用连接程序LINK进行连接。,运行文件,查看结果。,用DEBUG 调试程序进行调试。 DEBUG 文件名.
37、EXE -U (反汇编命令),用DEBUG 调试程序查看内存。 -D 段地址:偏移地址(查看内存命令),用DEBUG 调试程序查看寄存器的内容。 -R (查看寄存器指令),用DEBUG 调试程序进行单步运行。 -T (单步执行指令),用DEBUG 调试程序一次运行程序。 -G (运行指令),退出DEBUG 调试程序。 -Q (退出指令),在DOS状态下,输入EXIT退出DOS,返回WINDOWS状态。,【本章小结】 1 程序结构伪指令:包括段定义伪指令、段组定义伪指令、程序开始和结束伪指令等。 NAME、TITLE、END、SEGMENT、ENDS、ASSUME、GROUP 2 数据类型及数据定义伪指令:包括数据定义及存储器分配伪指令、表达式赋值伪指令、基数控制伪指令等。 DB、DW、DD、DQ、DT、DUP、PTR、LABEL 3 地址计数器与对准伪指令 $、ORG、EVEN、ALIGN 4 汇编语言程序格式: 完整段定义格式 简化段定义格式 5汇编语言程序上机过程: CEDIT FILENAME.ASM CMASM FILENAME.ASM CLINK FILENAME.OBJ CFILENAME ,