2022年2022年汇编语言程序格式 .pdf
第 1 页 共 21 页汇编语言程序格式【思考】(1) 建立并运行一个汇编语言程序有几个操作步骤?(2) 指令和伪指令的区别是什么?(3) 在汇编语言程序中,段定义伪指令和数据定义伪指令起什么作用?(4) 变量和标号的类型属性分别有哪几种?(5) 什么是表达式?表达式的优先级顺序是如何排列的?(6) 汇编语言的上机过程是什么?(7) 汇编语言源程序一般由几个段组成?(8) 汇编程序和连接程序的输入、输出文件有哪些?它们的作用是什么?【学习目标】了解编辑程序、汇编程序、连接程序的功能及其输入、输出文件的类型;了解汇编语言源程序的格式;熟练掌握并运用段定义伪指令和数据定义及存储器分配伪指令;熟悉数值表达式的书写规范;上机编程时学会使用DEBUG 调试程序。【学习指南】介绍了汇编语言程序的完整段和简化段格式。在学习本内容时, 可利用汇编语言程序的框架,通过上机来验证和理解各种指令和伪指令的格式、功能及作用。【难重点】段定义伪指令、数据定义及存储器分配伪指令及其它伪指令;数据类型属性和代码属性及其在编程中的应用;数值表达式的表示及其应用。【知识点】1 汇编程序功能2 伪指令2.1 段定义伪指令2.1.1 完整的段定义伪指令2.2.2 存储模型与简化段定义伪指令2.2.3 段组定义伪指令2.3 程序开始和结束伪指令2.4 数据定义及存储器分配伪指令2.5 表达式赋值伪指令2.6 地址计数器与对准伪指令2.7 基数控制伪指令3 汇编语言程序格式3.1汇编语言源程序语句的格式3.2 表达式3.3 汇编语言源程序格式举例4 汇编语言程序的上机过程1 建立汇编语言的工作环境2 汇编语言程序上机运行过程3 COM 文件名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 20 页 - - - - - - - - - 第 2 页 共 21 页第一节汇编程序功能建立 , 运行汇编语言程序汇编程序的主要功能:1.检查源程序,给出出错信息。2.产生目标文件 (.obj) 和列表文件 (.lst)。3.展开宏指令。第二节伪指令汇编语言程序中的语句可以由指令、伪指令和宏指令组成。上一章我们介绍了8086 指令系统中的6 类指令,每一条指令都对应一种CPU 操作。伪指令又称为伪操作,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。宏指令是由用户按照宏定义格式编写的一段程序,其中语句可以是指令、伪指令, 甚至是已定义的宏指令。宏指令将在第七章中介绍。伪指令和指令的区别在于,每一条指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作; 而伪指令是在汇编期间由汇编程序执行的操作命令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。和各种指令一样,伪指令也是程序设计不可缺少的工具。下面介绍一些常用的伪指令。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 20 页 - - - - - - - - - 第 3 页 共 21 页2.1 处理器选择伪操作.8086 选择8086 指令系统.286 选择80286 指令系统.286P 选择保护模式下的80286 指令系统.386 选择80386 指令系统.386P 选择保护模式下的80386 指令系统.486 选择80486 指令系统.486P 选择保护模式下的80486 指令系统.586 选择 Pentium 指令系统.586P 选择保护模式下的Pentium 指令系统2.2 段定义伪指令段定义伪指令是表示一个段开始和结束的命令,80 x86 有两种段定义的方式:完整段定义和简化段定义,分别使用不同的段定义伪指令来表示各种段。1完整段定义伪指令的格式如下:由于 ASSUME 伪指令只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中:MOV AX ,DATA_SEG1 ; 数据段地址MOV DS,AX ; 存入 DS 寄存器MOV AX ,DATA_SEG2 ; 附加段地址MOV ES,AX ; 存入 ES 寄存器如果程序中还定义了堆栈段STACK_SEG ,也需要把段地址装入SS中:MOV AX ,STACK_SEG ; 堆栈段地址MOV SS,AX ; 存入 ES寄存器名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 20 页 - - - - - - - - - 第 4 页 共 21 页注意 ,在程序中不需要用指令装入代码段的段地址,因为在程序初始化时,装入程序已将代码段的段地址装入CS 寄存器了。 而 DS 和 ES 是指向一个称为“PSP”(程序段前缀 )的一块区域的首地址。为了对段定义作进一步地控制,SEGMENT 伪指令还可以增加类型及属性的说明,其格式如下:段名SEGMENT定位类型 组合类型 类别 段名ENDS 中的内容是可选的,一般情况下,这些说明可以不用。但是,如果需要用连接程序把本程序与其他程序模块相连接时,就需要提供类型和属性的说明。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 20 页 - - - - - - - - - 第 5 页 共 21 页定位类型 :说明段的起始边界值( 物理地址 ) 。定位类型说 明BYTE 段可以从任何地址边界开始WORD 段从字边界开始,即段的起始边界值为偶数DWORD 段从双字的边界开始,即段的起始边界值为4 的倍数PARA 段从小段边界开始,即段的起始边界值为16 ( 或 10H) 的倍数PAGE 段从页边界开始,即段的起始边界值为256 ( 或 100H) 的倍数注意:定位类型的缺省项是PARA ,即在未指定定位类型的情况下,则连接程序默认为PARA 。BYTE和 WORD 用于把其它段 (通常是数据段) 连入一个段时使用; DWORD 一般用于运行在80386及后继机型上的程序。组合类型 :说明程序连接时的段组合方法。组合类型说 明PRIVATE 该段为私有段,连接时将不与其它模块中的同名段合并PUBLIC 该段连接时将与其它同名段连接在一起,连接次序由连接命令指定COMMON 该段在连接时与其它同名段有相同的起始地址,所以会产生覆盖AT 表达式段地址表达式的值,其值必为16 位但 AT不能用来指定代码段MEMORY 与 PUBLIC同义STACK 将多个同名堆栈段连接在一起,SP设置在第一个堆栈段的开始注意: 组合类型的缺省项是PRIVATE 。例:在连接之前已定义两个目标模块如下:模块 1 SSEG SEGMENT PARA STACK DSEG1SEGMENT PARA PUBLIC Data DSEG2SEGMENT PARA CSEG SEGMENT PARA Code 模块 2 DSEG1SEGMENT PARA PUBLIC Data DSEG2SEGMENT PARA CSEG SEGMENT PARA Code 以上两个模块分别汇编后产生.OBJ 文件,经连接程序连接后产生的.EXE 模块如下:模块 1 CSEGSEGMENT PARA Code 模块 2 CSEG SEGMENT PARA Code 模块 1+2 DSEG1SEGMENT PARA PUBLIC Data 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 20 页 - - - - - - - - - 第 6 页 共 21 页模块 1 DSEG2SEGMENT PARA 模块 2 DSEG2SEGMENT PARA 模块 1 SSEG SEGMENT PARA STACK 2 存储模型与简化段定义伪指令较新版本的汇编程序(MASM5.0与 MASM6.0 )除支持完整段定义伪指令外,还提供了一种新的简单易用的存储模型和简化的段定义伪指令。存储模型伪指令存储模型的作用是什么呢?存储模型决定一个程序的规模,也确定进行子程序调用、指令转移和数据访问的缺省属性(NEAR 或 FAR) 。当使用简化段定义的源程序格式时,在段定义语句之前必须有存储模型.MODEL 语句,说明在存储器中应如何安放各个段。MODEL 伪指令的常用格式如下:.MODEL存储模型表MASM 5.0和 MASM 6.0支持的存储模型:存储模型功 能适用操作系统Tiny ( 微型 ) 所有数据和代码都放在一个段内,其访问都为NEAR 型,整个程序 64K,并会产生.COM文件。MS-DOS Small ( 小型 ) 所有代码在一个64KB的段内,所有数据在另一个64KB的段内(包括数据段, 堆栈段和附加段)。MS-DOS Windows Medium ( 中型 ) 所有代码 64K 时可放在多个代码段中,转移或调用可为FAR型。所有数据限在一个段内,DS可保持不变。MS-DOS Windows Compact( 紧凑型 ) 所有代码限在一个段内,转移或调用可为NEAR 型。 数据 64K时,可放在多个段中。MS-DOS Windows Large ( 大型 ) 允许代码段和数据段都可超过64K,被放置在有多个段内,所以数据和代码都是远访问。MS-DOS Windows Huge ( 巨型 ) 单个数据项可以超过64K,其它同Large 模型MS-DOS Windows Flat ( 平展型 ) 所有代码和数据放置在一个段中,但段地址是32 位的,所以整个程序可为4GB 。MASM 6.0支持该模型。OS/2 WindowsNT 注意: Small 模型是一般应用程序最常用的一种模型,因为只有一个代码段和一个数据段,所以数据和代码都是近访问的。这种模型的数据段是指数据段、堆栈段和附加段的总和。在 DOS 下用汇编语言编程时,可根据程序的不同特点选择前6 种模型,一般可以选用SMALL模型。另外, TINY 模型将产生COM 程序,其他模型产生EXE程序。 FLAT模型只能运行在 32 位 x86 CPU上, DOS 下不允许使用这种模型。当与高级语言混合编程时,两者的存储模型应当一致。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 20 页 - - - - - - - - - 第 7 页 共 21 页简化的段伪指令简化的段定义语句书写简短,语句.CODE、.DATA 和.STACK 分别表示代码数据段和堆栈段的开始,一个段的开始自动结束前面一个段。采用简化段指令之前必须有存储模型语句.MODEL 。表简化段伪指令的格式如下表:简化段伪指令功 能注释.CODE 段名 创建一个代码段段名为可选项,如不给出段名, 则采用默认段名。 对于多个代码段的模型,则应为每个代码段指定段名。.DATA创建一个数据段段名是: _DATA .DATA?创建无初值变量的数据段段名是: _BSS .FARDATA 段名 建立有初值的远调用数据段可指定段名, 如不指定, 则将以 FAR_DATA命名。.FARDATA? 段名 建立无初值的远调用数据段可指定段名,如不指定,则将以FAR_BSS命名。.CONST建立只读的常量数据段段名是: CONST .STACK 大小 创建一个堆栈段并指定堆栈段大小段名是: stack 。如不指定堆栈段大小,则缺省值为1KB 与简化段定义有关的预定义符号汇编程序给出了与简化段定义有关的一组预定义符号,它们可在程序中出现,并由汇编程序识别使用。有关的预定义符号如下:(1)code 由.CODE 伪指令定义的段名或段组名。(2)data 由.DATA 伪指令定义的段名,或由.DATA 、.DATA? 、.CONST 和 .STACK 所定义的段组名。(3)stack 堆栈段的段名或段组名。下面的举例说明预定义符号的使用方法。在完整的段定义情况下,在程序的一开始,需要用段名装入数据段寄存器,如例1 中的mov ax,data_seg1 mov ds,ax 若用简化段定义,则数据段只用.data来定义,而并未给出段名,此时可用mov ax,data mov ds,ax 这里预定义符号data 就给出了数据段的段名。简化段定义举例例: .MODEL SMALL .STACK 100H ; 定义堆栈段及其大小.DATA ; 定义数据段.名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 20 页 - - - - - - - - - 第 8 页 共 21 页.CODE ; 定义代码段START: ; 起始执行地址标号MOV AX, DATA; 数据段地址MOV DS, AX ; 存入数据段寄存器.MOV AX, 4C00H INT21H END START ; 程序结束从例 3 可以看出, 简化段定义比完整的段定义简单得多。但由于完整的段定义可以全面地说明段的各种类型与属性,因此在很多情况下仍需使用它。3 段组定义伪指令段组定义伪指令能把多个同类段合并为一个64KB 的物理段, 并用一个段组名统一存取它。段组定义伪指令GROUP 的格式如下:段组名GROUP段名, 段名 我们已经知道在各种存储模型中,汇编程序自动地把各数据段组成一个段组DGROUP ,以便程序在访问各数据段时使用一个数据段寄存器DS,而 GROUP 伪指令允许用户自行指定段组。利用 GROUP 伪指令定义段组后,段组内统一为一个段地址,各段定义的变量和标号都可以用同一个段寄存器进行访问。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 20 页 - - - - - - - - - 第 9 页 共 21 页2.3 程序开始和结束伪指令在程序的开始可以用NAME 或 TITLE 作为模块的名字,其格式为:NAME模块名TITLE 文件名表示源程序结束的伪指令的格式为:END 标号 注意: NAME 及 TITLE 伪指令并不是必需的,如果程序中既无NAME 又无 TITLE 伪指令,则将用源文件名作为模块名。程序中经常使用TITLE , 这样可以在列表文件中打印出标题来。END伪指令中的 标号 指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程序的END 要加上标号,其他子程序模块则只用END 而不必指定标号。例13 的最后使用了END START 伪指令。汇编程序将在遇END 时结束汇编,并且程序在运行时从START 开始执行。MASM 6.0 版的汇编程序还增加了定义程序的入口点和出口点的伪操作。. STARTUP 用来定义程序的初始入口点,并且产生设置DS,SS和 SP 的代码。若程序中使用了 .STARTUP,则结束程序的END 伪操作中不必再指定程序的入口点标号。. EXIT return_value 2.4 数据定义及存储器分配伪指令名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 20 页 - - - - - - - - - 第 10 页 共 21 页例:例:例:DB(define byte)DB 伪指令用来定义字节,对其后的每个数据都存储在一个字节中。DB 能定义十进制数、二进制数、十六进制数和ASCII 字符,二进制数和十六进制数要分别用B 和H 表示,ASCII 字符用单引号( )括起来。 DB 还是唯一能定义字符串的伪操作,串中的每个字符占用一个字节。DW (define word)DW 伪指令用来定义字,对其后的每个数据分配2 个字节( 1 个字),数据的低8 位存储在低字节地址中, 高 8 位存储在高字节地址中,如下例中的变量DATA8 的数据存储在0070字地址中,其中0070 字节存储0BAH ,0071 字节存储03H。DW 还可存储变量或标号的偏移地址。见上面DW 伪指令的例子。DD(define doubleword)DD 伪指令用来定义双字,对其后的每个数据分配4 个字节(2 个字)。该伪指令同样将数据转换为十六进制,并根据低地址存储低字节,高地址存储高字节的规则来存放数据。如下例 DATA15 的存储情况是:00A8:0F2H ,00A9H:57H ,00AAH:2AH ,00ABH:5CH 。用 DD 存入地址时,第一个字为偏移地址,第二个字为段地址。DQ(define quadword )DQ 伪指令用来定义4 字,即 64 位字长的数据,DQ 之后的每个数据占用8 个字节( 4个字)。DT (define ten bytes)DT 伪指令用来为压缩的BCD 数据分配存储单元, 它虽然可以分配10 个字节(5 个字),但最多只能输入18 个数字,要注意的是,数据后面不需要加H 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 20 页 - - - - - - - - - 第 11 页 共 21 页DUP(duplicate)DUP 伪指令可以按照给定的次数来复制某个(某些)操作数,它可以避免多次键入同样一个数据。例如,把6 个 FFH 存入相继字节中,可以用下面两种方法,显然用DUP 的方法更简便些。存入 6 字节的 FFH DATA20 DB 0FFH 0FFH 0FFH 0FFH 0FFH 0FFH; DATA21 DB 6 DUP(0FFH) PTR 属性操作符PTR 指定操作数的类型属性,它优先于隐含的类型属性。其格式为:类型 PTR变量 常数表达式 其中类型可以是BYTE 、WORD 、DWORD 、FWORD 、QWORD 或 TBYTE ,这样变量的类型就可以指定了。如下例:(P131 例 14)LABEL 伪指令LABEL可以使同一个变量具有不同的类型属性。其格式为:其中变量的数据类型可以是BYTE ,WORD ,DWORD 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 20 页 - - - - - - - - - 第 12 页 共 21 页2.5 表达式赋值伪操作EQUEQU 是一个赋值伪操作(伪指令),它给一个数据标号赋于一个常数值,但这个常数不占用存储单元。当这个数据标号出现在程序中时,汇编程序即用它的常数值代替数据标号。EQU 可以在数据段之外使用,甚至可用在代码段中间。使用 EQU 操作的优点可从下面的例子中看出:COUNT EQU 25 COUNTER DB COUNT MOV AL, COUNT = 伪操作赋值伪操作 = 的作用与EQU 类似。它们之间的区别是,EQU 伪操作中的标号名是不允许重复定义的,而=伪操作是允许重复定义的。注意: 在 EQU 语句的表达式中,如果有变量或标号的表达式,则在该语句前应该先给出它们的定义。如上例,ALPHA 必须在 BETA 之前定义,否则汇编程序将指示出错。例如,TMP EQU 5 TMP EQU TMP+1 则是错误语句,因为TMP 已赋值为5,就不能再把它定义为其它数值。而 TMP = 5 TMP = TMP+1 则是允许使用的,因为=伪操作允许重复定义。第一个语句TMP 的值为 5,第二个语句TMP 的值就为6 了。2.6 地址计数器与对准伪指令1. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 20 页 - - - - - - - - - 第 13 页 共 21 页ORG 伪操作:生成 COM 程序:2EVEN 伪指令EVEN 伪指令使下一个变量或指令开始于偶数字节地址。3 ALIGN伪指令ALIGN 伪指令使它后面的数据或指令从2 的整数倍地址开始。其格式为:ALIGN 2n (n为任意整数 ) 2.7 基数控制伪指令.RADIX伪指令.RADIX可以把默认的基数改变为2 16 范围内的任何基数。其格式如下:.RADIX基数值其中基数值用十进制数来表示。应当注意,在用.RADIX 16把基数定为十六进制后,十进制数后面都应跟字母D。在这种情况下,如果某个十六进制数的末字符为D,则应在其后跟字母H,以免与十进制数发生混淆。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 20 页 - - - - - - - - - 第 14 页 共 21 页4.3汇编语言程序格式3.1汇编语言源程序语句的格式(1) 名字项源程序中用下列字符来表示名字:字母 AZ 数字 09 专用字符?、 、 、-、除数字外,所有字符都可以放在源语句的第一个位置。名字中如果用到 则必须是第一个字符。可以用很多字符来说明名字,但只有前面的31 个字符能被汇编程序所识别。一般说来, 名字项可以是标号或变量。它们都用来表示本语句的符号地址,都是可有可无的,只有当需要用符号地址来访问该语句时它才需要出现。标号:标号在代码段中定义,后面跟着冒号:,它也可以用LABEL或 EQU 伪操作来定义。此外,它还可以作为过程名定义,这将在以后的章节中加以说明。变量:变量在数据段或附加数据段中定义,后面不跟冒号。 它也可以用LABEL或 EQU伪操作来定义。变量经常在操作数字段出现。(2)操作项操作项可以是指令、伪指令或宏指令的助记符。对于指令, 汇编程序将其翻译为机器语言指令。对于伪指令,汇编程序将根据其所要求的功能进行处理。对于宏指令,则将根据其定义展开。宏指令在第七章中将会专门论述。(3) 操作数项操作数项由一个或多个表达式组成,多个操作数项之间一般用逗号分开。对于指令, 操作数项一般给出操作数地址,它们可能有一个,或二个,或三个,或一个也没有。对于伪操作或宏指令,则给出它们所要求的参数。操作数项可以是常数、寄存器、标号、变量或由表达式组成。(4) 注释项注释项用来说明一段程序、一条或几条指令的功能。对于汇编语言程序来说,注释项的作用是很明显的,它可以使程序容易被读懂,因此汇编语言程序必须写好注释。注释应该写出本条(或本段)指令在程序中的功能和作用,而不应该只写指令的动作。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 20 页 - - - - - - - - - 第 15 页 共 21 页3.2 表达式(1) 算术操作符算术操作符有 +、-、*、 / 和 MOD 。MOD 是指除法运算后得到的余数,如19/7 的商是 2,而 19 MOD 7 则为 5(余数)。(2) 逻辑操作符AND 、OR、XOR 、NOT 、SHL 、SHR (3) 关系操作符关系操作符有:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于) 、GE(大于或等于) 。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 20 页 - - - - - - - - - 第 16 页 共 21 页(4) 数值回送操作符TYPE 、LENGTH 、SIZE 、OFFSET 、SEG 例:(5) 属性操作符属性操作符主要有:PTR、段操作符、 SHORT、THIS、HIGH 、LOW 等。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 20 页 - - - - - - - - - 第 17 页 共 21 页操作符的优先级(p143)操作符的优先级别从高到低排列如下:1. 在圆括号中的项, 方括号中的项, 结构变量 (变量, 字段。 ) ,然后是 LENGTH 、SIZE、WIDTH 和 MASK 。2. 名: (段取代)。3. PTR,OFFSET,SEG,TYPE, THIS 及段操作符。HIGH 和 LOW 。5. 乘法和除法: *, /,MOD 。6. 加法和减法: +,-。7. 关系操作: EQ,NE,LT,LE,GT,GE。8. 逻辑: NOT 。9. 逻辑: AND 。10. 逻辑: OR,XOR 。11. SHORT。3.3 汇编语言源程序格式举例(p144) 例 1完整段定义格式; TITLE 文件名 - 程序主要功能描述;EQU 语句;* * * * * * * * * * * * * * * * * * * * * * * * * * datarea segment ;定义数据段; 数据定义语句datarea ends;* * * * * * * * * * * * * * * * * * * * * * * * * * prognam segment ;定义代码段;- main proc far ; 主程序assume cs:prognam,ds :datarea start: ; 程序起始执行地址; 为程序返回DOS 设置堆栈值push ds ; 入栈保存原DS段址sub ax,ax ; 设置偏移地址为0 push ax ; 入栈保存偏移地址; 置 DS寄存器为当前数据段mov ax,datarea ;datarea段地址mov ds,ax ; 存入 DS寄存器; 主程序部分ret ; 返回 DOS main endp ; 主程序结束名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 20 页 - - - - - - - - - 第 18 页 共 21 页;- sub1 proc near ; 定义子程序; 子程序部分sub1 endp ; 子程序结束;- prognam ends ; 代码段结束;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * end start ; 汇编结束例 2简化段定义格式.model small ;定义存储器模型.stack 100h ;定义堆栈段.data ;定义数据段; 数据定义语句.code ;定义代码段main proc far start: mov ax,data ;数据段地址mov ds,ax ; 存入 DS 寄存器;主程序部分mov ax,4c00h int 21h ;返回 DOS main endp ;主程序结束end start ;汇编结束4 汇编语言程序的上机过程1 建立汇编语言的工作环境为运行汇编语言程序至少要在磁盘上建立以下文件:1. 编辑程序,如EDIT.EXE2. 汇编程序,如MASM.EXE3. 连接程序,如LINK.EXE调试程序,如DEBUG .COM必要时,还可建立如CREF.EXE, EXE2BIN.EXE等文件。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 20 页 - - - - - - - - - 第 19 页 共 21 页2 汇编语言程序上机运行过程CEDIT MYFILE.ASMCMASM MYFILE.ASMMicrosoft (R) Macro Assembler Version 5.00 Copyright (C) Microsoft Corp 1981-1985,1987.All rights reserved. Object filename MYFILE.OBJ: Source listing NUL.LST: MYFILE.LSTCross-reference NUL.CRF: 51646 + 44778 Bytes symbol space free 0 Warning Errors 0 Severe Errors CLINK MYFILE.OBJMicrosoft (R) Overlay Linker Version 3.60Copyright (C) Microsoft Corp 1983-1987. All rights reserved. Run File MYFILE.EXE: List File NUL.MAP: Libraries .LIB: LINK : warning L4021: no stack segment CMYFILE 上述内容是建立并运行一个汇编语言程序的操作,红色字表示程序员键入的命令,黑色字是计算机的回答,为回车符。假设EDIT 、MASM 、LINK 和汇编语言程序都在C 盘中。LINK 程序的输出文件有.EXE 可执行文件和 .MAP 连接映象文件。.EXE 文件是 CPU 能识别并执行的代码,.MAP连接映象文件给出了每个段在存储器中的分配情况。左面是MYFILE.MAP文件,它给出了各个段的起始地址、结束地址及其大小。3 COM 文件COM 文件也是一种可执行文件,由程序本身的二进制代码组成,它没有 EXE 文件所具有的包括有关文件信息的标题区(header) ,所以它占有的存储空间比EXE 文件要小。 COM文件不允许分段,它所占有的空间不允许超过64K,因而只能用来编制较小的程序。由于它小而简单,装入速度比EXE 文件要快。使用 COM 文件时,程序不分段,其入口点(开始运行的起始点)必须是100H,在此之前的 256 个字节是程序段前缀。COM 文件不必设置堆栈段。在程序装入时,由系统自动把 SP建立在该段之末。对于所有的过程则应定义为NEAR 。用户在建立源文件以后,经过汇编、连接形成EXE 文件,然后可以通过EXE2BIN 程名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 20 页 - - - - - - - - - 第 20 页 共 21 页序来建立COM 文件,操作命令如下:Cexe2bin filename COM 文件还可以直接在调试程序DEBUG 中用 A 或 E 命令建立,对于一些短小的程序,这也是一种相当方便的方法。【本章小结】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 6 汇编程序和连接程序的输入输出文件。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 20 页 - - - - - - - - -