4.1汇编语言概述语言分机器语言、低级语言、高级语言,机器语言由0和1构成,只有专业人士才能看懂。低级语言就是汇编语言,用助记符来表示,最贴近机器硬件,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言高级语言分为面向过程和面向对象的语言。1顺序结构顺序程序设计,又叫直接程序设计。它是相对于分支程序和循环程序设计而言的。因此,可以说顺序程序是既不包含分支,又不包含循环的程序,顺序程序是从第一条指令开始,按其自然顺序,一条指令一条指令地执行,在运行期间,CPU既不跳过某些指令,也不重复执行某些指令,一直执行到最后一条指令为止。2分支结构(1).分支程序设计概述分支程序结构可以有两种形式,如图所示(2)分支程序设计分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。根据对条件的判断而选择不同的处理方法是人的基本智能体现。3循环程序设计1.循环程序设计概述有时我们会需要能按一定规律,多次重复执行的一串语句,这类程序叫循环程序。循环程序一般由四个部分组成:(1)循环初值部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。循环初值分两类:一类是循环工作部分的初值,别一类是控制循环结束条件的初值。(2)工作部分:即需要重复执行的程序段。这是循环的中心,称之为循环体。(3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。(4)控制部分:用来保证循环程序按规定的次数或特写条件正常循环。4.2汇编语言的语句4.2.1语句分类:汇编语言语句分为指令性语句、伪指令、宏指令。4.2.2语句格式:[标号]操作码[操作数][注释]汇编语言源程序中的每个语句可以由4项组成,格式如下[name]operationoperand[;comment][名字项]操作项操作数项;注释项下面分别说明各项的表示方法。1.名字项源程序中用下列字符表示名字:字母:A~Z或a~z;数字:0~9;专用字符号:?、•、@、―、$;一般来讲,名字项可以是标号或变量。(1)标号:在代码段定义,后面跟冒号:它有三种属性:段、偏移及类型。①段属性:定义标号的段起始地址,在CX寄存器中。②偏移属性:16位无符号数。③类型属性:用来指出该标号是在本段内引用还是在其他段内引用的。(2)变量:变量在除代码以外的其他段中定义,后面不跟冒号。它也可以用LABLE或EQU伪操作来定义。变量经常在操作数字段出现。它也有段、偏移及类型三种属性。①段属性定义变量的段起始地址,此值必须在一个段寄存器中。②偏移属性变量的偏移地址是16位无符号数,它代表从段的起始地址到定义变量的位置之间的字节数。在当前段内给出变量的偏移值等于当前地址计数器的值,当前地址计数器的值可以用$来表示。③类型属性变量的类型属性定义该变量所保留的字节数。2.操作项操作项可以是指令、伪操作或宏指令的助记符。3.操作数项操作数项由一个或多个表达式组成,多个操作数项之间一般用逗号分开。4.注释项注释项用来说明一段程序或一条或几条指令的功能,它是可有可无的。4.3汇编语言源程序的伪指令段定义伪操作的格式如下:segment-nameSEGMENT…segment-nameENDS其中删节号部分,对于DS、ES和SS来说,一般是存贮单元的定义、分配等伪操作;对于代码段则是指令及伪操作此外,还必须明确段和段寄存器的关系,这可用ASSUME伪操作来实现,其格式为:ASSUMEassignment,…,assignment其中assignment说明分配情况,其格式为:〈段寄存器名〉:〈段名〉其中段寄存器名必须是CS、DS、ES和SS中的一个,而段名则必须是由SEGMENT定义的段中的段名。4、2、.3汇编语言源程序的结构汇编语言源程序的程序基本结构是段,一个汇编语言源程序由若干个代码段、数据段、附加段和堆栈段组成。段之间的顺序可以随意安排,通常数据段在前,代码段在后。任何可执行汇编语言程序至少要有一个代码段,通常还可能有数据段和堆栈段。每个段都有段首指令和段结束指令,段的内容介于这两条指令之间。1.算术运算符算术运算符主要包括+、-、*、/和MOD、[]等。其中MOD是指除法运算后得到的余数。语法格式为:expr1[expr2]等价于expr1+expr2。2.逻辑运算符逻辑运算符主要包括AND、OR、XOR、NOT、SHR及SHL。逻辑操作符是按位操作的,它只能用于数字表达式中。3.关系运算符关系运算符主要包括EQ(相等时为真)、NE(不相等时为真)、LT(小于时为真)、GT(大于时为真)、LE(小于或等于时为真)、GE(大于或等于时为真)等6种。4.数值回送(Valuereturning)操作符它有TYPE、LENGTH、SIZE、OFFSET、SEG5种。这些操作符把一些特征或存储器地址的一部分作为数值回送。下面分别说明各个操作符的功能。(1)TYPE格式:TYPEVariable或label如果是变量,则汇编程序将回送该变量的以字节数表示的类型,DB为1,DW为2,DD为4,DQ为8,DT为10。如果是标号,则汇编程序将回送代表该标号类型的数值:NEAR为-1,FAR为-2。(2)LENGTH格式为:LENGTHVariable对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元个数。而对于其他情况则回送1。(3)SIZE格式为:SIZEVariable其汇编的值为LENGTHVariable*TYPEVariable,即回送直接分配给该变量的总的字节数。(4)OFFSET格式为:OFFSETVariable或label汇编程序将回送变量或标号的偏移地址值。(5)SEG格式为:SEGVariable或label汇编程序将回送变量或标号的段地址值。5.属性操作符属性操作符主要包括PTR、段操作符、SHORT、THIS、HIGH和LOW6种。(1)PTR格式为:typePTRexpressionPTR用来建立一个符号地址,但它本身并不分配存储器,只是用来对已分配的存储地址赋予另一种属性,使该地址具有另一种类型。(2)段操作符:用来表示一个标量、变量或地址表达式的段属性。例如,用段前缀指定某段的地址操作数MOVAX,ES:[BX+SI]。可见它是用段寄存器地址表达式来表示的。(3)SHORT用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址±127个字节范围之内。(4)THIS格式为:THISattribute或type(5)HIGH和LOW称为字节分离操作符,它接收一个数或地址表达式,HIGH取其高位字节,LOW取其低位字节1.4伪指令构成汇编语言源程序的语句主要包括两类:指令和伪指令。指令是在程序运行期间有CPU执行的,汇编后由对应的机器代码所取代。伪指令是不可执行的,它只是在源程序汇编期间由汇编器处理的命令,用来指示汇编器为数据分配内存空间,或者为汇编器提供源程序结束或段定义等信息。1、变量定义伪指令变量定义伪指令用来为数据分配内存空间,并设置相应内存单元的初始值,其形式为:[变量名]变量定义符操作数[,…,操作数]变量名是一个符号地址,表示其后操作数的首地址,多个操作数构成一个数组。变量名是程序员给出的标识符,为可选项,给出变量名只是为了按名存取其对应的内存单元。变量定义符主要包括下列几种:(1)DB(DefineByte):定义字节,后面的每个操作数占1个字节。(2)DW(DefineWord):定义字,后面的每个操作数占1个字。(3)DD(DefineDWord):定义双字,后面的每个操作数占2个字。(4)DQ(DefineQWord):定义四字,后面的每个操作数占4个字。(5)DT(DefineTbyte):定义十字节,后面的每个操作数占10个字节。2、符号定义伪指令符号定义伪指令的基本形式为:符号名EQU表达式符号名=常数表达式功能:给表达式指定一个等价的符号名。说明:(1)=后的表达式只能是常数,对于字符或字符串,在汇编时按整数处理。(2)EQU后的表达式可以是数值、字符串,甚至可以是寄存器名、指令的助记符等。(3)EQU不能重复定义,而“=”伪指令可以重复定义,其作用域从定义点到重新定义之前。3、段定义伪指令汇编语言源程序由一个段或多个段组成,多数程序采用一个代码段、一个数据段和一个堆栈段。段定义由SEGMENT与ENDS伪指令实现,基本形式如下:段名SEGMENT[STACK]〈语句序列〉段名ENDS4、程序开始和结束伪操作在程序的开始可以用NAME或TITLE为模块的名字,NAME的格式是:NAMEmodule_name作为模块的名字。如果程序中没有NAME伪操作,则也可使用TITLE伪操作,其格式为:TITLEtext1、5宏指令与条件汇编1.宏定义和宏调用宏是源程序中一段有独立功能的程序代码。它只需要在源程序中定义一次,就可以我次调用它,调用时只需要有一个宏指令语句就可以了。宏定义是用一组伪操作来实现的。其格式是:macronamemacro[dummyparameterlist]┇(宏定义体)ENDM经宏定义定义后的宏指令就可以在源程序中调用。这种对宏指令的调用称为宏调用,宏调用的格式是:macroname[actualparameterlist]当源程序被汇编时,汇编程序将对每个宏调用作宏展开。宏展开就是用宏定义体取代源程序中的宏指令名,而且有实元取代宏定义中的哑元。4.4完整汇编语言的上机过程4.4.1有输入输出的程序上机过程:后面DOS功能调用中的内容用编辑器EDIT或记事本输入源程序,存为*.ASM用MASM汇编*.ASM,生成*.OBJ,若有错误,根据错误再次调试用LINK链接*.OBJ,生成*.EXE,直接运行*.EXE4.4.2无输入输出的程序上机过程:用编辑器EDIT或记事本输入源程序,存为*.ASM用MASM汇编*.ASM,生成*.OBJ,若有错误,根据错误再次调试用LINK链接*.OBJ,生成*.EXE运行DEBUG,反汇编*.EXE,到源程序-U,用-T,-G,运行就可以了。4.5汇编语言程序设计4.5.1顺序结构顺序程序设计,又叫直接程序设计。它是相对于分支程序和循环程序设计而言的。因此,可以说顺序程序是既不包含分支,又不包含循环的程序,顺序程序是从第一条指令开始,按其自然顺序,一条指令一条指令地执行,在运行期间,CPU既不跳过某些指令,也不重复执行某些指令,一直执行到最后一条指令为止。4.5.2分支结构(1).分支程序设计概述分支程序结构可以有两种形式,如图所示(2)分支程序设计分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。根据对条件的判断而选择不同的处理方法是人的基本智能体现。4.5.3循环程序设计1.循环程序设计概述有时我们会需要能按一定规律,多次重复执行的一串语句,这类程序叫循环程序。循环程序一般由四个部分组成:(1)循环初值部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。循环初值分两类:一类是循环工作部分的初值,别一类是控制循环结束条件的初值。(2)工作部分:即需要重复执行的程序段。这是循环的中心,称之为循环体。(3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。(4)控制部分:用来保证循环程序按规定的次数或特写条件正常循环。4.4.5子程序设计4子程序设计在程序设计过程中,经常会遇到一些功能结构相同,仅是某些变量的值不同的程序段在程序中的不同部分多次出现,这样的重复编程既烦琐又费时。为此,在设计程序时,可把这些程序段独立出来,按一定的格式编写,成为可以被其他程序多次调用的程序。这样的程序段称为子程序或称过程。通常,调用子程序的程序称为主程序。主程序和子程序是相对而言的,子程序还可调用别的子程序。在编程时,使用子程序可以减少编程工作量,节省存储空间,并易于实现程序的模块化,使程序结构清晰和便于调试。子程序(过程)调用与返回指令