1、第7章 汇编语言的基本语法,Assemble Language,一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言(机器语言的符号化描述),通常是为特定计算机或计算机系列专门设计的。,Assemble Language,用汇编语言编写的程序不能由机器直接执行,而必须经汇编程序翻译成机器语言程序。汇编语言指令与翻译成的机器语言指令之间基本是一一对应的关系。汇编过程示意:,采用汇编语言进行程序设计的优点:可充分利用机器的硬件功能和结构特点,加快程序的执行速度,减少目标程序所占用的存储空间。常用来编写实时控制程序、实时通信程序,有时也用来编制某些系统软件程序。,缺点:1. 编程效率低(与
2、人们描述计算过程的需要差距大);2. 与机器硬件的具体结构联系过于紧密 在一种结构的机器上开发的程序极难移植到另一种不同结构的机器上去。,示例程序,DATA SEGMENT ;数据段 NUM DW 0011101000000111B NOTES DB The result is : , $DATA ENDSCODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA BEGIN: MOV AX, DATA MOV DS,AX MOV DX,OFFSET NOTES ;显示提示信息 MOV AH,9H INT 21H MOV BX,NUM ;将数装入BX MOV CH,4 ;
3、CH作循环计数器,示例程序(续),ROTATE : DISPLAY: MOV CL, 4 ;CL中放移位位数 MOV DL, AL ;显示16进制数 ROL BX,CL MOV AH,2 MOV AL,BL INT 21H AND AL,0FH ;AL中为一位16进制数 DEC CH ADD AL,30H ;转换为ASCII码值 JNZ ROTATE CMP AL,9 ;是09的数码? MOV AX,4C00H;返回DOS JLE DISPLAY INT 21H ADD AL,07H ;在AF之间 CODE ENDS ;代码段结束 END BEGIN ;模块结束,堆栈段定义格式,STACK S
4、EGMENT STACK STA DB 50 DUP (?) TOP EQU LENGTH STASTACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS, AX MOV SP,TOP :CODE ENDS END START,7.1.2 汇编语言源程序的组成,1. 伪指令语句和指令语句汇编语言源程序中除了包含真正的指令外,还应包含说明性的“指令”。这些说明性的“指令”是面向汇编程序和连接程序的,称为伪指令。宏汇编程序5.0版(MASM V5.0)规
5、定,汇编语言源程序的每行只能写一个语句: 指令语句或伪指令语句。行长不能超过128个字符。每个语句最多可由四个字段组成: 名字字段、操作字段、操作数字段和注释字段。,伪指令语句是说明性语句,其格式为: 名字伪指令说明符参数表达式1,参数表达式2, ;注释其中,伪指令说明符(伪指令名)是伪指令语句中不可缺少的主体,其余部分(方括号中的内容)有时可省略。名字可为段名、过程名、变量名、符号名(或常量名)、宏名、结构名、记录名等。例: A DB 20H,30H ; 注释,指令语句是可执行语句,其格式为: 名字:指令操作助记符操作数表达式1,操作数表达式2;注释其中,指令操作助记符(指令名)是指令语句中
6、不可缺少的主体,其余部分(方括号中的内容)有时可省略。名字只能是标号。 注释以分号开头,分号右边的内容将被汇编程序忽略。例 L: ADD AX,BX ;注释,汇编程序负责计算伪指令语句中表达式的值,解释伪指令语句的含义并遵照“执行”,但并不产生机器代码。汇编程序负责计算指令语句中表达式的值,并将汇编指令翻译成机器指令代码。指令语句经汇编后,在可执行程序运行期间由CPU解释,并由CPU按指令的要求完成各种运算与操作。,7.1.4 汇编语言的表达式,1. 汇编语言的标识符2. 汇编语言的操作对象( 数据类型) (1) 常数、常量编程时已经确定其值,程序运行期间不会改变其值的数据对象称为常数。808
7、6/8088CPU允许定义四种形式的常数: 整数、字符串、“组合BCD码数”和实数(浮点数),但只能处理整数、字符串、“组合BCD码数”,不能处理实数(浮点数)。,常数表达式的名字称为常量。 (程序员给出的一个名或助记名作为一个确定值的标识, 其值在程序执行过程中保持不变。)常量可用伪指令说明符“EQU”或“=”定义。例如,A EQU 7或 A = 7都可将常量A的值定义为常数7。 注意:伪指令说明符EQU左边的符号名不允许重复定义,而“=”左边的符号名可以重复定义。 即,A EQU 7 可以:A=7 A EQU 8 (不允许) A=8,(2) 变量编程时只能确定其初始值,程序运行期间可修改其
8、值的数据对象称为变量。变量是存储单元中的数据,可定义在任何段(DS、 ES、 SS、 CS),但通常都定义在数据段(DS)和附加段(ES)。变量由伪指令说明符DB、DW、DD等定义。需要时可给变量的地址取名字,变量名就是变量地址的名字,可称为变量的符号地址。,例如, 在下列伪指令语句中, A DB 50,60,70,80 DW 50,60,70,80 DD 50,60,70,80用DB、DW、DD说明符各定义了4个变量,并给出了每个变量的初始值。,用DB定义的每个变量占一个字节单元,用DW定义的每个变量占两个连续的字节单元,用DD定义的每个变量占四个连续的字节单元,这些变量全部都按定义时的顺序
9、依次存储,只是用DB定义的第一个变量赋予了名字A。A仅代表DB右边第一个变量(即DB右边初值为50的变量)的地址。 变量有如下的属性: 段基值属性: 指变量所在段的段基值; 偏移地址属性: 指变量所在的存储单元的段内偏移地址; 类型属性: 指变量所占存储单元的字节数。,(3) 标号标号就是指令地址的名字,也称为指令的符号地址。标号定义在指令的前面(通常是左边),用冒号作为分隔符。标号只能定义在代码段(CS)中,它代表其后第一条指令的第一个字节的存储单元地址,用于说明指令在存储器中的存储位置。例如, 在下列指令序列中, MOV CX, 2 L:DEC CX JZ LL就是标号,它是JZ指令的直接
10、操作数(转移地址).,标号有如下的属性: 段基值属性: 指标号后面第一条指令所在的代码段的段基值; 偏移地址属性: 指标号后面第一条指令首字节的段内偏移地址; 类型属性: 也称距离属性,是指标号与引用该标号的指令之间允许距离的远、近。,(4) 段名每一个段都必须用SEGMENT和ENDS标识段的开始和结束,SEGMENT和ENDS左边必须有名字,段名就是SEGMENT和ENDS左边的名字。对于同一个段,ENDS左边的名字必须与SEGMENT左边的名字相同。,(5) 过程名过程就是一段程序,可以是主程序,也可以是子程序。一个代码段中可以只有一个过程,也可以有多个过程。每一个过程都可用PROC和E
11、NDP标识过程的开始和结束,PROC和ENDP左边必须有名字,过程名就是PROC和ENDP左边的名字。对于同一个过程,ENDP左边的名字必须与PROC左边的名字相同。过程名等同于标号,具有标号的全部属性。,过程(子程序)的基本结构,Proc-A PROC NEAR(或FAR) _过程名 _ . . . _ RET Proc-A ENDP,(6) 偏移地址计数器$汇编程序在对源程序进行汇编的过程中,用偏移地址计数器$来保存当前正在汇编的指令的偏移地址或伪指令语句中变量的偏移地址。用户可将$用于自己编写的源程序中。在每个段开始汇编时,汇编程序( 汇编器)都将$清为0,以后,每处理一条指令或一个变量
12、,$就增加一个值,此值为该指令或该变量所占的字节数。可见,$的内容就是当前指令或变量的偏移地址。,在伪指令中,$代表其所在地的偏移地址。例如,如果A的偏移地址是0074H,则语句A DW 1, 2, $+4, 3, 4, $+4 中的第一个$+4的偏移地址为A+4,第二个$+4的偏移地址为A+10。汇编后:第一个$+4:$+4=(A+4)+4=(0074H+4)+4=007CH第二个$+4:$+4=(A+10)+4=(0074H+0AH)+4=0082H,在指令中,$无论出现在指令的任何位置,都代表本条指令第一个字节的偏移地址。例如,“JZ $+6”的转向地址是该指令的首地址加上6,$+6还必
13、须是另一条指令的首地址。再如,在下述指令序列中, DEC CX JZ $+5 MOV AX, 2 LAB: .因为$代表JZ指令的开始地址,而JZ指令占2个字节,这里的MOV 指令占3个字节,所以,在发生转移时,JZ指令会将程序转向LAB标号处的指令, 且标号LAB 可省。,3. 汇编语言的伪操作(运算)符,汇编语言中的操作符号很多,可分为算术操作符、逻辑操作符、关系操作符、重复置数(复制)操作符、取属性(分析)操作符、指定属性(合成)操作符、分离操作符、结构和记录中专用的操作符等几类。这些操作符都是面向汇编程序的,都由汇编程序解释并“执行”,而不是像指令那样由CPU去执行。通常称这些操作符为
14、伪操作符,称对应的操作为伪操作。,(1) 算术伪操作,常见的有+、-、MOD、SHL、SHR、*、/共7个符号,分别表示加、减、取模(求余数)、逻辑左移、逻辑右移、乘、除。这些操作符都可用于数据之间的运算,+、-操作符还可用于地址之间、数据与地址之间的运算。 用于数据之间的运算时,按每个操作符的定义进行。 例如,在字节操作时,“124 MOD 3”的结果为1“10110101B SHL 2”的结果为11010100B,再例如,对如下的定义, W1 DW 1, 2, 3, 4, 5, 6, 7 B1 DB 10, 20, 30, 40, 50 N1 EQU B1-W1 N2 EQU $-W1 B
15、2 DB 0则N1=14,它是从W1开始到B1前为止的一组变量的字节数;N2=19,它是从W1开始到B2($代表的地址)前为止的一组变量的字节数。,(2) 关系伪操作,关系伪操作对两个数据进行比较,有EQ、NE、LT、GT、LE、GE共6个符号,分别表示等于、不等于、小于、大于、小于或等于、大于或等于,操作的结果为逻辑值。若条件满足,则结果为“真”,若条件不满足,则结果为“假”。“真”用-1(n位全1)表示,“假”用0(n位全0)表示。例如,在字操作时: (60H LE 70H) GE (60H LT 30H) = FFFFH GE 0000H = FFFFH。,(3) 逻辑伪操作,有NOT、
16、AND、OR、XOR共4个符号,分别表示非、与、或、异或,可用于对两个(或一个)数据进行操作。例如,在字操作时,1234H OR 2AFEH = 3AFEH, NOT 0F0H = FF0FH;在字节操作时,NOT 0F0H = 0FH。,(4) 重复置数(复制)伪操作,只有DUP一个符号,表示对其后(右边)的数据进行重复设置(复制),使用格式是: 重复次数DUP (初值1, 初值2, )其中,重复次数为无符号整数(165535),初值1、初值2 为变量的初始值。例如,,下面各行的写法都等效: W DW 25,8,2,3,2,3,6,8,2,3,2,3,6 W DW 25,2 DUP(8,2,
17、3,2,3,6) W DW 1 DUP(25),2 DUP(8,2 DUP(2,3),6) W DW 1 DUP(25),2 DUP(1 DUP(8),2 DUP(2,3),1 DUP(6) 第一行的写法将13个变量分为13组,每组重复1次。后三行的写法将13个变量分为两组,第一组将25重复一次,第二组将(8,2,3,2,3,6)重复两次。,无论哪种写法,我们都将第一组变量的重复次数称为W的长度,将W的长度与W的类型之积称为W的大小。此处,W的长度为1,类型为2,大小为2。长度和大小也可看作变量的属性。练习:若定义A DB 1, 2, 5 DUP(0,1,2 DUP(3),则在A的存储区前6个
18、字节单元的数据是 .,(5) 取属性(也称分析)伪操作,取属性伪操作可以取出运算对象的某个属性。常见的有SEG、OFFSET、TYPE、LENGTH、SIZE共5个符号,分别表示取段基值、取偏移地址、取类型、取长度、取大小,操作的结果都是数值常数。格式: SEG 变量名或标号 返回变量或标号所在段的段基值。例如,若A为变量名或标号,则SEG A表示A所在段的段基值。 格式: OFFSET 变量名或标号 返回变量或标号的偏移地址部分。例如,若A为变量名或标号;则OFFSET A表示A的偏移地址部分。,格式: TYPE 变量名或标号 返回变量或标号的类型属性值。格式: LENGTH 变量名 返回变
19、量的长度,即以DUP形式表示的第一组变量被重 复设置的次数。 格式: SIZE 变量名 返回变量的大小,即TYPELENGTH的值。也就是说,SIZE=TYPELENGTH。,关于TYPE、LENGTH和SIZE的含义举例,对于“W1 DW 20 DUP(3, 10 DUP(7)”,则TYPE W1=2,LENGTH W1=20,SIZE W1=40; 对于“W2 DW 8, 20 DUP(3, 10 DUP(7)”,则TYPE W2=2,LENGTH W2=1, SIZE W2=2; 对于“B1 DB 20 DUP(3, 10 DUP(7)”,则TYPE B1=1,LENGTH B1= ,S
20、IZE B1= ; 对于“B2 DB 8, 20 DUP(3, 10 DUP(7)”,则TYPE B2= ,LENGTH B2= , SIZE B2= 。,(6) 指定属性(也称合成)伪操作,指定属性伪操作可用于指定存储器操作数或标号的属性,常见的有PTR、:、THIS共3个符号,其功能分别为: 指定存储器操作数或标号的类型、指定存储器操作数的段归属、指定当地的变量或标号的类型。 格式: 类型名 PTR 存储器操作数或标号 例如,指令“MOVBX, 5”的含义是将常数5送入存储单元BX中 。该存储单元的偏移地址由BX确定,段基值隐含为DS。但汇编程序无法确定常数5是字节还是字,也无法确定存储单
21、元BX的内容是字节还是字,所以无法操作。,格式: 段寄存器名 : 存储器操作数 临时指定存储器操作数的段归属。例如,“MOV AX, ES:BX”表示该存储单元的段基值取自ES,而不是隐含的DS。 格式: THIS 类型名临时指定当前地址处变量或标号的类型。例如,THIS BYTE表示当前地址处变量的类型为字节,THIS FAR表示当前地址处标号的类型为远。THIS操作符会在当前段内产生一个偏移地址与$的值相等的操作数,该操作数的类型由THIS右边的类型名确定。,THIS 可以像PTR一样建立一个指定类型(BYTE,WORD或DWORD)或指定距离(NEAR或FAR)的操作数。该操作数的段地址
22、和偏移地址与下一个存储单元地址相同。THIS 往往和伪指令说明符EQU 连用,为当前存储单元定义一个指定类型的变量或标号,并为下一个能分配存储单元的变量和标号定义新的类型。例如: A EQU THIS BYTE B DD 12345678H就是将一个双字类型变量B临时指定为字节类型变量,它与A 具有相同的段地址和偏移量。,例: . A EQU THIS BYTE B DD 12345678H . CLD MOV SI, OFFSET A LODSB ;AL (DS:SI), SI SI+1 ,DATA SEGMENT A EQU THIS BYTE B DD 12345678HDATA END
23、SCODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX CLD MOV SI, OFFSET A LODSB ;AL (DS:SI), SI SI+1 MOV AX,4C00H INT 21HCODE ENDS END START,又如:START EQU THIS FAR MOV CX ,100 这样,MOV 指令 有一个FAR 属性的地址START,这就允许其他段的JMP 指令直接跳到START来。,(7) 分离操作符,有SHORT、HIGH和LOW三个,其功能是从其后的操作数(或与其后的操作数有关的数据)中分离
24、出一部分内容作为返回值。 格式: SHORT 标号 只取出标号与IP之差(标号-IP)的低字节,即将标号按短(距离)处理。 格式: HIGH 字操作数 从字操作数中分离出高字节。例如,HIGH 1234H的操作结果为12H。 格式: LOW 字操作数 从字操作数中分离出低字节。例如,LOW 1234H的操作结果为34H。,4. 汇编语言的表达式,(1) 表达式及分类用伪操作符将操作对象组合起来即得到表达式,单个操作对象也可称为表达式。表达式可作为指令语句中的操作数或伪指令语句中的参数。按操作性质的不同可将表达式分为四类: 算术表达式 逻辑表达式 关系表达式 特殊表达式,(2) 表达式的操作顺序
25、,表达式中常用的伪操作符按以下顺序依次优先处理: (i)()、 、(ii)LENGTH、WIDTH、SIZE、MASK (iii)(结构字段名操作符) (iv): (段超越前缀的操作符) (v)PTR、OFFSET、SEG、TYPE、THIS (vi)HIGH、LOW (i)+ (正号)、- (负号) (ii)*、/ (iii)MOD、SHL、SHR (iv)+、 - EQ、NE、LT、LE、GT、GE (i) NOT (ii) AND (iii) OR、XOR SHORT 例如,因为“HIGH”运算优先于“+”运算,所以, HIGH 1234H + 2 = 12H + 2 = 14H HIG
26、H (1234H + 2) = HIGH 1236H = 12H,7.1.5 汇编语言的伪指令说明符,1. 数据定义(存储单元分配)数据定义说明符用于定义变量,也就是为变量分配存储单元并可同时预置初始值,有DB、DW、DD、DF、DQ、DT共6种说明符。分别表示存储单元分配时以字节为单位、以字为单位、以双字为单位、以3字(远字)为单位、以4字为单位、以10字节为单位。,例如,在下述定义中, A DB 12H, ? B DW ?, 3456H C DD 789ABCDEH D DB A, B, C, D E DB ABCD F DW AB, CD 上述各变量的存储情况如图7.4所示。显然,DBA
27、B和DWAB的存储情况不同。,A,图7.4 变量在存储器中的存储情况,12,?,?,?,56,34,B,DE,BC,9A,78,C,41,42,43,44,D,41,42,43,44,E,42,41,44,43,F,程序例,DATA SEGMENT TAB DW 1,2,3,4,5,6 ENTRY EQU 3DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATAL: MOV AX, DATA MOV DS, AX MOV BX,OFFSET TAB ADD BX, ENTRY ; MOV AX, TAB+3 MOV AX, BXCODE ENDS END L
28、 上述程序执行后,AX=,2. 符号定义(表达式赋值),有 =、EQU、PURGE共3种说明符,含义分别是被赋予、被赋予、取消(释放)。(1)格式: 符号名 = 表达式将表达式的值赋予符号名,以后即可用该符号名代表此表达式的值。(2) 格式: 符号名 EQU 表达式或另一组标识符将表达式的值或另一组标识符赋予符号名,以后即可用该符号名代表此表达式的值或代替另一组标识符。(3) 格式: PURGE 符号名1,符号名2, 取消(释放)被EQU定义的符号名,以后即可用EQU对该符号名再赋予不同的含义。,3. 段定义,段定义说明符共有3种,即SEGMENT、ENDS和ASSUME,含义分别是段开始、段
29、结束、指定段寄存器。(1) 格式: 段名 SEGMENT定位类型组合类型类别从段名代表的段基值开始定义一个段。其中的定位类型、组合类型和类别一般都可省略,若不省略时各项的顺序不能变。 定位类型: 连接时用于指定该段应开始于什么样的物理地址。可选择下列4种之一: BYTE: 从当前可用的字节地址XXXX XXXX XXXX XXXX XXXX(任一地址)开始;WORD: 从当前可用的字地址XXXX XXXX XXXX XXXX XXX0(偶数地址)开始;PARA(缺省): 从当前可用的节地址XXXX XXXX XXXX XXXX 0000(16的倍数)开始;PAGE: 从当前可用的页地址XXXX
30、 XXXX XXXX 0000 0000(256的倍数)开始。 其中,1节(paragraph) 为16字节,1页为16节即256字节。, 组合类型: 连接时用于指定同名的各段之间的组合方式。可选择下列6种之一:,PUBLIC STACK COMMON MEMORY AT表达式 NONE(缺省)若省略组合类型或说明为NONE类型,则表示各个段不组合,各有自己的段基值。对堆栈段,必须用STACK类型说明,不能省略 。, 类别: 是要将组合后的各段按类别分类存放,同类别的段将被相邻地放在一起。类别是由用户定义的、用一对引号括起来的、长度不超过40个字符的名字(标识符)。 (2)格式: 段名 END
31、S表示该段到此结束。这里的段名必须与该段开始时SEGMENT左边的段名相同。 (3) 格式: ASSUME 段寄存器名1:段名1,段寄存器名2:段名2, 该语句必须出现在有关的变量及标号使用之前,用于指定某段(用段名标识)中的变量、标号等数据项由哪个段寄存器寻址。,4. 指定段内的偏移地址,常用的有ORG和EVEN两种说明符,是指定下一个要用的存储单元的偏移地址。(1)格式: ORG 常数表达式指定当前可用的存储单元的偏移地址为常数表达式的值,就是将常数表达式的值送入$。(2) 格式: EVEN将当前可用的存储单元的偏移地址调整为最近的偶数值,就是将当前可用的最小偶数偏移地址值送入$。,例如,
32、在下述伪指令语句序列中, ORG 1000H A DB 47H, 12H, 45H EVEN B DB 47H ORG 1000H 将A的偏移地址部分指定为1000H,从A开始存放3个字节变量,占用地址1000H、1001H和1002H,B的偏移地址部分本应是1003H,但EVEN指令会将B的偏移地址部分调整为偶数地址1004H。,对于字数组,为保证其从偶地址开始,可在它前面用EVEN 伪操作来达到这一目的,形如: DATA-SEG SEGMENT EVEN WORD-ARRAY DW 100 DUP(?) DATA-SEG ENDS,5. 过程定义,有PROC、ENDP两种说明符,含义分别是
33、过程开始与过程结束,必须成对出现。(1)格式: 过程名 PROC 类型属性名从过程名代表的地址开始定义一个过程,其中的类型属性名可选择NEAR或FAR两种之一,前者表示该过程为近过程,后者表示该过程为远过程。如果不给出类型属性名或给出NEAR,则视为近过程。(2)格式: 过程名 ENDP表示该过程到此结束。这里的过程名必须与过程开始时PROC左边的过程名相同。,过程(子程序)的基本结构,Proc-A PROC NEAR(或FAR) _过程名 _ . . . _ RET Proc-A ENDP,6. 类型定义,类型定义说明符只有一个,即LABEL,可用来给当前地址处的变量或标号取一个别名,并赋予
34、另一种类型属性。格式: 变量名或标号 LABEL 类型属性名“LABEL”和“EQU THIS”的作用类似,7.宏定义、宏调用和宏扩展,宏(MACRO)是源程序中一段有独立功能的程序代码、它只需在源程序中定义一次,就可以多次用一条宏指令来调用它。宏定义是用伪指令来实现的。其格式为:,其中MACRO和ENDM是一对伪指令说明符,这对伪指令之间是宏定义体一组有独立功能的程序代码,Macro-name,经宏定义定义后的宏指令就可以在源程序中调用,这种对宏指令的调用称宏调用,宏调用的格式为:Macro-name actual parameter list(每一项之间用逗号隔开)当源程序被汇编时,汇编程
35、序将对每个宏调用作宏展开。宏展开就是用宏定义体取代源程序中的宏指令名,而且用实在参数一一取代宏定义的形式参数。,例1. 宏定义可以无变元宏定义:SAVEREG MACRO PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI ENDM宏调用: SAVEREG宏展开: 将宏定义体的内容(具有独立功能的代码段)全部列出。,宏定义开始,宏定义体,宏定义结束,宏指令,例2 宏定义带形式参数宏定义: FOO MACRO P1, P2, P3 MOV AX, P1 P2 P3 ENDM宏调用: FOO WORD_VAR, INC, AX宏展开: MOV AX, W
36、ORD_VAR INC AX,子程序调用和宏调用工作方式的区别,子程序调用工作方式:,XA,yB,CALL Q,xC,yD,CALL Q,主程序,Q: . . . RET,子程序Q(x,y),执行时调用,宏调用工作方式:,Q A,B,Q C,D,主程序,汇编时展开,Q(A,B),Q(C,D),Q MACRO x,y,ENDM,子程序调用和宏调用工作方式的区别,1. 在处理时间上不同。2. 用宏指令得到的目标代码长,占内存空间大,而且宏调用的次数越多,所占内存空间越大;用子程序占内存空间小,而且不会随调用次数的增加而增加,但执行时间长。3. 传递参数的方式不同。,7.1.3 汇编语言程序的开发,
37、汇编语言程序的建立及汇编过程,汇编示意图,汇编程序的主要功能,汇编程序分两种:一种是基本汇编(ASM.EXE);一种是宏汇编(MASM.EXE),宏汇编功能比较强。,检查源程序;测出源程序中的语法错误,并给出出错信息;产生目标文件(.OBJ),并可给出列表文件(同时列出汇编语言源程序和机器语言目标程序的文件,称之为.LST文件)和交叉索引文件(列出程序中使用的符号、变量和标号以及引用情况,称之为.CRF文件)。展开宏指令。,连接程序,汇编之后生成的OBJ文件必须经过链接过程,才能成为扩展名.EXE的可执行文件。链接的过程就是调用连接程序(LINK.EXE),对OBJ文件进行定位、链接,最后生成
38、扩展名为EXE的可执行文件。如果需要,也可生成MAP文件和LIB文件。,连接示意图:,调试程序(DEBUG.COM),DEBUG PROG.EXE - U (反汇编)- g =起始地址 断点地址- T = 地址 指令条数,汇编语言程序开发中的相关文件,Handwritten source program,EDIT Editor program,MASM assembler program,LINK linker program,DEBUG debug program,Final debugged run module,PROG1.LST,PROG1.OBJ,PROG1.CRF,Other.OBJ files,Libraries,BIOS和DOS中断,ROM BIOS(Basic Input Output System)装于从地址0FE00H开始的8k ROM中,提供了系统加电自检,引导装入,主要I/O设备的处理程序及接口控制等功能模块。使用BIOS功能调用,使程序员不必了解硬件I/O的具体接口特性,可直接通过入口参数来调用,给编程带来方便。,调用格式:,设置入口参数;设置功能号;INT XXH;例: MOV CX,0; MOV DX,0; MOV AH,1; 功能号为1 INT 1AH;,