




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、返回主目录返回主目录 通过前面的学习我们知道,通过前面的学习我们知道,计算机之所以计算机之所以能够自动地工作,是因为计算机能按照程序的能够自动地工作,是因为计算机能按照程序的安排执行相应的指令,编写这些程序的语言安排执行相应的指令,编写这些程序的语言就就称为称为。计算机语言按照人类的语言。计算机语言按照人类的语言习惯通常分为习惯通常分为、和和,与人类自然语言相差较大、接近于机器描述的与人类自然语言相差较大、接近于机器描述的计算机语言称为低级语言,低级语言包括机器计算机语言称为低级语言,低级语言包括机器语言和汇编语言。本章主要介绍和计算机硬件语言和汇编语言。本章主要介绍和计算机硬件系统紧密相关的
2、汇编语言程序设计。系统紧密相关的汇编语言程序设计。5.1汇编语言基础5.2汇编语言程序结构5.3汇编语言程序设计小结第第5 5章章 汇编语言程序设计基础汇编语言程序设计基础 在计算机内部,控制计算机工作的指令都以在计算机内部,控制计算机工作的指令都以的形式出现,这样的指令称为机器指令,用机器指令编写的形式出现,这样的指令称为机器指令,用机器指令编写的程序称为的程序称为。可见,机器语言是二进制编码。可见,机器语言是二进制编码表示的命令和数据的总称,是面向机器的,能够被计算机表示的命令和数据的总称,是面向机器的,能够被计算机直接识别和执行的。然而,二进制表述的机器语言既不直直接识别和执行的。然而,
3、二进制表述的机器语言既不直观,又不便于记忆、阅读和书写,为了程序设计的方便,观,又不便于记忆、阅读和书写,为了程序设计的方便,产生了汇编语言。产生了汇编语言。,用与操作功,用与操作功能含义相应的能含义相应的作为编程使用作为编程使用的语言,来表示二进制格式的的语言,来表示二进制格式的和和。计算。计算机在运行汇编语言程序之前要先将其转换成机器代码,才机在运行汇编语言程序之前要先将其转换成机器代码,才能由计算机识别执行,转换的过程是由编译程序来完成。能由计算机识别执行,转换的过程是由编译程序来完成。5.1 5.1 汇编语言基础汇编语言基础5.1.1 汇编语言概述汇编语言概述 是一个可选字段,由字母(
4、是一个可选字段,由字母(A Z、a z)数)数字(字(0 9)及专用字符(?、)及专用字符(?、.、-、$)组成的字)组成的字符串,最长不超过符串,最长不超过31个字符,要求必须以字母开头,个字符,要求必须以字母开头,用冒号与操作项分开用冒号与操作项分开。标号实质上是。标号实质上是,但并不是所有指令语句都有标号。但并不是所有指令语句都有标号。,如程序,如程序中的中的JMP指令和指令和CALL指令的转移目标由标号指定,即指令的转移目标由标号指定,即JMP指令和指令和CALL指令是根据指令是根据来确定它们之后要执来确定它们之后要执行的语句,可见标号其实是指定了具体的指令地址,行的语句,可见标号其实
5、是指定了具体的指令地址,所以相同的标号定义在同一程序中只允许出现一次。所以相同的标号定义在同一程序中只允许出现一次。 标号有三种属性:标号有三种属性:、和和。标号的段属。标号的段属性是定义标号的程序段的段基值性是定义标号的程序段的段基值;标号的偏移量属性是标号的偏移量属性是表示该标号在段内的偏移地址,偏移量是一个表示该标号在段内的偏移地址,偏移量是一个16位的位的无符号数无符号数;标号的类型属性有标号的类型属性有NEAR和和FAR两种,两种,NEAR只能提供同一段内的指令调用,只能提供同一段内的指令调用,FAR可以被其可以被其他段指令调用。他段指令调用。 是汇编语言程序中不可省略的主要部分,用
6、是汇编语言程序中不可省略的主要部分,用指令助记符或定义符表示的机器指令操作码,如:指令助记符或定义符表示的机器指令操作码,如:MOV、ADD等,它告诉等,它告诉CPU要完成什么具体操作。有的操作项要完成什么具体操作。有的操作项带有前缀,指令系统中允许与指令助记符一起出现的前带有前缀,指令系统中允许与指令助记符一起出现的前缀是缀是和和。 紧跟在操作项之后,具体指明操作项的指令紧跟在操作项之后,具体指明操作项的指令对哪些对哪些或或进行操作,它可以包含两个操作数、进行操作,它可以包含两个操作数、一个操作数或无操作数。如:一个操作数或无操作数。如:MOV、ADD等指令要求有等指令要求有两个操作数,它们
7、之间用两个操作数,它们之间用;NEG、INC等指令只等指令只需要一个操作数需要一个操作数;而而CLC等指令就不需要操作数,因为操等指令就不需要操作数,因为操作数已隐含在指令助记符中了。操作数可以是作数已隐含在指令助记符中了。操作数可以是,也,也可以是可以是,所以可以作为操作数的有:,所以可以作为操作数的有:。 常量是指令中的固定值,它们在程序运常量是指令中的固定值,它们在程序运行期间不发生变化,它可以分为行期间不发生变化,它可以分为和和。例如:立即数寻址时的立即数。例如:立即数寻址时的立即数;直接寻址时的地直接寻址时的地址址;ASCII码字符串等都属于常量。在汇编语言源程序码字符串等都属于常量
8、。在汇编语言源程序中,数值常量可以用中,数值常量可以用来表示,但要用不同的后缀加以来表示,但要用不同的后缀加以区别。要注意的是,区别。要注意的是,汇编语言要求数值常量的第一位汇编语言要求数值常量的第一位必须是数字,如:必须是数字,如:FFFFH应写成应写成0FFFFH,否则汇编,否则汇编时会被误作为标号处理。时会被误作为标号处理。 变量是指存放在变量是指存放在或或中的数中的数据,这些数据随着程序运行可能随时会发生变化。寄据,这些数据随着程序运行可能随时会发生变化。寄存器有固定的名字,如:存器有固定的名字,如:AL、AX等等;存储器常以其地存储器常以其地址或地址表达式的形式出现。应该指出,变量也
9、有址或地址表达式的形式出现。应该指出,变量也有三个属性。三个属性。 表达式是操作数最常见的形式,其值表达式是操作数最常见的形式,其值由由通过运算符连接,在汇编时计算通过运算符连接,在汇编时计算确定。汇编语言中运算符分为:算术运算符、逻辑运确定。汇编语言中运算符分为:算术运算符、逻辑运算符、关系运算符、分析运算符和属性修改运算符等。算符、关系运算符、分析运算符和属性修改运算符等。 :常用的算术运算符有:加(:常用的算术运算符有:加(+)、减)、减(-)、乘()、乘()、除()、除(/)和模()和模(MOD)等,算术运)等,算术运算的算的结果是一个结果是一个,对于表示存储器地址的地址表,对于表示存
10、储器地址的地址表达式加和减运算才有意义。例如:达式加和减运算才有意义。例如: MOV AX,VARX+2 表示将表示将VARX表示的地址加表示的地址加2后后送送AX。 :逻辑运算符包括:逻辑运算符包括:AND(逻辑(逻辑“与与”)、)、OR(逻辑(逻辑“或或”)、)、XOR(逻辑(逻辑“异或异或”)、)、NOT(逻辑(逻辑“非非”),用于数值表达式中对数值进行按),用于数值表达式中对数值进行按位逻辑运算,结果也是一个数值。例如:位逻辑运算,结果也是一个数值。例如:MOV AL,0FH AND 35H 表示将表示将0FH与与35H按位逻辑按位逻辑“与与”后得到的数值(后得到的数值(05H)送送A
11、L。 注意:逻辑运算符注意:逻辑运算符AND、OR、XOR、NOT同时也是同时也是指令助记符,指令助记符,;作为作为指令助记符时是在指令助记符时是在用作计算的。例如:用作计算的。例如: AND AX,VARTB AND 8000H 表示将表示将VARTB表示的地址与表示的地址与8000H按位逻辑按位逻辑“与与”后,后,对应的存储单元内的数据再与对应的存储单元内的数据再与AX内的数据进行逻辑内的数据进行逻辑“与与”。可见,在汇编时计算。可见,在汇编时计算VARTB AND 8000H,得,得到的数值作为程序的一个操作数到的数值作为程序的一个操作数;执行程序时计算第一个执行程序时计算第一个AND,
12、将前面得到的操作数与,将前面得到的操作数与AX内的数据进行内的数据进行“与与”运运算,结果送算,结果送AX。 :关系运算符有:关系运算符有、。关系运算符必须有。关系运算符必须有,而且,而且必须是必须是两个数值两个数值或是或是。关系运算符。关系运算符只能有两个结果只能有两个结果“0”或或“1”,关系成立时运算结果为,关系成立时运算结果为0FFFFH,关系不成立时运算结果为,关系不成立时运算结果为0。要注意的是,。要注意的是,关系运算符一般不单独使用,常与其他运算符结合起关系运算符一般不单独使用,常与其他运算符结合起来使用。例如:来使用。例如: MOV AX, 4 NE 3 表示将表示将4和和3进
13、行是否不相等的判断,结果送进行是否不相等的判断,结果送AX。这。这里由于里由于4不等于不等于3,所以该关系运算结果应为,所以该关系运算结果应为0FFFFH,并送寄存器并送寄存器AX。 :分析操作符包括:分析操作符包括OFFSET、SEG、TYPE、SIZE和和LENGTH,它们的作用是把一个存储单,它们的作用是把一个存储单元地址元地址分解为分解为和和。 1)OFFSET 表示取标号或变量地址的偏移量,例如:表示取标号或变量地址的偏移量,例如:MOV DX,OFFSET STRING 表示将表示将STRING的偏移地址送的偏移地址送DX寄存器,属于立即数寄存器,属于立即数寻址方式。寻址方式。 2
14、)SEG 表示取标号或变量的段地址。例如:表示取标号或变量的段地址。例如: MOV BX,SEG TABLE1 表示将表示将TABLE1的段地址送的段地址送BX寄存器。寄存器。 3)TYPE 运算结果是一个数值,表示存储单元操作数运算结果是一个数值,表示存储单元操作数的类型。运算结果与操作数类型的对应关系见表的类型。运算结果与操作数类型的对应关系见表51。 例如:例如: VAR DW 1234H ARRAY DB 56H MOV AX,TYPE VAR MOV BX,TYPE ARRAY 上例中前两句伪指令定义了变量上例中前两句伪指令定义了变量VAR的类型为字,的类型为字,变量变量ARRAY的
15、类型为字节,后两句将的类型为字节,后两句将VAR、ARRAY的类型对应数值送寄存器的类型对应数值送寄存器AX、BX,即执行,即执行TYPE后后AX的值应为的值应为2,BX的值应为的值应为1。表表51 TYPE运算结果与操作数类型的对应关系运算结果与操作数类型的对应关系TYPETYPE运算结果运算结果 操作数类型操作数类型 TYPETYPE运算结果运算结果 操作数类型操作数类型1 1BYTE ( DB )BYTE ( DB )-1-1NEARNEAR2 2WORD( DW )WORD( DW )-2-2FARFAR4 4DWORD( DD )DWORD( DD ) 4) LENGTH 一般加在数
16、组变量的前面,作用是计一般加在数组变量的前面,作用是计算数组变量占存储单元的个数。若使用算数组变量占存储单元的个数。若使用DUP,则执行,则执行结果是外层结果是外层DUP的给定值的给定值;若没有使用若没有使用DUP,则执行结,则执行结果为果为1。例如:。例如: D1 DB 10 DUP ( 0FH ) D2 DB ABCDEFGHIJK MOV BH,LENGTH D1 MOV BL,LENGTH D2 前两句伪指令定义变量前两句伪指令定义变量D1、D2的类型为字节,重复的类型为字节,重复操作符操作符DUP表示从表示从D1开始连续设定开始连续设定10个字节的空间,个字节的空间,且将内容设定为且
17、将内容设定为0FH。后两句执行了。后两句执行了LENGTH运算后,运算后,结果分别为结果分别为10和和1,即执行,即执行LENGTH后将后将10送送BH,将将1送送BL。(5)SIZE格式:格式:SIZE variable汇编程序回送分配给该变量的字节数。值是汇编程序回送分配给该变量的字节数。值是LENGTH值和值和TYPE值的乘积。值的乘积。例:例:FEES DW 100 DUP(0) ;分配给分配给FEES 100个单元个单元MOV CX,SIZE FEES汇编程序将使其形成为汇编程序将使其形成为 : MOV CX,200 :属性修改运算符属性修改运算符有有PTR、THIS和和SHORT,
18、用于指定或修改变量、标,用于指定或修改变量、标号和存储器操作数的类型属性,也称综合运算符。号和存储器操作数的类型属性,也称综合运算符。 1)PTR 用于指定或修改存储单元操作数的类型。用于指定或修改存储单元操作数的类型。例如:例如: MOV WORD PTR 5000H, 8 执行执行PTR后指定存储单元后指定存储单元5000H为一个字单元,上为一个字单元,上面的语句是将数值面的语句是将数值8送地址为送地址为5000H的存储单元,存的存储单元,存储单元类型为字,因此执行语句后,储单元类型为字,因此执行语句后,5000H存储单存储单元的内容为元的内容为08H,5001H存储单元的内容为存储单元的
19、内容为00H。注。注意,意,。 2)THIS 也是用来也是用来指定或修改存储单元的类型指定或修改存储单元的类型。与与PTR不同的是,该运算建立指定类型的地址操作不同的是,该运算建立指定类型的地址操作数,其段地址和偏移量与下一个存储单元地址相同,数,其段地址和偏移量与下一个存储单元地址相同,因此因此THIS运算符更具有灵活性。例如:运算符更具有灵活性。例如: BEGIN EQU THIS FAR PUSH AX 上述语句是使上述语句是使PUSH AX指令有一个具备指令有一个具备FAR属性属性的地址的地址BEGIN,使得标号,使得标号BEGIN可以被其他段的可以被其他段的JMP指令直接调用。指令直
20、接调用。 3)SHORT 用于指定某个标号的类型为用于指定某个标号的类型为“短标号短标号”, : 1)冒号)冒号 一般跟在段寄存器名之后,用于给存储单元一般跟在段寄存器名之后,用于给存储单元操作数指定段属性,不必考虑存储单元原来的隐含属性。操作数指定段属性,不必考虑存储单元原来的隐含属性。例如:例如:MOV AX,ES: DI 冒号跟在段寄存器冒号跟在段寄存器ES之后,表示段寄存器的偏移地之后,表示段寄存器的偏移地址由址由DI指定。指定。 2)字节分离运算符)字节分离运算符LOW和和HIGH 用于获得一个数值或表用于获得一个数值或表达式的低位或高位字节。例如:达式的低位或高位字节。例如: DA
21、TAX EQU 1234H MOV AL,LOW DATAX MOV AH,HIGH DATAX 上述程序中,第一句定义上述程序中,第一句定义DATAX等于等于1234H;第二句第二句执行执行LOW表示取表示取DATAX的低位,即将的低位,即将34H送送AL;第三句第三句执行执行HIGH表示取表示取DATAX的高位,即将的高位,即将12H送送AH。 需要注意的是:需要注意的是:在表达式中可能出现各种运算的运在表达式中可能出现各种运算的运算符,汇编时都将运算出它们的具体的结果算符,汇编时都将运算出它们的具体的结果,汇编程,汇编程序的这个运算过程将按照它们的优先级别进行运算,序的这个运算过程将按照
22、它们的优先级别进行运算,运算规则是:运算规则是: 各种运算符的优先级别见表各种运算符的优先级别见表52,为,为1的优先级别最的优先级别最高,为高,为11的优先级别最低。的优先级别最低。优先级别优先级别 运算符运算符优先级别优先级别 运算符运算符 1 1LENGTH, SIZE, ( ), LENGTH, SIZE, ( ), 7 7EQ, NE, LT, LE, GT, GEEQ, NE, LT, LE, GT, GE2 2: :8 8NOTNOT3 3PTR, OFFSET, SEG, TYPE, THISPTR, OFFSET, SEG, TYPE, THIS9 9ANDAND4 4HIG
23、H, LOWHIGH, LOW1010OR, XOROR, XOR5 5* *, /, MOD, SHL, SHR, /, MOD, SHL, SHR1111SHORTSHORT6 6+, -+, -表表52 运算符的优先级别运算符的优先级别 注释也是一个任选项,跟在汇编语句之后,以分号注释也是一个任选项,跟在汇编语句之后,以分号“;”开始,注释内容并不出现在汇编后的机器代码中,开始,注释内容并不出现在汇编后的机器代码中,也不影响汇编程序的功能。一段完整的程序中,注释也不影响汇编程序的功能。一段完整的程序中,注释是很重要的部分,它用于说明一条指令或一段程序的是很重要的部分,它用于说明一条指令或
24、一段程序的功能,阐述程序的思路,使程序容易阅读,特别在模功能,阐述程序的思路,使程序容易阅读,特别在模块化程序设计中可通过注释将各模块的功能描述出来,块化程序设计中可通过注释将各模块的功能描述出来,大大加强了程序的可读性。大大加强了程序的可读性。4、注释、注释返回本章目录返回本章目录 汇编语言源程序采用汇编语言源程序采用,一个汇编,一个汇编语言源程序由若干个逻辑段组成,每个逻辑段以语言源程序由若干个逻辑段组成,每个逻辑段以SEGMENT语句开始,以语句开始,以ENDS语句结束,语句结束,。而逻辑段包括。而逻辑段包括数据段数据段、堆堆栈段栈段、代码段代码段及及附加段附加段,要注意任何一个源程序,
25、要注意任何一个源程序至少必须有一个代码段和一条作为源程序文件结至少必须有一个代码段和一条作为源程序文件结束的伪指令束的伪指令END,END后面的标号后面的标号START表示该表示该程序执行时的启动地址。下面给出一个简单的汇程序执行时的启动地址。下面给出一个简单的汇编语言源程序,以便对汇编语言源程序的格式结编语言源程序,以便对汇编语言源程序的格式结构有一个大概的了解。构有一个大概的了解。5.2 5.2 汇编语言程序结构汇编语言程序结构5.2.1 源程序源程序 DATA SEGMENT ;定义一个名字为定义一个名字为DATA的段的段 HELLO DB HELLO WORLD1$ ;在在 DATA
26、段内定义一个字符串变量,并赋值段内定义一个字符串变量,并赋值 DATA ENDS ;DATA段结束段结束 CODE SEGMENT ;定义一个名字为定义一个名字为 CODE的程序代码段的程序代码段 ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX ;给给DS赋初值赋初值 MOV DX,OFFSET HELLO ;取字符串取字符串 变量的偏移量变量的偏移量 MOV AH,9 ;置字符串显示功能号置字符串显示功能号 INT 21H ;DOS功能调用功能调用 MOV DL,ODH ;送回车符送回车符 MOV AH,2 ;置置ASCII码显示功能号码
27、显示功能号 INT 21H MOV DL,OAH ;送换行符送换行符 MOV AH,2 INT 21H MOV AH,4CH INT 21H ;返回操作系统返回操作系统 CODE ENDS ;代码段结束代码段结束 END START ;源程序结束源程序结束 从上面的汇编语言源程序可以看出,一个汇编语言源程从上面的汇编语言源程序可以看出,一个汇编语言源程序一般总由若干段组成,这里第一段为数据段序一般总由若干段组成,这里第一段为数据段DATA,它,它在存储器中存放用于显示输出的数据在存储器中存放用于显示输出的数据;第二段为代码段第二段为代码段CODE,它包括了许多以符号表示的指令,用于实现数据,它
28、包括了许多以符号表示的指令,用于实现数据的输出。的输出。程序运行时,在汇编语言源程序中除了执行上程序运行时,在汇编语言源程序中除了执行上一章中介绍的指令外,还要执行一章中介绍的指令外,还要执行和和。伪指令又称伪操作,汇编程序对源程序汇编时,伪指令又称伪操作,汇编程序对源程序汇编时,5.2.2 伪指令伪指令数据定义伪指令用于定义变量的类型、给存储器赋初数据定义伪指令用于定义变量的类型、给存储器赋初值或给变量分配存储单元。常用的数据定义伪指令有值或给变量分配存储单元。常用的数据定义伪指令有DB、DW、DD等。一般格式为:等。一般格式为: 标号标号 伪指令助记符伪指令助记符 数据表达式数据表达式 方
29、括号中的标号为任选项,通常使用方括号中的标号为任选项,通常使用表示。数表示。数据表达式可以包含多个数据,它们之间用逗号分隔开。数据表达式可以包含多个数据,它们之间用逗号分隔开。数据定义伪指令助记符有以下三种:据定义伪指令助记符有以下三种:DB 定义变量类型为字节(定义变量类型为字节(BYTE),),DB后面的每个后面的每个操作数占一个字节单元。操作数占一个字节单元。DW 定义变量类型为字(定义变量类型为字(WORD),),DW后面的每个后面的每个操作数占一个字单元,即两个字节单元。在内存中,低字操作数占一个字单元,即两个字节单元。在内存中,低字节在前,高字节在后。节在前,高字节在后。DD 定义
30、变量类型为双字(定义变量类型为双字(DWORD),),DD后面的每后面的每个操作数占两个字单元,即四个字节单元。在内存中,低个操作数占两个字单元,即四个字节单元。在内存中,低位字在前,高位字在后。位字在前,高位字在后。1、数据定义伪指令、数据定义伪指令 这些数据定义伪操作可以把数据项存入指定的存储单元,这些数据定义伪操作可以把数据项存入指定的存储单元,或分配存储单元空间。例如:或分配存储单元空间。例如: R1 DB 0DH;定义定义R1单元的数值为单元的数值为0DH R2 DB ? ;定义定义R2单元预留一个字节的存储空间单元预留一个字节的存储空间 R3 DB 1,2,3 ;定义定义R3开始的
31、开始的3个单元的数值为个单元的数值为 01H,02H,03H R4 DW 5 DUP (?) ;定义定义R4预留预留5个字的存储空间个字的存储空间 R5 DB GOOD! ;定义定义R5为字符串,其存储单元为字符串,其存储单元 数值为数值为47H,4FH,4FH,44H, ;21H 上例说明,数据表达式除了可以是二进制、十进制、十六上例说明,数据表达式除了可以是二进制、十进制、十六进制的常数,也可以是表达式及字符串,还可以是进制的常数,也可以是表达式及字符串,还可以是问号问号“?”,它仅给变量保留相应的存储单元,而不给变量赋初,它仅给变量保留相应的存储单元,而不给变量赋初值。当相同的操作数重复
32、出现或要保留多个存储单元时,可值。当相同的操作数重复出现或要保留多个存储单元时,可用重复操作符号用重复操作符号DUP表示,重复次数由表示,重复次数由DUP之前的数字决定。之前的数字决定。经过汇编伪指令,数据在存储单元中的分配如图经过汇编伪指令,数据在存储单元中的分配如图5-1所示。所示。R1 ODHR2 R3 01H 02H 03H R4R5 47H4FH4FH44H21H保留保留5个个字的存储字的存储空间,即空间,即10个字节个字节图图5-1 伪指令执行后数据区的分配情况伪指令执行后数据区的分配情况 由图由图5-1可见,存储单元中的数据均由补可见,存储单元中的数据均由补码表示码表示;对于多字
33、节的数据分配,高字节存对于多字节的数据分配,高字节存放在高地址单元,低字节存放在低地址单元放在高地址单元,低字节存放在低地址单元;对于字符串存储单元存放的是相应的对于字符串存储单元存放的是相应的ASCII码码;对于变量或标号存储单元存放的是相应对于变量或标号存储单元存放的是相应的地址偏移量。的地址偏移量。 另外,在伪指令中还可以对重复子句进行另外,在伪指令中还可以对重复子句进行嵌套,例如:嵌套,例如:BUFFER DB 2,2 DUP (1,2 DUP (2,3) 该伪指令汇编后的数据分配情况如图该伪指令汇编后的数据分配情况如图52所示。所示。03H BUFFER 02H01H02H03H02
34、H01H02H03H02H03H图图5-2 伪指令执行后伪指令执行后数据区的分配情况数据区的分配情况 这里的符号是指这里的符号是指变量名、标号名、过程名、指令助记符变量名、标号名、过程名、指令助记符和寄存器名和寄存器名,符号定义伪指令用于给一个符号重新命名或定符号定义伪指令用于给一个符号重新命名或定义新的类型属性义新的类型属性。 (1)EQU伪指令伪指令 EQU伪指令将伪指令将赋予一个赋予一个名字,这是一个等值语句。定义以后可以用这个名字来代替名字,这是一个等值语句。定义以后可以用这个名字来代替对应的表达式。表达式可以是一个常数、符号、数值、表达对应的表达式。表达式可以是一个常数、符号、数值、
35、表达式或地址表达式,式或地址表达式,EQU伪指令的格式如下:伪指令的格式如下: 名字名字 EQU 表达式表达式2、符号定义伪指令、符号定义伪指令 EQU伪指令可以使程序更加简练。伪指令可以使程序更加简练。如果源程序中需要如果源程序中需要多次引用某个表达式,可以用一个比较简短的名字通过多次引用某个表达式,可以用一个比较简短的名字通过EQU伪指令来代表这个表达式伪指令来代表这个表达式。如果将来需要修改表达式,。如果将来需要修改表达式,只需修改只需修改EQU语句中的表达式,而不必修改多处,便于程语句中的表达式,而不必修改多处,便于程序的维护。需要注意的是,序的维护。需要注意的是,。例如:。例如: F
36、IVE EQU 5 ;FIVE赋值为赋值为5 NINE EQU FIVE+4 ;NINE定义为数值表达式,其定义为数值表达式,其 值为值为9 REGS EQU SI ;指定寄存器指定寄存器SI的名字为的名字为REGS ADDR EQU TABLE ;将标号将标号TABLE赋值到赋值到ADDR (2)等号()等号(=)伪指令)伪指令 等号(等号(=)伪指令的功能与)伪指令的功能与EQU伪伪 指令相仿,区别在于它可以对同一个名字重复定义。其伪指令指令相仿,区别在于它可以对同一个名字重复定义。其伪指令格式如下:格式如下: 名字名字 = 表达式表达式 利用等号(利用等号(=)伪指令可以使程序设计更加灵
37、活。例如:)伪指令可以使程序设计更加灵活。例如: TABLE = 1 MOV AX,TABLE RRRR: ADD AX,1 TABLE = TABLE+1 MOV AX,TABLE CMP AX,100 JNE RRRR 上例中,标号上例中,标号TABLE被定义了不止一次,每循环一次它的数值被定义了不止一次,每循环一次它的数值都会变化。都会变化。 段定义伪指令在汇编语言源程序中定义逻辑段,提供了段定义伪指令在汇编语言源程序中定义逻辑段,提供了构造程序的手段。常用的段定义伪指令有构造程序的手段。常用的段定义伪指令有ASSUME、SEGMENT和和ENDS等。等。 (1)SEGMENT和和END
38、S 用用SEGMENT和和ENDS伪指令伪指令可以将程序分成多个段,用于定义一个逻辑段,给逻辑段可以将程序分成多个段,用于定义一个逻辑段,给逻辑段赋予一个段名,并在后面的任选项中给出这个逻辑段的其赋予一个段名,并在后面的任选项中给出这个逻辑段的其他特性,如定义类型、组合类型和类别。其伪指令格式如他特性,如定义类型、组合类型和类别。其伪指令格式如下:下: 段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别类别 (段定义体)(段定义体) 段名段名 ENDS3、段定义伪指令、段定义伪指令 SEGMENT伪指令定义一个逻辑段的开始,伪指令定义一个逻辑段的开始,ENDS伪指令伪指令则表示
39、一个逻辑段的结束,这两个伪指令总是成对出现。前则表示一个逻辑段的结束,这两个伪指令总是成对出现。前面的段名是该逻辑段的标识符,是用来确定该逻辑段在存储面的段名是该逻辑段的标识符,是用来确定该逻辑段在存储器中的首地址的,不可缺省,而且必须一致。两个伪指令语器中的首地址的,不可缺省,而且必须一致。两个伪指令语句之间的部分是逻辑段的内容,汇编语言的逻辑段包括代码句之间的部分是逻辑段的内容,汇编语言的逻辑段包括代码段、数据段和堆栈段等,代码段主要包含程序指令和某些伪段、数据段和堆栈段等,代码段主要包含程序指令和某些伪指令指令;数据段用于定义数据和存储单元数据段用于定义数据和存储单元;堆栈段主要为堆栈操
40、堆栈段主要为堆栈操作预留出存储空间。作预留出存储空间。 SEGMENT伪指令后面可以有三个任选项伪指令后面可以有三个任选项 “定位类型定位类型”、“组合类型组合类型”、“类别类别”,它们用来指示汇编程序和连接程,它们用来指示汇编程序和连接程序,如何确定段的边界,如何进行段的组合,以及控制段的序,如何确定段的边界,如何进行段的组合,以及控制段的装入顺序。在简单汇编语言源程序中一般选用缺省方式,常装入顺序。在简单汇编语言源程序中一般选用缺省方式,常用于多模块的程序设计中。如果出现,三者的顺序必须符合用于多模块的程序设计中。如果出现,三者的顺序必须符合格式中的规定,不能颠倒。格式中的规定,不能颠倒。
41、 1)定位类型:定位类型:定位类型任选项是告诉汇编程序如何确定位类型任选项是告诉汇编程序如何确定逻辑段的边界在存储器中的开始位置,定位类型有四种:定逻辑段的边界在存储器中的开始位置,定位类型有四种: BYTE:表示逻辑段边界可以从任何一个字节开始,段:表示逻辑段边界可以从任何一个字节开始,段与段之间无空隙。这样,该逻辑段可以紧接在前一个逻辑段与段之间无空隙。这样,该逻辑段可以紧接在前一个逻辑段的后面。的后面。 WORD:表示逻辑段边界从字地址开始,段与段之间:表示逻辑段边界从字地址开始,段与段之间的空隙最多只有一个字节。这样该逻辑段的起始地址必须是的空隙最多只有一个字节。这样该逻辑段的起始地址
42、必须是偶数。偶数。 PARA:表示逻辑段边界从节地址开始,:表示逻辑段边界从节地址开始,16个字节称为个字节称为一个节。段地址为一个节。段地址为16的倍数,即的倍数,即XXX0H,这样段与段之间,这样段与段之间空隙最多为空隙最多为15个字节。如果省略定位类型选项,汇编语言个字节。如果省略定位类型选项,汇编语言程序默认该逻辑段为程序默认该逻辑段为PARA。 PAGE:表示逻辑段边界地址从页边界开始。:表示逻辑段边界地址从页边界开始。256个字个字节成为一个页,则段地址为节成为一个页,则段地址为256的倍数,即的倍数,即XX00H,这样段,这样段与段之间空隙最多为与段之间空隙最多为255个字节。个
43、字节。 2)组合类型:组合类型:SEGMENT伪指令的第二个任选项是组伪指令的第二个任选项是组合类型,在满足定位类型的前提下,它告诉连接程序,装合类型,在满足定位类型的前提下,它告诉连接程序,装入存储器时各个逻辑段如何进行组合。组合类型有入存储器时各个逻辑段如何进行组合。组合类型有6种。种。 NONE:此项为不组合,是组合类型的缺省选择,此:此项为不组合,是组合类型的缺省选择,此时连接程序认为这个逻辑段是不组合的,即使两个段有相时连接程序认为这个逻辑段是不组合的,即使两个段有相同的类别名,也作为不同的逻辑段分别装入内存。同的类别名,也作为不同的逻辑段分别装入内存。 PUBLIC:汇编程序连接时
44、,对于不同程序模块中的逻:汇编程序连接时,对于不同程序模块中的逻辑段,只要具有相同的类别名,就把这些段顺序连接成一辑段,只要具有相同的类别名,就把这些段顺序连接成一个逻辑段装入内存,共用一个寄存器,所有段的偏移地址个逻辑段装入内存,共用一个寄存器,所有段的偏移地址都要变为相应组合段的偏移量。都要变为相应组合段的偏移量。 STACK:表示该段为堆栈段的一部分,此时编译程序:表示该段为堆栈段的一部分,此时编译程序把所有同名段连接成一个连续的堆栈段,装入把所有同名段连接成一个连续的堆栈段,装入SS段寄存器,段寄存器,用段内的最大偏移地址初始化用段内的最大偏移地址初始化SP。 COMMON:该组合类型
45、产生一个覆盖段。模块连接时,:该组合类型产生一个覆盖段。模块连接时,如果有相同的类别名,则都从同一个地址开始装入,因而如果有相同的类别名,则都从同一个地址开始装入,因而连接的逻辑段将发生覆盖。连接以后段的长度等于原来最连接的逻辑段将发生覆盖。连接以后段的长度等于原来最长的路段的长度,覆盖部分的内容是最后一个逻辑段的内长的路段的长度,覆盖部分的内容是最后一个逻辑段的内容。容。 MEMORY:表示该段在存储器中应定位在所有其他段:表示该段在存储器中应定位在所有其他段的最高地址处。如果有多个段使用的最高地址处。如果有多个段使用MEMORY,则只把第一,则只把第一个遇到的段当作个遇到的段当作MEMOR
46、Y处理,其余的段均按处理,其余的段均按PUBLIC处处理。理。 AT:表示该段定位在表达式所指示的位置上。:表示该段定位在表达式所指示的位置上。 3)类别名:类别名:类别名必须用单引号括起来,用于控制段类别名必须用单引号括起来,用于控制段的装入顺序。类别名可由程序设计人员自己选定任何字符的装入顺序。类别名可由程序设计人员自己选定任何字符串组成,但它不能再作为程序的标号,变量名或其他定义串组成,但它不能再作为程序的标号,变量名或其他定义的符号。在连接处理时,的符号。在连接处理时,LINK程序把类别名相同的所有段程序把类别名相同的所有段存放在连续的存储区内。存放在连续的存储区内。 例如例如,下面就
47、是一个分段结构的源程序框架:,下面就是一个分段结构的源程序框架: STACK1 SEGMENT PARA STACK STACK1 ; 定定 义堆栈段义堆栈段1 STACK1 ENDS DATA1 SEGMENT PARA DATA1 ;定义数据段定义数据段1 DATA1 ENDS STACK2 SEGMENT PARA STACK2 ;定义堆栈段定义堆栈段2 STACK2 ENDS DATA2 SEGMENT PARA DATA2 ;定义数据段定义数据段2 DATA2 ENDS CODE SEGMENT PARA MEMORY ;定义代码段定义代码段 ASSUME CS: CODE, DS:
48、 DATA1, SS: STACK1 ; 指定段寄存器指定段寄存器 BEGIN: CODE ENDS END START (2)ASSUME 指示汇编程序指定段所使用的寄存器,指示汇编程序指定段所使用的寄存器,即将段寄存器与某个逻辑段建立起对应关系,该伪指令即将段寄存器与某个逻辑段建立起对应关系,该伪指令不产生任何目标代码。其格式如下:不产生任何目标代码。其格式如下: ASSUNE 段寄存器名:段名段寄存器名:段名,段寄存器名:段名,段寄存器名:段名 其中段寄存器名是指四个段寄存器其中段寄存器名是指四个段寄存器CS、SS、DS、ES中的一个中的一个,但要注意,程序代码段只能用,但要注意,程序代
49、码段只能用CS作寄存器,作寄存器,堆栈段只能用堆栈段只能用SS作段寄存器。段名是指逻辑段的名字。作段寄存器。段名是指逻辑段的名字。在一个源程序中,如果没有另外的在一个源程序中,如果没有另外的ASSUME伪指令重新伪指令重新设置,原有的设置,原有的ASSUME语句的设置一直有效。语句的设置一直有效。 需要注意的是,需要注意的是,ASSUME伪指令只是告诉汇编程序伪指令只是告诉汇编程序段寄存器与逻辑段的关系,并没有给段寄存器赋予实际段寄存器与逻辑段的关系,并没有给段寄存器赋予实际的初值。若要给段寄存器赋值,可参考下面程序:的初值。若要给段寄存器赋值,可参考下面程序: CODE SEGMENT ;定
50、义代码段定义代码段 ASSUME CS: CODE, DS: DATA1, SS: STACK1 ;指定段寄存器指定段寄存器 MOV AX, DATA1 MOV DS, AX ;初始化段寄存器初始化段寄存器DS MOV AX, STACK1 MOV SS, AX ;初始化堆栈段寄存器初始化堆栈段寄存器SS CODE ENDS 过程又称子程序,它是程序的一部分,可以被程序调用,过程又称子程序,它是程序的一部分,可以被程序调用,当过程中的指令执行完后,返回程序调用点,调用过程的指当过程中的指令执行完后,返回程序调用点,调用过程的指令是令是CALL,从过程返回的指令为,从过程返回的指令为RET。程序
51、设计中,我们常。程序设计中,我们常常把具有一定功能的程序段设计成一个子程序,汇编程序用常把具有一定功能的程序段设计成一个子程序,汇编程序用“过程过程”来构造子程序。过程定义伪指令的格式如下:来构造子程序。过程定义伪指令的格式如下: 过程名过程名 PROC NEAR/FAR ;NEAR与与FAR只选只选 一个,或缺省一个,或缺省 (过程体)(过程体) 过程名过程名 ENDP 其中,过程名不能省略,过程名也就是子程序的程序名,其中,过程名不能省略,过程名也就是子程序的程序名,可以通过可以通过CALL指令调用,它类同于一个标号的作用,具有三指令调用,它类同于一个标号的作用,具有三个属性:段、偏移量和
52、类型。类型可以选择个属性:段、偏移量和类型。类型可以选择NEAR或或FAR,如,如果没有选择距离类型,则默认为果没有选择距离类型,则默认为NEAR。用。用PROC表示过程的表示过程的开始,开始,ENDP表示过程的结束,它们应成对出现,并使用同一表示过程的结束,它们应成对出现,并使用同一个过程名。一个过程应该写在某一个逻辑段内。例如:个过程名。一个过程应该写在某一个逻辑段内。例如:4、过程定义伪指令、过程定义伪指令 CODE SEGMENT ASSUME CS: CODE DISCH PROC NEAR ;定义一个过程(段内调定义一个过程(段内调 用属性)用属性) MOV AH, 2 INT 2
53、1H DISCH ENDP ;过程结束过程结束 START: MOV DL, 30H CALL DISCH ;调用过程(属段内调用)调用过程(属段内调用) MOV DL, A CALL DISCH ;调用过程(属段内调用)调用过程(属段内调用) MOV AH, 4CH INT 21H ;返回到返回到DOS CODE ENDS END START 注意,若过程调用为段间调用时,则在调用过程时要注意,若过程调用为段间调用时,则在调用过程时要将返回地址的段地址和偏移量都压入堆栈。将返回地址的段地址和偏移量都压入堆栈。 汇编程序内,为了指定下一个数据或指令在相应段中汇编程序内,为了指定下一个数据或指令
54、在相应段中的偏移量,汇编程序使用了一个定位伪指令。其格式为:的偏移量,汇编程序使用了一个定位伪指令。其格式为: ORG 表达式表达式 它表示把表达式的值赋给它表示把表达式的值赋给。例如:。例如:5、定位伪指令、定位伪指令ORG和当前位置计数器和当前位置计数器$ DATA SEGMENT ORG 20H ;设置位置计数器设置位置计数器$为为20H D1 DB 12H, 13H ;12H,13H从偏移量为从偏移量为20H 处开始存放处开始存放 ORG $+01H ;设置位置计数器设置位置计数器$为为$+01H D2 DB 61H, 62H, 63H ;61H,62H,63H从偏移量从偏移量 为为2
55、1H处开始存放开始存放 DATA ENDS CODE SEGMENT ASSUME CS: CODE, ORG 100H ;设置位置计数器设置位置计数器$为为100H START: MOV AX, DATA ;BEGIN从偏移量为从偏移量为 100H处开始存放处开始存放 CODE ENDS END START 标题伪指令标题伪指令TITLE用于给程序设置一个标题,列表文用于给程序设置一个标题,列表文件中每一页的第一行都会显示这个标题,它是用户任意选件中每一页的第一行都会显示这个标题,它是用户任意选定的字符串,但是字符的个数不能超过定的字符串,但是字符的个数不能超过6b0,用,用END标识标识源
56、程序模块的结束,其后可跟程序启动标号或过程名,用源程序模块的结束,其后可跟程序启动标号或过程名,用于指明程序的启动地址,系统根据这个地址初始化于指明程序的启动地址,系统根据这个地址初始化CS。其格式为:其格式为: TITLE 字符串字符串 END 启动标号启动标号6、标题伪指令、标题伪指令TITLE 告诉汇编程序任务到此结束,其后可跟程序启动标号告诉汇编程序任务到此结束,其后可跟程序启动标号或过程名,用于指明程序执行时第一条指令的地址。其格或过程名,用于指明程序执行时第一条指令的地址。其格式为:式为: END 表达式表达式7、源程序结束伪指令、源程序结束伪指令 汇编语言中,如果源程序中需要多次
57、重复使用同一组汇编语言中,如果源程序中需要多次重复使用同一组指令,为了简化汇编语言源程序的书写,缩短主程序的长指令,为了简化汇编语言源程序的书写,缩短主程序的长度,可以将这组指令定义为一个度,可以将这组指令定义为一个“宏指令宏指令”,以后需要时,以后需要时,可以按宏指令名来引用,这比子程序更灵活、更简便。可以按宏指令名来引用,这比子程序更灵活、更简便。 宏汇编程序宏汇编程序MASM提供了丰富的宏操作伪指令语句,提供了丰富的宏操作伪指令语句,下面介绍几种常用的宏指令语句。下面介绍几种常用的宏指令语句。5.2.3 宏指令宏指令 宏定义的一般格式为:宏定义的一般格式为: 宏指令名宏指令名 MACRO
58、 形式参数形式参数1,形式参数,形式参数2, (宏定义体)(宏定义体) ENDM1、宏定义与宏调用、宏定义与宏调用 其中,宏定义符其中,宏定义符MACRO和宏结束符和宏结束符ENDM必须成对必须成对出现,其间的宏定义体就是用宏指令名来代替的指令组。出现,其间的宏定义体就是用宏指令名来代替的指令组。形式参数用于向宏定义体传送参数,在宏调用时代入实形式参数用于向宏定义体传送参数,在宏调用时代入实际参数,这使宏指令具有更强的通用性。际参数,这使宏指令具有更强的通用性。 宏调用格式为:宏调用格式为: 宏指令名宏指令名 实际参数实际参数1,实际参数,实际参数2, 注意,注意,这里的实际参数可以是常数、寄
59、存器、存储这里的实际参数可以是常数、寄存器、存储单元名以及地址表达式等单元名以及地址表达式等。实际参数的数目可以和形式。实际参数的数目可以和形式参数的数目不一致,当实际参数多于形式参数时,多余参数的数目不一致,当实际参数多于形式参数时,多余的实际参数将被忽略的实际参数将被忽略;当实际参数少于形式参数时,多余当实际参数少于形式参数时,多余的形式参数为空。的形式参数为空。 汇编时,汇编时,MASM将对每个宏调用进行展开,即将宏将对每个宏调用进行展开,即将宏指令名用相应的宏定义体中的指令组代替,用实际参数指令名用相应的宏定义体中的指令组代替,用实际参数代替形式参数,并在指令组前加一个代替形式参数,并
60、在指令组前加一个“”号。例如:号。例如: SHIFT MACRO ;宏定义 MOV CL, 4 SAL AL, CL ;宏定义体 ENDM MOV AL, DX ADD AL, SI SHIFT ;宏调用 MOV BX. AL 汇编后,产生如下的代码:汇编后,产生如下的代码: MOV AL, DX ADD AL, SI MOV CL, 4 SAL AL, CL MOV BX. AL 若既要使左若既要使左移次数可改变,移次数可改变,又要能使用不同又要能使用不同的寄存器进行移的寄存器进行移位,就要引入形位,就要引入形式参数,用式参数,用X来来代替左移次数,代替左移次数,用用Y来代替移位来代替移位的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数学六年级下册期末模拟真题试题A卷及答案解析
- 初中英语数词解题技巧及经典题型及练习题(含答案)含解析
- 2020-2021九年级化学一模试题分类汇编-化学推断题综合及答案
- 2025年审计中级考试题库试题及答案
- 2025年全国焊工操作证理论考试练习题及答案
- 妇产科主治医师考试真题库及答案解析
- 2025机械员考试题库附答案综合题
- 2025年建筑市政施工员理论试题测试题及答案
- 2025年垂直极化箔条项目立项申请报告
- 整形咨询师绩效方案
- 2026届湖南省天一大联考高三上学期阶段性检测(一)数学试题
- 中职生就业指导课件
- 《国庆假期安全教育》课件
- 2025年辅警招聘考试试题库及完整答案(历年真题)
- 2025湖北宜昌市不动产交易和登记中心招聘编外聘用人员17人考试参考题库及答案解析
- 2025下半年四川内江市隆昌诚信农业产业化融资担保有限责任公司招聘4人考试参考题库及答案解析
- 《春江花月夜》课件+2025-2026学年统编版高二语文选择性必修上册
- 广州中侨置业投资控股集团有限公司债权资产评估报告
- 脑梗的课件和提纲
- 监控工程试运行方案(3篇)
- 2025年秋季学期学校红领巾监督岗工作实施细则
评论
0/150
提交评论