资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第四章,汇编语言,程序设计,主要内容:,汇编语言源程序的结构,汇编语言语句格式,伪指令,功能调用,汇编语言程序设计,1,4.1,汇编语言源程序,机器语言,二进制数形式的指令和数据。,B0 64 是什么意思?这就是机器语言。既不直观,又不易理解和记忆.,MOV AL,64H,;很容易记忆理解,这就是,助记符,。,助记符,用便于记忆的英语单词表示的指令操作码。它,反映了指令的功能和主要特征,便于人们理解和记忆。,2,操作数可能放在存储器中,这就涉及操作数,的地址。程序中遇到转移指令或调用指令,也需要知道转移地址,若采用具体地址就很,不方便,一旦有错,改动也很麻烦。于是人,们,采用标号或符号来代替地址,例:,指令除了操作码以外,还有一个操作数问题。,LP1,:mov ax,VAR,loop,LP1,3,汇编语言,指令助记符,符号地址,标号,伪指令等语言元素的集合以及这些元素使用的规则。,用汇编语言编写的程序叫,汇编语言源程序,。,汇编程序,汇编源程序需翻译成机器语言,变成可执行文件,机器才能执行,这个翻译过程叫,汇编,。高级语言中称该过程为“解释”或“编译”。执行翻译的程序称为“,汇编程序,”。,4,源程序的编译程序,汇编程序,汇编语言源程序,机器语言目标程序,5,汇编语言程序设计与执行过程,输入汇编语言源程序 源文件,.ASM,汇编(编译)目标文件,.OBJ,链接 可执行文件,.EXE,调试 最终程序,6,4.1.1 汇编语言源程序的结构,汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三个逻辑段组成:,数据段存放数据、变量,堆栈段堆栈区域,代码段存放程序指令,7,一个基本的汇编语言程序框架如下:,stack,SEGMENT PARA ,stack,DB 100 DUP(,stack,),stack,ENDS,data,SEGMENT,data,ENDS,code,SEGMENT,ASSUME CS,:,code,DS,:,data,ES,:,data,start:,MOV AX,data,MOV DS,AX,MOV ES,AX,MOV AL,4CH,INT 21H,code,ENDS,END,start,堆栈段,数据段,代码段,8,4.1.2 汇编语言的语句与格式,汇编语言的语句有两种,:,指令性语句,由,8086,指令助记符构成的语句,指示性语句,由伪指令构成的语句,指令性语句,的格式为:,标号,:,指令助记符,目的操作数,源操作数,;,注释,指示性语句,的格式为:,名字,伪指令,操作数,1,操作数,2,操作数,n,;,注释,注:各部分之间至少要用一个空格作为分隔符。,9,指令性语句,由,CPU,执行,每一条指令性语句都,有一条机器码指令与其对应,;,指示性语句,由,汇编程序,执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。,语句的构成元素:,标号,指令的符号地址,用来代表指令在存储器中的地址。,只能出现在指令性语句中,标号后应加上冒号。,10,名字,段、过程、变量的名字,用来代表它们在存储器中的地址。,只能出现在指示性语句中,名字后不加冒号。,指令助记符,8086,助记符、伪指令,操作数,即指令的操作对象,对指令性语句,0,,,1,,,2,个,对指示性语句,根据需要而定,操作数之间以逗号分隔,操作数可以是:寄存器、存储单元、常数或表达式,例如:AX,DI+BX+10,200,16*8+TABLE,等等,11,注释,以分号开头,可放在指令后,也可单独一行。,注意注解的写法。要写指令(段)在程序中的作用,而不要写指令的操作。,例如:以下为同一条指令写的注释,1)MOV CX,100 ;,传送100到CX,2)MOV CX,100 ;,循环计数器置初值,显然,第二种写法要比第一种写法要好。,12,汇编语言的一个实例:hello.asm,data,SEGMENT,Hello,DB,Hello,world!,0DH,0AH,$,data,ENDS,prog,SEGMENT,ASSUME,CS:,prog,DS:,data,start,:MOV AX,data,MOV DS,AX,LEA DX,hello,;取字符串首地址,MOV AH,9,INT 21H;显示字符串,MOV AH,4CH,INT 21H;退回DOS,prog,ENDS,END,start,名字,标号,13,数据项包括,常量,、,变量,、,标号,及,表达式,。,4.1.3 数据项与表达式,1.常量,二进制数,以,B,结尾。如,01001101B,。,十进制数,如,85,。,十六进制数,以,H,结尾。第,1,个数字为,A-F,时,,前面应加,0,,如,0F160H,。,字符串:用引号括起来的,1,个或多个字符。如,ERROR!,a,汇编时被翻译成对应的,ASCII,码,45H,52H,52H,4FH,52H,21H,和,61H,。,14,2.,标号,指令所在内存单元的符号地址,有三个属性:,段地址,:即标号所在段的段地址;,偏移量,:标号所代表存储单元的段内偏移地址;,类 型,:,NEAR,或,FAR,:,NEAR表示标号所在语句与转移指令/,调用指令在同一码段内,跳转时,只需改变IP即可。,FAR标号所在语句与转移指令/调用,指令不在同一代码段内。,若没有对类型进行说明,默认为NEAR。,标号通常作为,转移指令,或,CALL,指令,的转移地址。,15,3.,变量,变量即内存中的存储单元或数据区。,变量名是存储单元(数据区)的符号地址或名字。,变量也有三个属性,:,段地址,变量所在段的段地址,偏移量,变量单元地址与段首地址之间的位移,量。,类 型,有,BYTE,、,WORD,和,DWORD,三种。,变量在程序中作为,存储器操作数,被引用。,16,标号和变量名的使用规则,组成:,A-Z(,不分大小写,),0-9,?,.,_$,不能以数字开头,句号,(,.,),只能作为首字符,长度小于,31,个字符,不能与保留字,(,指令助记符、伪指令、预定义符号等,),重名,不能重复定义,例如:,正确的:LP1,AGAIN,NEXT,_GO,OK_1,错误的:4M,LOOP,AAA,#HELP,+ONE,17,4.表达式,表达式是常数、寄存器、标号、变量与运算符的组合。,有数字表达式和地址表达式两种。,汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运行时不能改变。,表达式中的运算符有,6,类:算术、逻辑、关系、取地址、属性、杂类。,18,用于数字表达式,例:,MOV AX,4*1024,汇编后的形式为,:,MOV AX,4096,1)算术运算符+、-、*、/,MOD,用于地址表达式,例,:,LEA SI,TAB+3,若,TAB,的偏移地址为,1000H,,则汇编后的形式为:,LEA SI,1003H,19,逻辑运算符只能用于数字表达式中。,例:MOVCL,36H AND 0FH,经汇编后:MOV CL,06H,2)逻辑运算符 AND、OR、XOR、NOT,注意,不要把逻辑运算符与逻辑运算指令混淆:,例:AND AX,3FC0H AND 0FF00H,汇编后源操作数被翻译为:,3F00H,,所以上述指令与AND AX,3F00H等价。,20,关系运算的结果是一个逻辑值:,真,或,假,关系为真,结果为全,1,关系为假,结果为全,0,3)关系运算符EQ、NE、LT、GT、LE、GE,例:,MOV BX,PORT GT 300H,若PORT的值大于300H,则汇编后为:,MOV BX,0FFFFH,否则汇编后为:,MOV BX,0,21,SEG:取变量/标号的段地址,OFFSET:取变量/标号的偏移地址,4)取地址运算符SEG、OFFSET,例:VAR DB 12H,MOV BX,OFFSET VAR;,取变量VAR的偏移地址,MOV AX,SEG VAR ;取变量VAR的段地址,22,TYPE,取变量的类型(,1,,,2,,,4,),LENGTH,取所定义变量的长度,(即变量中元素的个数),SIZE,取所定义存储区的字节数,(,=TYPE*LENGTH,),5)取值运算符TYPE、LENGTH、SIZE,例:VAR DW 1,2,3,4,5,则 TYPE VAR=2,LENGTH VAR=5,SIZE VAR =10,23,用来指定地址操作数的类型。,格式:,PTR,类型,BYTE,WORD,DWORD,NEAR,FAR,6)属性运算符PTR,BYTE,、,WORD,、,DWORD,用于描述数据存储单元,(,变量,),地址,NEAR,、,FAR,用于描述转移、调用的目的地址,24,例:MOVBYTE PTRDI,0;字节类型,MOVWORD PTRDI,0,MOVDI,0B5H,PTR也可用来进行强制类型转换,例:STR1 DW?;STR1定义为字类型,MOV AX,STR1 ;合法,MOV AL,STR1 ;非法,MOV AL,BYTE PTR,STR1;合法,25,4.2 伪指令,由汇编程序执行的指令,它本身不被汇编成机器指令。常用的伪指令有:,数据定义伪指令,符号定义伪指令,段定义和段寄存器指定伪指令,过程定义伪指令,结束伪指令,26,4.2.1 数据定义伪指令,用于定义变量,即内存单元或数据区。数据定义伪指令的格式为:,变量名 数据定义伪指令 操作数,操作数,,常用的数据定义伪指令有如下几种:,DB,定义,字节,DW,定义,字,DD,定义,双字,操作数可以是常数、变量或表达式,27,例1:,DATA_B DB 10,5,10H,DATA_W DW 100H,-4,DATA_D DD 0FFFBH,汇编后的内存分配情况,如右图所示。,05H,10H,00H,01H,FCH,FFH,FBH,FFH,00H,00H,0AH,DATA_B,DATA_W,DATA_D,10,5,10H,100H,-,4,0FFFBH,28,例2:操作数可以是字符串,例如,STR DBHELLO,汇编后的情况如图:,STR,H,E,L,L,O,48H,45H,4CH,4CH,4FH,注意下面两个定义的不同之处:,DBAB,;41H在低字节,42H在高字节,DW AB,;42H在低字节,41H在高字节,29,操作数,?,用来保留存储空间,但不存入数据.,例3:,ABC DB 0,1,2,3,4,OK,$,RSV DW?,?,?,?,?,?,?,?,复制操作符,DUP:,重复的数据可以使用复制操作符,DUP,如上面,RSV,亦可写成:,RSV DW 8 DUP(?),若操作数中若使用,$,则表示的是地址计数器的当前值。,30,例:TABLE DB 10 DUP(?),BUFFER DW TABLE,$+3,设TABLE的偏移地址为0080H,则汇编后如下图所示:,TABLE,BUFFER,.,.,.,80H,00H,8FH,00H,0080H,0089H,008AH,008BH,008CH,008DH,10 Bytes,31,DATA SEGMENT,DA_BYTE DB 50H,50H,DA_WORD DW 0A3F1H,4981H,DA_B DB?,?,DA_ W DW?,STRING1 DB ABCDEF,STRING2 DW AB,CD,D_B1 DB 20 DUP(?),D_B2 DW 10 DUP(10 DUP(1000H),DATA ENDS,50H,50H,DA_BYTE,F1H,A3H,81H,49H,DA_WORD,?,?,DA_B,DA_W,?,?,41H,42H,43H,44H,45H,46H,STRING1,STRING2,42H,41H,45H,44H,?,?,D_B1 20,个,32,4.2.2 符号定义伪指令,把一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示。
展开阅读全文