1、0,第3章 汇编语言程序格式,3.1 汇编程序功能 3.2 伪操作 3.3 汇编语言程序格式 3.4 汇编语言程序的上机过程,1,3.1 汇编程序功能,计算机是通过执行指令序列来解决问题的。计算机的指令系统就是指该计算机能够执行的全部指令的集合。指令的一般格式:标号: 操作符 OPD, OPS ;注释算术运算和位操作类指令的部分单操作数指令的格式:标号: 操作符 OPD ;注释,2,汇编语言程序的建立及开发过程,编辑,文本编辑器,如 EDIT.COM,源程序:文件名.asm,汇编,汇编程序,如 MASM.EXE,目标模块:文件名.obj,连接,连接程序,如 LINK.EXE,可执行文件:文件名
2、.exe,错误,3,汇编程序的主要功能,检查源程序 测出源程序中的语法错误,并给出出错信息 产生源程序的目标程序,并可给出列表文件(同时列出汇编语言和机器语言的文件,称为LST文件) 展开宏指令,4,3.2 伪操作,硬指令使CPU产生动作、并在程序运行期间由计算机执行的语句。 伪指令(Directive)不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等。 伪指令与具体的处理器类型无关,但与汇编程序的版本有关。,5,汇编语言语句实例MOV CX,0 ;传送指令,具有2个操作数DELAY: NOP;空操作指令,没有操作数,带有标号LOOP DELAY;循环指令
3、,标号DELAY说明转移位置BUFFER DB 1,2,3,4,5,6,7;数据定义伪指令,在主存中开辟7个连续的字节单元,初值依次为17,BUFFER表示首地址,6,3.2.1 段定义伪操作,1.完整的段定义伪操作存储器的物理地址是由段地址和偏移地址组合而成的,汇编程序在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起,形成一个可执行程序。为此需要用段定义伪操作,格式如下:段名 SEGMENT 定位 组合 使用 类别 . ;对数据段,附加段和堆栈段,一般是存储单元的定. ;义,分配等伪操作,对代码段则
4、是指令及伪操作段名 ENDS,7,完整段定义由SEGMENT和ENDS这一对伪指令实现,SEGMENT伪指令定义一个逻辑段的开始,ENDS伪指令表示一个段的结束 段定义指令后的4个关键字用于确定段的各种属性,堆栈段要采用stack组合类型,代码段应具有code类别,其他为可选属性参数 如果不指定,则采用默认参数;但如果指定,注意要按照上列次序。,8,(1)定位类型:指定逻辑段在主存储器中的边界,可为:BYTE 该段可以从任何地址开始,这样偏移地址可能不是0WORD 该段必须从字的边界开始,即段起始地址必须为偶数DWORD 该段必须从双字的边界开始,即段起始地址的最低两个十六进制数位必须为4的倍
5、数PARA 该段的起始地址必须从小段边界开始,即段起始地址的最低16进制数必须为0,9,PAGE 该段必须从页的边界开始,即段的起始地址的最低两个十六进制数位必须为0简化段定义伪指令的代码和数据段默认采用WORD定位,堆栈段默认采用PARA定位 完整段定义伪指令的默认定位属性是PARA,其低4位已经是0,所以默认情况下数据段的偏移地址从0开始,10,(2)组合类型说明程序连接时的段合并方法,即指定多个逻辑段之间的关系,可为:PRIVATE 本段为私有段,与其他段没有逻辑关系,在连接时不与其他段合并,每段都有自己的段地址。这是完整段定义伪指令默认的段组合方式PUBLIC 连接程序把本段与所有同名
6、同类型的其他段相邻地连接在一起,然后为所有这些段指定一个共同的段地址,也就是合成一个物理段。这是简化段定义伪指令默认的段组合STACK 本段是堆栈的一部分,连接程序将所有STACK段按照与PUBLIC段的同样方式进行合并。这是堆栈段必须具有的段组合,11,(3)使用类型是支持32位段而设置的属性,用来说明使用16位寻址方式还是32位寻址方式对于16位x86 CPU来说,它默认是16位段,即USE16而对于汇编32位x86 CPU指令时,它默认采用32位段,即USE32;但可以使用USE16指定标准的16位段 编写运行于实地址方式(8086工作方式)的汇编语言程序,必须采用16位段,12,(4)
7、类别在引号中给出连接时组成段组的类型名。当连接程序组织段时,并不能把相同类别的段合并起来,但可将所有的同类别段相邻分配 段类别可以是任意名称,但必须位于单引号中 大多数MASM程序使用 code、data和stack来分别指名代码段、数据段和堆栈段,以保持所有代码和数据的连续,13,此外,必须明确段与段寄存器的关系,可用ASSUME伪操作来实现。格式:ASSUME 段寄存器:段名 ,段寄存器名:段名, .作用: 通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系 在明确了程序中各段与段寄存器之间的关系后,汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。这是
8、ASSUME伪指令的主要功能。,14,ASSUME伪指令并不为段寄存器设定初值,所以在代码段中还必须把段地址装入相应的段寄存器中。例如:定义数据段段名为DATA,则需使用MOV指令对DS段寄存器进行赋值。MOV AX, DATAMOV DS, AX如果程序中有堆栈段,也需要把地址装入SS中 代码段不需要这样做,代码段的这一操作是在程序初始化时完成的。,15,例:完整的段定义伪操作data_1 segment data_1 ends data_2 segment data_2 ends code segment assume cs:code,ds:data_1,es:data_2 start:m
9、ov ax,data_1mov ds,axmov ax,data_2mov es,ax code endsend start,16,2.存储模型与简化段定义伪操作 (1)MODEL伪操作格式:.MODEL memory_model,model options 用来表明存储模型,即用来说明在存储器中是如何安放各个段的存储模型memory model决定一个程序的规模,确定进行子程序调用、指令转移和数据访问的缺省属性 MASM有7种不同的存储模式: TINY SMALL COMPACT MEDIUM LARGE HUGE FLAT,17,iny 微型模型是MASM 6.0才引入的,用于创建COM类
10、型程序。用微型模型编写汇编语言程序时,所有的段地址寄存器都被设置为同一值,这意味着代码段、数据段、堆栈段都在同一个段内,不大于64KB;访问操作数或指令都只需要使用16位偏移地址。一般用于小程序。 mall 小型模型是最常用的一种模型。在小型模型下,一个程序至多只能有一个代码段和一个数据段,每段不大于64KB。这里的数据段指数据段、堆栈段和附加段的总和,它们共用同一个段基址,总长度不超过64KB;访问操作数或指令都只需要使用16位偏移地址;代码和数据都是近访问的,小模型下程序的最大长度为128KB,18,ompact 紧凑模型适合于数据量大但代码量小的程序。在该模型下,代码段被限制在一个不大于
11、64KB的段内;而数据段则可以有多个,超过64KB。 代码是近访问的,而数据则可为远访问的。 edium 中型模型是与紧凑模型互补的模型,适合于数据量小但代码量大的程序。中型模式的代码段可以超过64KB,有多个;但数据段只能有一个不大于64KB的段。数据是近访问,而代码可远访问。 arge 大型模式允许的代码段和数据段都有多个,都可以超过64KB;但全部的静态数据(不能改变的数据)仍限制在64K字节内.数据和代码都可以远访问。,19,uge 巨型模型与大型模型基本相同,只是静态数据不再被限制在64K字节之内。 lat 平展模型用于创建一个32位的程序,它只能运行在32位x86 CPU上。DOS
12、下不能使用FLAT模型,而编写32位Windows 9.x或Windows-NT的程序时,必须采用FLAT模型。DOS下编程可选择前六种模型,一般可以选用SMALL模型,TINY模式产生COM程序,其他模型产生EXE程序,FLAT模型只能用于32位程序。,20,Model options允许用户指定三种选项:高级语言接口、操作系统和堆栈距离。高级语言接口选项是指该汇编语言程序作为某一种高级语言程序的过程而为该高级语言程序调用时,应该用等来说明。操作系统选项是要说明程序运行于哪个操作系统之下,可用OS_DOS或OS_OS2来说明,默认是OS_DOS。堆栈距离选项可用NEARSTACK或FARST
13、ACK来说明,基中NEARSTACK是指堆栈段和数据段组合到一个DGROUP段中,而FARSTACK是指堆栈段和数据段并不合并。例如:.MODEL SMALL,C.MODEL LARGE,OS_DOS,21,(2)简化的段定义伪操作简化段定义伪指令指明一个逻辑段的开始,同时自动结束前面的一个段。采用简化段定义伪指令前,需有.model语句。常用:.STACK 大小 ;堆栈段开始.DATA ;数据段开始.CODE 段名 ;代码段开始 .STACK 大小堆栈段伪指令.STACK创建一个堆栈段,段名是:stack,它的参数指定堆栈段所占存储区的字节数,默认是1KB(= 1024 = 400h字节),
14、22,.DATA 数据段伪指令.data创建一个数据段,段名是:_DATA。它用于定义具有初值的变量,当然也允许定义无初值的变量。无初值变量可以安排在另一个段中,它用.data?伪指令创建,数据段名是:_BSS。.const伪指令用于建立只读的常量数据段(段名:CONST) .CODE 段名 代码段伪指令.code创建一个代码段,它的参数指定该代码段的段名。如果没有给出段名,则采用默认段名:在TINY、SMALL、COMPACT和FLAT模式下,默认的代码段名是:_TEXT;在MEDIUM、LARGE和HUGE模式下,默认的代码段名是:模块名_TEXT。,23,(3)与简化段定义有关的预定义符
15、号使用简化段定义,各段名称和其他用户所需的信息可以使用MASM预定义符号,例如:data表示由.data等定义的数据段的段名。 (4)简化段定义举例.MODEL SMALL.STACK 100H.DATA.CODE START:MOV AX,DATA,MOV DS,AX MOV AX,4C00H INT 21H END START,24,3.段组定义伪操作格式:组名 GROUP 段名,段名,. 把多个同类段合并为一个64KB物理段,并用一个组名统一存取它 定义段组后,段组内各段就统一为一个段地址,各段定义的变量和标号的偏移地址就相对于段组基地址计算 offset操作符取变量和标号相对于段组的偏
16、移地址,如果没有段组则取得相对于段的偏移地址。offset后可以跟段组中的某个段名,表示该段最后一个字节后面字节相对于段组的偏移地址,25,3.2.2 程序开始和结束伪操作,程序开始可用Name和ITLE作为模块的名字。NAME的格式:NAME 模块名汇编语言将以给出的”模块名”作为模块的名字。TITLE的格式:TITLE 标题TITLE伪操作可指定列表文件中的每一页上打印的标题 END表源程序结束的伪操作,格式为:END 标号用来指示汇编程序MASM到此结束汇编过程。源程序的最后必须有一条END语句。可选的标号用于指定程序开始执行点,连接程序将据此设置CS : IP值,26,MASM6.0还
17、增加了定义程序入口点和出口点的伪操作。用.STARTUP定义程序的初始入口点,并产生设置DS,SS和SP的代码。如果程序采用了.startup伪指令就不需要再用“end 标号”指明开始执行点,但还要有end伪指令 .EXIT用来产生退出程序并返回操作系统的代码,其格式: .EXIT 返回参数可选参数是一个返回的数码,通常用0表示没有错误。例如.exit 0对应的代码是:MOV AX,4C00HINT 21H DOS功能调用的4CH子功能(返回DOS):入口参数:AH4CH,AL返回数码,27,3.3 参数、变量和标号,本节详细讨论汇编语言程序语句的主要部分: 参数 变量名 标号 并引出相关的伪
18、指令和操作符 本节重点掌握: 常数的表达 变量定义伪指令DB/DW/DD、 地址操作符和类型操作符,28,3.3.1 数值型参数,在源程序语句格式的4个组成部分中,参数是指令的操作对象(在学习硬指令时被称为操作数),参数之间用逗号分隔 参数根据指令不同可以没有,可以有1个、2个或多个 汇编语言程序中,指令参数有数值型,它的主要形式是常数和数值表达式; 硬指令的操作数有立即数;立即数就要用数值型参数表达,29,1. 常数,常数(常量)表示一个固定的数值 它又分成多种形式: (1)十进制常数 (2)十六进制常数 (3)二进制常数 (4)八进制常数 (5)字符串常数 (6)符号常数,30,十进制常数
19、,由0 9数字组成,以字母D或d结尾 缺省情况下,后缀D或d可以省略 汇编语言大小写不敏感,D和d通用 例如:100、255D,31,十六进制常数,由09、AF组成,以字母H或h结尾 以字母AF开头的十六进制数,前面要用0表达,以避免与其他符号混淆 汇编语言大小写不敏感, H和h 通用 例如:64H、0FFh、0B800H,32,二进制常数,由0或1两个数字组成,以字母B或b结尾 汇编语言大小写不敏感,B和b通用 例如:01101100B,33,八进制常数,由0 7数字组成,以字母Q或q结尾 汇编语言大小写不敏感,Q和 q 通用 例如:144Q 各种进制的数据以后缀字母区分,默认不加后缀字母的
20、是十进制数 MASM提供基数控制.RADIX伪指令可以改变默认进制,其格式是:.RADIX n,34,字符串常数,用单引号或双引号括起来的单个字符或多个字符,其数值是每个字符对应的ASCII码的值 例如:d = 64H AB= 4142H 1= 31H Hello, Everybody !,35,符号常数,利用一个标识符表达的一个数值 MASM提供等价机制,用于常量定义 符号定义伪指令: 等价EQU伪指令 符号名 EQU 数值表达式 符号名 EQU 等号=伪指令 符号名 = 数值表达式 常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性,36,符号定义DosWriteCha
21、r equ 2CarriageReturn = 13CallDOS equ 符号应用(左边程序段等价右侧的符号形式)mov ah,2 ;mov ah,DosWriteCharmov dl,13 ;mov dl,CarriageReturnint 21h ;CallDOS,符号常数实例,37,2. 数值表达式,数值表达式一般是指由运算符连接的各种常数所构成的表达式 汇编程序在汇编过程中计算表达式,最终得到一个数值 程序运行之前,就已经计算出了表达式;所以,程序运行速度没有变慢,但增强程序的可读性 MASM对除伪指令外各种汇编时处理的指令统称为操作符(Operator),38,运算符,算术运算符
22、+ - * / MOD 逻辑运算符 AND OR XOR NOT 移位运算符 SHL SHR 关系运算符 EQ NE GT LT GE LE 高低分离符 HIGH LOW HIGHWORD LOWWORD,39,算术运算符,实现加、减、乘、除、取余的算术运算 mov ax,3*4+5 ;等价于 mov ax,17 其中MOD也称为取模,它产生除法之后的余数,如19 mod 7 = 5 加+和减-运算符还可以用于地址表达式 除加、减外,其他运算符的参数必须是整数,40,逻辑运算符,实现按位相与、相或、异或、求反的逻辑运算 or al,03h AND 45h ;等价于 or al,01h,41,移
23、位运算符,实现对数值的左移、右移的逻辑操作;移入低位或高位的是0 格式为: 数值表达式 SHL/SHR 移位次数 mov al,0101b SHL (2*2) ;等价于 mov al,01010000b,42,关系运算符,用于比较和测试符号数值 MASM用0FFFFH(补码 -1)表示条件为真 MASM用0000H表示条件为假 mov bx,(PORT LT 5)AND 20)OR(PORT GE 5)AND 30) ;当PORT5时,汇编结果为mov bx,20 ;否则,汇编结果为mov bx,30,43,高低分离符,取数值的高半部分或低半部分 HIGH、LOW从一个字数值或符号常量中得到高
24、、低字节 mov ah,HIGH 8765h ;等价于mov ah,87h 从MASM 6.0引入的HIGHWORD、LOWWORD取一个符号常量(不能是其他常数)的高字或低字部分 dd_value equ 0ffff1234h;定义一个符号常量 mov ax,LOWWORD dd_value;等价于mov ax,1234h,44,3. 运算符的优先级,1 () LENGTH SIZE WIDTH MASK 2 PTR OFFSET SEG TPYE THIS : 3 HIGE LOW 4 * / MOD SHL SHR 5 + - 6 EQ NE GT LT GE LE 7 NOT 8 AN
25、D 9 OR XOR 10 SHORT,建议采用圆括号“()”显式表达,它可以极大地提高程序的可阅读性,45,4.地址型参数,汇编语言程序中,指令参数还有地址型,它的主要形式是标号和名字(变量名、段名、过程名等) 硬指令的操作数有存储单元;存储单元就应该用地址型参数(存储器操作数)表达,46,3.3.2 变量定义伪指令,变量定义(Define)伪指令为变量申请固定长度的存储空间,并可同时将相应的存储单元初始化 变量名 伪指令助记符 初值表,变量定义伪指令最常使用,47,变量名,变量名为用户自定义标识符,表示初值表首元素的逻辑地址;用这个符号表示地址,常称为符号地址 变量名可以没有。这种情况,汇
26、编程序将直接为初值表分配空间,无符号地址 设置变量名是为了方便存取它指示的存储单元,48,初值表,初值表是用逗号分隔的参数 主要由数值常数、表达式或?、DUP组成 ?表示初值不确定,即未赋初值; DUP表示重复初值 DUP的格式为: 重复次数 DUP(重复初值参数),49,变量定义伪指令助记符,变量定义伪指令根据申请的主存空间单位分类 DB定义字节伪指令 DW定义字伪指令 DD定义双字伪指令 DF定义3字伪指令 DQ定义4字伪指令 DT定义10字节伪指令 还有定位伪指令,50,定义字节单元伪指令DB,DB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值 初值表中每个数据一定是字节量
27、(Byte),存放一个8位数据:可以是0255的无符号数或是128127带符号数也可以是字符串常数,51,data segment;数据段 X db a,-5db 2 dup(100),? Y db ABC data ends,字节单元定义实例,mov al,X;此处X表示它的第1个数据,故ALa inc X+1;对X为始的第2个数据减1,故成为-4 mov Y,al;现在Y这个字符串成为 aBC,字节变量的应用,52,定义字单元伪指令DW,DW伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值 初值表中每个数据一定是字量(Word),一个字单元可用于存放任何16位数据:一个段地址 一
28、个偏移地址两个字符065535之间的无符号数3276832767之间的带符号数,53,data segment ;数据段 count dw 8000h,?,AB maxint equ 64h number dw maxint array dw maxint dup(0) data ends,字单元定义实例,54,字变量和字常量的定义: WNUM EQU 5678H ;定义WNUM为常量 COUNT DW 20H ;定义COUNT变量,假设在数据段的偏移地址为10H 字变量和字常量的应用: MOV AX,BX+SI+WNUM ; MOV AX,BX+SI+5678H MOV AX,COUNT ;
29、 MOV AX,0010H MOV AX,SI+COUNT ; MOV AX,COUNTSI; MOV AX,SI+10H LEA BX,COUNT ; LEA BX,0010H MOV BX,OFFSET COUNT ; MOV BX,0010H,字变量和字常量,55,定义双字单元伪指令DD,DD伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值 初值表中每个数据是一个32位的双字量(Double Word):可以是有符号或无符号的32位整数也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针 vardd DD 0,?,12345678h farpoint DD
30、 00400078h,56,其他数据单元定义伪指令,定义3字伪指令DF用于为一个或多个6字节变量分配空间及初始化 6字节常用在32位CPU中表示一个48位远指针(16位段选择器:32位偏移地址) 定义4字伪指令DQ用于为一个或多个8字节变量分配空间及初始化 8字节变量可以表达一个64位整数 定义10字节伪指令DT用于为一个或多个10字节变量分配空间及初始化 10字节变量可以表达扩展精度浮点数,57,例:数据定义综合应用,.model small .stack .data bvar DB 16 wvar DW 4*3 dvar DD 4294967295 ;2321 qvar DQ ?DB 1,
31、2,3,4,5 tvar DT 2345 ;定义了BCD码2345H abc DB a,b,c msg DB Hello,13,10,$ bbuf DB 12 DUP(month) dbuf DD 25 DUP(?) CALLDOS EQU ,.code .startupmov bl,bvarmov ax,word ptr dvar0mov dx,word ptr dvar2;取双字到DX.AXmov dx,offset msgmov ah,09hCALLDOS .exit 0 end,58,定位伪指令,定位伪指令控制数据的偏移地址 ORG 参数 ORG伪指令是将当前偏移地址指针指向参数表达的
32、偏移地址: ORG 100h ;从100h处安排数据或程序 ORG $+10 ;使偏移地址加10,即跳过10个字节空间 MASM中,符号“$”表示当前偏移地址值 EVEN ;从偶地址开始 ALIGN n ;从n的整数倍地址开始,59,3.3.3 变量和标号的属性,标号和名字一经定义便具有以下两类三种属性: 段值 标号和名字对应存储单元的段地址 偏移值 标号和名字对应存储单元的偏移地址 类型 标号、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间 变量名的类型可以是BYTE(字节)、WORD(字)和DWORD(双字)等,60,地址操作符,取得名字或标号的段地址和偏移地址两个属
33、性 将括起的表达式作为存储器地址 $ 当前偏移地址 : 采用指定的段地址寄存器 OFFSET 名字/标号 返回名字或标号的偏移地址 SEG 名字/标号 返回名字或标号的段地址,61,org $+10 array db 45,45h.codemov ax,seg arraymov ds,axmov bx,offset array;等价于 lea bx,arraymov cl,array+4;等效于 mov cl,array4mov ax,es:2000h,地址操作符实例,62,类型操作符,类型操作符对名字或标号的类型属性进行有关设置 类型名 PTR 名字/标号 THIS 类型名 SHORT 标号
34、 TYPE 名字/标号 SIZEOF 变量名 LENGTHOF 变量名,63,类型名 PTR 名字/标号,PTR操作符使名字或标号具有指定的类型 类型名可以是 BYTE/WORD/DWORD/FWORD/QWORD/TBYTE 或者是NEAR/FAR,还可以是由STRUCT、RECORD、UNION以及TYPEDEF定义的类型 mov al,byte ptr w_var ;w_var是一个字变量 jmp far ptr n_label ;n_label是一个标号 使用PTR操作符,可以临时改变名字或标号的类型,64,THIS 类型名,利用THIS说明的操作数具有汇编时的当前逻辑地址,但具有指定
35、的类型 b_var equ THIS byte ;按字节访问变量b_var,但与w_var的地址相同 w_var dw 10 dup(0) ;按字访问变量w_var f_jump equ THIS far ;用f_jump为段间转移(f_jump label far) n_jump: mov ax,w_var ;用n_jump为段内近转移,但两者指向同一条指令 LABEL伪指令的功能等同于“EQU THIS”,65,SHORT 标名,指定标号作为-128+127字节范围内的短转移 jmp short n_jump 当然,如果标号实际上超出了这个范围,则出错。,66,TYPE 名字/标名,返回表
36、明名字或标号类型的一个字量数值 对字节、字和双字变量依次返回1、2和4; 对短、近和远转移依次返回ff01h、ff02h和ff05h mov ax,TYPE w_var ;汇编结果为mov ax,2 mov ax,TYPE n_jump ;汇编结果为 mov ax,0ff02h(near标号) 操作符SIZEOF返回整个变量占用的字节数 LENGTHOF返回整个变量的数据项数(即元素数) SIZEOF LENGTHOF TYPE,67,.model small.stack.data v_byte equ this byte;v_byte是字节类型,与变量v_word的地址相同 v_word d
37、w 3332h,3735h;v_word是字类型的变量 target dw 5 dup(20h);分配数据空间2510字节 crlf db 0dh,0ah,$ flag db 0 n_point dw offset s_label;取得标号s_label的偏移地址,例:属性及其应用,68,.code.startupmov al,byte ptr v_word;用PTR改变v_word的类型,否则类型不匹配dec almov v_byte,al;对v_word的头一个字节操作,原为32H、现为31H n_label: cmp flag,1jz s_label ;flag单元为1转移inc fla
38、gjmp short n_label ;进行短转移,69,s_label: cmp flag,2jz next ;flag单元为2转移inc flagjmp n_point;段内的存储器间接寻址,转移到s_label标号处 next: mov ax,type v_word;汇编结果为mov ax,2mov cx,lengthof target;汇编结果为mov cx,5,70,mov si,offset target w_again: mov si,ax ;对字单元操作inc si ;SI指针加2inc siloop w_again ;循环mov cx,sizeof target;汇编结果为
39、mov cx,0ahmov al,?mov di,offset target b_again: mov di,al ;对字节单元操作inc di ;DI指针加1loop b_again ;循环,71,mov dx,offset v_word;显示结果:1357?mov ah,9int 21h.exit 0end,72,3.4.1 建立汇编语言的工作环境(1)编辑程序,如 EDIT.EXE(2)汇编程序,如 MASM.EXE(3)连接程序,如 LINK.EXE(4)调试程序,如 DEBUG.COM 3.4.2 建立ASM文件可以用编辑程序EDIT.EXE在磁盘上建立汇编语言源程序 3.4.3 用
40、MASM程序产生OBJ文件源文件建立后,要用汇编程序对源文件汇编,汇编后产生二进制的目标文件(.OBJ文件),3.4 汇编语言程序的上机过程,73,汇编程序的输入文件是ASM文件,其输出文件可以有三个:第一个是OBJ文件,这是汇编的主要目的第二个是LIST文件,称为列表文件这个文件同时列出源程序和机器语言程序清单,并给出符号表,可使程序调试更加方便这个文件是可有可无的第三个是CRF文件,这个文件用来产生交叉引用表REF一般程序不需要建立此文件为了建立交叉引用表,必须调用CREF程序交叉引用表给出了用户定义的所有符号,对于每个符号列出了其定义所在行号及引用的行号汇编程序另一个重要功能:可以给出源
41、程序中的错误信息,74,3.4.4 用LINK程序产生EXE文件产生二进制的目标文件(OBJ文件)后,还必须使用连接程序(LINK)把OBJ文件转换为可执行的EXE文件LINK程序有两个输入文件OBJ和LIB,OBJ是需要连接的目标文件,LIB则是程序中需要用到的库文件LINK有两个输出文件,一个是EXE文件,这是需要的可执行文件,另一个为MAP文件,它是连接程序的列表文件,它给出每个段在存储器中的分配情况 3.4.5 程序的执行在建立了EXE文件后,可以直接从DOS执行程序,75,总 结,详述汇编语言程序格式的组成部分简单介绍了汇编程序的功能 重点介绍了各伪操作指令 介绍汇编语言程序的上机过程,