1第4章汇编语言程序设计张向东计算机科学与技术系24.1汇编语言与汇编程序4.1.1汇编语言的基本概念1机器语言与汇编语言(MachineLanguageandAssemblyLanguage)由二进制代码0,1表示的指令称为机器指令,相应的程序称为机器语言程序。用指令助记符表示的指令称为汇编语言指令,对应的程序称为汇编语言程序。3例4-1将4位二进制数转换为ASCII码字符。当数在0000B-1001B时,对应的ASCII码为‘0’~‘9’;当数在1010B~1111B时,对应的ASCII码为‘A’~‘F’。设待转换的数据已在累加器AL中(低4位)。编制的机器语言程序与汇编语言程序如下表所示。4地址机器代码对应的汇编指令E380:0000240FANDAL,0FHE380:00023C0ACMPAL,0AHE380:00047202JBNUME380:00060407ADDAL,07HE380:00080430NUM:ADDAL,30HE380:000AC3RET52.汇编语言与高级语言(AssemblyLanguageandComputer-independentLanguage)•汇编语言是一种依赖于计算机微处理器的语言•汇编语言一般不具有通用性和可移植性•进行汇编语言程序设计必须熟悉机器的硬件资源和软件资源•高级语言是面向过程的语言•高级语言具有很好的通用性和可移植性6学习汇编语言的必要性1、利用汇编语言可以设计出效率极高的核心底层程序。2、用汇编语言编写的程序一般比用高级语言编写的程序执行得快,且所占内存较少。3、汇编语言程序能够直接有效地利用机器硬件资源。4、学习汇编语言对于理解和掌握计算机硬件组成及工作原理是十分重要的。74.1.2汇编语言源程序的组成1.汇编语言源程序的结构(ProgramStructure)例6-2完整的汇编语言源程序示例。NAMEHEXTOASC;*****************************************************DATASEGMENT;数据段定义开始HEXDB5AHASCDB2DUP(?)DATAENDS;数据段定义结束;*****************************************************8;*************************************************STACKSEGMENT;堆栈段定义开始DB256DUP('S')TOPEQU$-STACKSTACKENDS;堆栈段定义结束;*************************************************;************************************************CODESEGMENT;代码段定义开始ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA;主程序开始9MOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,TOPMOVBX,OFFSETASCMOVAL,HEXMOVAH,ALMOVCL,4SHRAL,CLCALLNEARPTRCONVERT…HLT;主程序结束10CONVERTPROC;过程(子程序)定义开始ANDAL,0FHCMPAL,10JBNUMADDAL,7NUM:ADDAL,'0'RETCONVERTENDP;过程(子程序)定义结束CODEENDS;代码段定义结束;*************************************************ENDSTART;程序结束11要点总结•汇编语言源程序由段结构组成。•一个段由“SEGMENT”(段定义开始)和“ENDS”(段定义结束)语句来定义。•每个段都有唯一的段名,前后一致。•不同段的段名不能相同。•数据段、堆栈段和代码段的作用各不相同。•各个段都由一系列语句组成。•语句包括指令语句和伪指令语句。122.汇编语言的语句格式(StatementFormats)汇编语言程序的每行语句由1~4个部分组成。指令语句和伪指令语句在格式上稍有区别,指令语句的标号后有冒号“:”,而伪指令语句的标号后则没有冒号。指令语句的格式为[LABEL:]OPERATION[OPERAND][;COMMENT]标号域指令助记符域操作数域注释域13伪指令语句的格式为[LABEL]OPERATION[OPERAND][;COMMENT]标号域伪指令助记符域操作数域注释域一行最多可有132个字符注:指令助记符前面还可以有[前缀]。汇编语言程序语句中的四项,均可以用大写、小写或混合编写。语句的各部分之间至少用一个空格分开143.标号(Label)(含数据变量标号和程序位置标号)标号是一个自行设计的标识符或名称,最多可由31个字母、数字和特别字符(?、@、-、$)等组成。但不能用数字开头。不能为汇编语言的保留字。注:保留字指有专门用途的字符或字符串,如CPU的寄存器名、指令助记符、伪指令助记符等。15(1)数据变量标号的三种属性①段值:即所在段的段地址。②偏移量:即数据变量所在位置的地址与其段地址之差值。③类型:指该数据变量是字节、字还是双字。(2)程序位置标号的两种属性①NEAR——段内调用或转移标号。②FAR——段间调用或转移标号。164.操作数域(OperandFields)操作数可以是常数、变量、标号、寄存器名或表达式(1)常数:二进制、八进制、十进制、十六进制或ASCII码字符串。(2)寄存器名、标号、变量指令:MOVAL,HEX中,AL为寄存器名,HEX为变量名。17(3)表达式:由运算符连接起来的式子叫表达式,按一定的规则对表达式进行运算后得到一个数值或一个地址。表达式可分为算术表达式、逻辑表达式、关系运算表达式、分析运算表达式和合成运算表达式。18用算术运算符+、-、*、/和MOD连接的表达式。①算术表达式用逻辑运算符AND、OR、XOR和NOT连接的表达式。②逻辑表达式例如:5*8+30,128/100,206MOD128等算术表达式。19逻辑表达式的结果可能为8位或16位二进制数,视参加运算的数的字长而定。逻辑运算指令中可以包含有逻辑表达式,如指令ANDAL,10101010BAND0FH左边第一个AND为逻辑运算指令,第二个AND为逻辑运算符,10101010BAND0FH为逻辑表达式,其结果在汇编时即已确定,为00001010B,故上述指令等价于ANDAL,00001010B20用EQ、NE、LT、GT、GE和LE连接的表达式。若条件成立,其值为1,否则为0。③关系运算表达式分析运算表达式把存储器操作数分解为几个组成部分;而合成运算式是把这些组成部分综合为存储器操作数。④分析运算表达式和合成运算表达式例如:指令MOVBX,5GT3等价于MOVBX,0FFFFH21分析运算表达式和合成运算表达式的操作对象都为存储器操作数。存储器操作数表示变量、符号地址、存储单元等与存储器地址有关的量。分析运算表达式把存储器操作数分解为几个部分,如分解出段值、偏移量、类型等;合成运算表达式则把这些组成部分综合为存储器操作数。224.2伪指令指令语句:汇编程序把它们翻译成机器代码,命令8086执行对应操作。伪指令语句:汇编程序并不把它们翻译成机器代码,只是用来指示、引导汇编程序在汇编时做一些操作,它本身不占用存储单元。23*程序分段及存储器分配*变量定义及存储器申请*过程定义*符号定义*程序模块定义与通信*宏定义及宏调用*条件汇编*格式控制,列表及其他功能伪指令主要分为下列几类:244.2.1段定义伪指令SEGMENT/ENDS1.SEGMENT和ENDS定义方式:[段名]SEGMENT[定位方式][组合方式][类别名]语句1语句2…[段名]ENDS25段名是赋予该段的一个名称,SEGMENT与ENDS成对出现,且前面的段名要相同,段名的取法与文件名、标号及变量名等相同。(1)段名26LINK程序除完成段与段的联合操作以外,还把联合后得到的各个段互相衔接起来,段与段的衔接方式叫做定位方式,共4种。(2)定位方式27③WORD(字):表示段从地址是一个最低位为0的二进制数开始。④PAGE(页):表示段从一个页的边界,即十六进制数表示地址时最低两位均为0处开始。①PARA(缺省):表示段从一个节的边界,即用十六进制数表示地址时最低位为0处开始。②BYTE(字节):表示段可从任一地址开始。28BYTEXXXXXXXXXXXXXXXXXXXXBWORDXXXXXXXXXXXXXXXXXXX0BPARAXXXXXXXXXXXXXXXX0000BPAGEXXXXXXXXXXXX00000000BX表示可取0或1定位类型起始地址29(3)组合方式程序不同模块中具有相同性质的段,若使用同样的段名,则连接时就会把同名的段按照指定的方式组合起来,组合方式共有6种。表示该段与其他模块的段没有任何关系,每段都有自己的基址。这是缺省方式。①NONE(缺省)方式:30③STACK方式:连接时把所有STACK方式的同名段连接成一个段,运行时就是SS的装入值,且栈指针SP指向该段的起始地址。②PUBLIC方式:表示该段与其他模块中说明为PUBLIC方式的同名段互相组合成一个逻辑段,公用一个段址,运行时装入同一个物理段中。31⑤MEMORY方式:表示该段应定位在所有其他段的上面,若有多个段选用MEMORY,则除第一个之外,其余段均作为COMMON处理。④COMMON方式:表示该段与其它模块中所有已说明为COMMON的同名段共享相同的存储区域,即具有相同的段起始地址,共享的长度为模块同名段中最大长度。32例:有A,B;C,A,B;A,C共7个段是3个模块中的段,用P,C,S分别代表PUBLIC,COMMON或STACK。组合成4个新段(见下图),新段的长度为被组合在一起的各段长度之和(用PUBLIC和STACK方式时),或是各段中最长段的长度(COMMON方式)。⑥AT方式:表示该段按绝对地址定位,其段地址即为其后表达式的值,位移量为0。33A(P)B(C)C(S)A(P)B(C)AC(S)模块1模块2模块3LINKPCSABCD连接程序的组合处理示意图34(4)类别名是一个用单引号括起来的字符串,LINK程序把类别名相同的所有段放在连续的存储区域内,先出现的在前,后出现的在后。例:ASEGMENT‘FAT’ABSEGMENT‘BAZ’ECSEGMENT‘BAZ’BDSEGMENT‘ZOU’CESEGMENT‘FAT’DLINK处理前LINK处理后352.GROUP伪指令格式:[组名]GROUP[段名][,…]功能:用来把模块中若干不同名的段集合成一个组,使其装入同一个物理段中,组内各段之间的跳转可视为段内跳转。注:组名与段名是一样的取名规则,是代表该组的段地址,格式中的段名也可用表达式SEG[变量]或SEG[标号]。364.2.2位置计数器$和定位伪指令ORG1.位置计数器$汇编程序专门设置了一个表示当前位置的计数器,称位置计数器$。正常情况下,汇编程序每扫描一个字节,位置计数器的值便加1。语句:TOPEQU$-STACK含义:当前位置计数器的值$减去STACK代表的起始位置的值,然后把两者的差值赋予符号常量TOP。语句:JMP$含义:程序跳转到本条指令执行。37格式:ORG[数据表达式]功能:把位置计数器的值设置为表达式的值。ORG后面的一条指令性语句或数据区定义命令即从指定的位置处进行汇编。2.ORG伪指令38格式:ASSUME[段寄存器]:[段名],[段寄存器]:[段名],…功能:用于告知汇编程序,段寄存器CS、DS、ES和SS的内容将被设定为那些段或组的段址。4.2.3段寻址伪指令ASSUME39注:(1)段名可以是已定义过的任何段名或组名,也可以是表达式SEG[变量]或SEG[标号],还可以是NOTHING。(2)除CS外,DS、ES、SS的设置必须通过指令性