第八章 汇编语言基础
8.1汇编语言程序结构
1.汇编语言程序通常由若干段组成,包括代码段、数据段、堆栈段。
段由伪指令
SEGMENT与 ENDS
定义,各段顺序任意,
段的数目依需要确定,
原则上不受限制。
数据段通常在代码段前面定义。
2.段由若干语句组成,语句以指令为主体构成。可以说汇编语言程序最终由若干条汇编语句组成,是有限条汇编语句的有序集合。
3.汇编语言程序中至少要有一启动标号,作为程序开始执行时目标代码的入口地址。启动号常用 START,BEGIN,MAIN等命名。
4.为增加程序的可读性,汇编语言程序中同样有作为注释的成分。
汇编语言程序的注释是以“;”开始的内容。
5.更一般地讲,汇编语言程序由若干模块组成,每个模块是一独立汇编单位,独立汇编后整体连接成完整程序。
8.2汇编语言语句
1.语法基础
(1)字符集汇编语言允许使用的字符是 ASCII码字符位的一个子集。
包括:
(1)大写字母 A~ Z;
(2)小写字母 a~ z;
(3)数字字符 0~ 9;
(4)其他字符 +-*/=() []<>;,:,'"?@$&%?!{}等。(2).保留字保留字是由系统给定的,有特定含义的专用名字。
汇编语言中的保留字主要有:
a.寄存器的名字 AX,BX,CX,DX,BP,SP,SI,DI等;
b.指令助记符 MOV,PUSH,POP,ADD,SUB,MUL,DIV等;
c.伪指令符 DB,DW,ASSUME,EQU,LABEL,SEGMENT,PROC等;
d.一些特殊的运算符与操作符 LT,EQ,HIGH,SEG,PTR,SHORT等。
(3).标识符标识符在程序中用以标识常量、变量、标号、过程、段、组、宏等的名字。
汇编语言的标识符是以字母或专用字符 ($,@、?,.,-)开头的字母、数字与专用字符的序列。
汇编语言的标识符不区分大小写,不能与保留字同名。
2.语句格式两类汇编语句在源程序中格式基本相同,由 1~ 4部分组成。
一般格式如下:
1[标识符] 2助记 3[操作数] 4[;注释]
助记符是语句的主体,对指令语句是机器指令的助记符,对伪指令语句是伪指令符。
格式中第 1,3,4部分可选。
第 1部分标识符,对指令语句是标号标识符,代表相应语句的符号地址;
对伪指令语句可以是变量名、过程名、段名等,多是变量名。
第 3部分操作数,对指令语句可以是单操作数、双操作数,也可以是无操作数;对伪指令语句可以有更多的操作数,伪指令语句的操作数称为参数。
第 4部分注释,是程序中非常重要的辅助成分,可以单独存在。
3.指令语句指令语句是执行性语句,以机器指令作基础,与机器指令相对应,功能靠硬件实现,编译后有对应的目标代码,最终实现程序的操作处理。
4.伪指令语句单纯由指令语句不能形成完整程序,需要一些辅助语句来组织指令和数据,这些辅助语句就伪指令语句。
伪指令语句是说明性语句,告诉汇编程序如何工作,用于程序员以源程序的方式和汇编程序通信,完成数据定义、
段块定义、存储分配等操作,完成汇编控制。
伪指令语句功能靠程序,也就汇编程序实现。
8.3表达式表达式是操作数的一种,由常量、变量、标号、寄存器与相关运算符组成,包括数值表达式和地址表达式。
1.量
(1)常量常量在汇编时已有确定的值。
(2)变量变量是存储器中数据区的名字,一方面代表所表示的值,另一方面代表相应存储空间地址。
用作存储器操作数,直接寻址。
(3)标号标号代表指令语句的符号地址,属于代码段,用于标识程序中的控制转移地址,
可以作为条件转移、无条件转移、过程调用以及循环控制指令的操作数。
2.数值表达式数值表达式主要由量经过算术运算、关系运算、逻辑运算形成,结果是数值常量,只有大小,没有属性。
(1)算术运算主要的算术运算有,+、一,*、/,MOD,SHL,SHR。
SHL,SHR分别是算术左移运算、算术右移运算。
运算时结果可能出现溢出,对四字或十字节操作数最好不要使用表达式。
(2)关系运算关系运算包括:相等 EQ、不等 NE、小于 LT、大于 GT、小于等于 LE、
大于等于 GE。
运算结果是特殊的常量,若关系成立,结果为 0FFFFH:若关系不成立,结果为 0。
(3)逻辑运算逻辑运算包括:与 AND、或 OR、异或 XOR、非 NOT。
逻辑运算按二进制位进行。
3.地址表达式地址表达式由变量、常量、标号、寄存器的内容和相关运算符组成的有意义的式子。
(1)段取代操作段取代操作用于临时给变量或地址表达式指定段属性,即临时改变隐含的段属性。
格式:段寄存器或段名:地址表达式进行了段取代操作的地址表达式的偏移属性和类型属性不变,只改变地址表达式的段属性。
例如,CS,[BX][SI】,其段地址取 CS;若无 CS,段地址取自 DS。
(2)属性指定操作属性指定操作包括 PTR和 THIS,用来明确指出或临时指定地址表达式的类型 属性 。
(3)属性提取操作属性提取操作可以获得变量、标号、过程名等的段、偏移及类型属性值。
属性提取操作包括 SEG,OFFSET,TYPE,SIZE,LENGTH 5种
8.4 伪指令
1.数据定义伪指令数据定义伪指令包括 DB,DW,DD,DQ,DT,用于定义变量及分配存储区。
格式,[变量 ]数据定义伪指令符操作数 [,…]
功能,DB伪指令定义字节类型变量,DW伪指令定义字类型变量,DD
伪指令定义双字类型变量,DQ伪指令定义四字类型变量,DT伪指令定义十字节类型变量。
2.符号定义伪指令格式:名字 EQU表达式功能:将表达式用指定的名字来标识。表达式可以是任何有效的操作数格式,包括助记符、寄存器名。
3.段定义伪指令
(1)完整段定义伪指令格式:段名 SEGMENT[定位类型 ][组合类型 ][类别标识 ]
段名 ENDS
功能,SEGMENT表示段的开始,指出段名及段的各种特性,ENDS表示段到此结束。
(2)指定段寄存器伪指令 ASSUME
格式,ASSUME段寄存器名:段名 [,……]
功能:指定段所使用的寄存器。段可能由已经定义过的段名、变量标识符的段属性表示。
(3)简化段定义伪指令
A.段序伪指令 DOSSEG
格式,DOSSEG
功能:用于标记简化段,各段顺序由系统安排。
4.模块定义等伪指令
(1)过程定义伪指令格式:过程名 PROC[类型 ]
过程名 ENDP
功能,PROC表示过程的开始,ENDP表示过程到此结束。
(2)模块定义伪指令格式,[NAME模块名 ]
END[启动标号 ]
功能:定义所给模块名的源程序模块。
(3)组定义伪指令 GROUP
格式:组名 GROUP段名表功能:它告知汇编程序和连接程序,将段名表中给出的段集合成一组,并把它们装在同一物理段中。
(4)偏移地址设置伪指令 ORG (5) 汇编地址计数器伪指令 $
(6)基数控制伪指令 RADIX (7)注释伪指令 COMMENT
(8)包括伪指令 INCLUDE
5.宏指令宏指令用于定义宏,将语句序列作为整体考虑。
适当使用宏指令,将缩短程序书代码,使程序结构更加清晰,提高程序的可读性。
8.5 上机操作
1.上机操作必备程序
(1)编辑程序,文件名 EDIT.COM,2.0版,大小 71KB。
(2)汇编程序,文件名 MASM.EXE,5.0版,大小 65KB。
(3)连接程序,文件名 LINK。 EXE,5.0版,大小 141KB。
(4)调试程序,文件名 DEBUG,2.4版,大小 21KB。
下面是三个可选程序
(1)LIB.EXE,库管理程序。,
(2)CREF.EXE,符号索引文件处理程序。
(3)EXE2BIN.EXE,COM文件转换程序。
2.上机操作过程如下图所示:包括建立源程序、汇编成目标代码程序、连接成执行文件、执行程序四步,其源程序的建立、程序的执行同其他所有语言,在此不再重复。
A.汇编汇编程序的主要功能包括展开宏指令,检查源程序中的语法错误,
生成目标代码程序。源程序经汇编后除生成 OBJ文件外,还将生成扩展名为 LST的列表文件,扩展名为 CRF的符号索引文件。
B.连接连接程序并不是专门为汇编语言设计,利用它将若干目标代码(模块)
连接成可执行的 EXE文件。连接的目标代码既可以是汇编程序产生的目标代码,也可以是其他语言编译程序产生的目标代码。
8.6 DEBUG使用方法
1.DEBUG的运行格式一,DEBUG
格式二,DEBUG 文件名
DEBUG运行后,出现 DEBUG的状态提示符短画线,-
2.DEBUG的主要命令
DEBUG的主要命令有:
D,显示内存单元内容
U,反汇编命令
R,显示与修改寄存器内容
E,修改内存单元内容
A,汇编命令
T,P,单步执行指令
G,连续执行指令
N,指定装入文件名或写入文件名
L,装入 N命令指定的文件
W,将指定内容写入 N命令指定的文件
Q,退出 DEBUG程序,返回操作系统状态
(1)D命令格式,D[地址 1 [地址 2]]
功能:显示指定地址开始的 80H个字节单元内容或显示指定范围之间的内容。
说明:所给地址可以是偏移地址(隐含 DS),也可以是完整逻辑地址。
(2)U命令格式,U[地址 1 [地址 2]]
功能:反汇编,以汇编语言形式显示内存中的内容,
针对目标程序代码。
说明:不指定范围,显示 32字节目标代码的源程序指令。
(3)R命令格式一,R
功能:显示所有寄存器的内容。
格式二,R 寄存器功能:显示并可修改指定的寄存器内容。
说明:
a.最后一行显示的是当前 CS,IP处的指令。
b.RF可直接修改标志寄存器的内容。
c.调试程序时要时刻关心寄存器的变化。
d.在 DEBUG下,标志寄存器的内容用符号表示,符号表示方法表如下:
(4)E命令格式,E地址 [内容表 ]
功能:显示指定地址的内容,并可修改。给出修改内容表可现批量修改。
说明:某字节修改完成或不修改按空格键,修改完成或不再修改按回车键。
(5)A命令格式; E地址 [内容表 ]
功能:修改指定地址处的指令,汇编程序。
说明:
a.修改程序前,需先用 U命令查看要修改的内容,精确定位修改位置。修改完成,用
U命令再检查一遍。
b.还可直接使用 A命令在某地址输入调试一段小程序。
c.也可输入伪指令,但记住没有变量、标号,只有地址。
(6)T/P命令格式,T|P[=地址 ][值 ]
功能:从指定地址开始执行程序,值给出执行指令的条数。
说明:
a.每执行一条命令,将显示所有寄存器的内容。
b.不带参数,从 CS,IP处单步执行指令。
c.如果指令中有存储器操作数,将在指令后给出。
d.地址前一定要有等号,=”。
e.T,P命令的区别在于对待 CALL指令的方式,T命令碰到时会进入子程序执行,而
P命令只当作普通指令处理。
(7)G命令格式,G[=地址 ][,地址 [,·· ]]
功能:从第一个地址处开始连续执行指令,后面的地址是断点地址。
说明:
a.缺省开始地址,从当前 CS,IP执行。
b.设置多个断点是考虑到程序可能有多个分支。
c.执行正常结束,显示,Program terminate normally。
(8)N命令格式,N文件名功能:指定 L命令装入的文件名与 W命令将写入的文件名。
(9)L命令格式,L[地址 ]
功能:将 N命令指定的文件装入 L命令后的地址处。
说明:
a.缺省地址时,装入到 CS,100H处。
b.文件长度包含在 BX,CX中。
(10)W命令格式,W[地址 ]
功能:将指定地址或 CS,100H开始的内容写入 N命令指定的文件,文件的长度由 BX,CX给出。
(11)Q命令格式,Q
功能:退出 DEBUG程序,返回操作系统状态。
说明:不保存正在调试的程序。