《[工学]第4章 汇编语言程序设计》由会员分享,可在线阅读,更多相关《[工学]第4章 汇编语言程序设计(203页珍藏版)》请在金锄头文库上搜索。
1、信息工程学院 汇编语言程序格式 表达式与运算符 伪指令语句 DOS系统功能调用和BIOS中断调用 汇编语言程序设计方法 汇编语言上机调试过程 宏汇编与条件汇编通过例子说明8086汇编语言的结构。例:把从端口3输入的字节数据累加,若和超过100,则从原端口输出。4.1.1 汇编语言源程序的结构DATASEGMENT;定义数据段SUM DB ?;为符号SUM保留一个字节 DATAENDS;定义数据段结束 CODESEGMENT;定义码段 ASSUME CS:CODE,;规定CS和DS的内容DS:DATA PORT_VAL EQU 3;端口的符号名GO:MOV AX,DATA;DS初始化为DATA
2、MOV DS,AX MOV SUM,0;清SUM单元CYCLE:CMP SUM,100;SUM单元与100相比较 JNA NOT_DONE;若未超过,转至NOT_DONE MOV AL,SUM;若超过,把SUM单元的内容 OUT PORT_VAL,AL;通过AL输出 HLT;然后停机 NOT_DONE:IN AL,PORT_VAL;未超过时,输入下一个字节 ADD SUM,AL;与以前的结果累加JMP CYCLE;转至CYCLE CODEENDS;码段结束 END GO;整个程序结束可以看出:1. 源程序是由若干个段组成的。NAME1SEGMENT 语句 NAME1ENDS NAME2SEGM
3、ENT 语句 语句 NAME2ENDS END 源程序的一般格式如下:汇编语言程序可包括四个现行段:CS、DS、ES、SS。至少必须有一个代码段和一条作为源程序结束的伪指令2. 每一个段由若干语句行组成。3. 语句分为指令语句和指示语句(伪指令语句)。编程时需要考虑的问题: 设置些什么段,各段内容是什么?段与段之间关系?如何设置段?等等。标号: 前缀 (指令助记符) 操作数 ;注释(1)指令性语句4.1.2 汇编语言行的构成1. 语句类型与机器指令一一对应,在程序运行期间由机器执行,语句的格式如下:名字 (伪指令助记符) 操作数 ;注释(2)伪指令语句在汇编程序汇编源程序期间由汇编程序处理,本
4、身并不产生机器码,仅仅是告诉汇编程序如何对源程序进行正确的汇 编。即完成数据定义、存储区分配、段定义、段分配、指示程序结束等功能。伪指令语句的格式如下:伪指令语句与指令性语句的区别 汇编时,伪指令语句不产生目标代码,指令语句必产生相应的目标代码。 伪指令语句对应的伪操作是在汇编过程中完成的,而指令语句对应的操作是在运行程序时执行到指令时完成。 语句形式上的差别:伪指令语句名字后不能有“:”,指令语句标号后有“:”。(3)宏指令语句宏指令是由编程者根据宏指令定义规则,将一 组指令或伪指令集中定义为一条称为“宏大( Macro)”的指令。程序中,可用一条已定义的宏指令代替多条语 句,使源程序书写简
5、洁。汇编时,宏指令展开 还原。宏指令只节省源程序篇幅,不节省汇编后的目 标代码。2. 语句格式名字 操作符 操作数 ;注释(1)名字域名字是语句的符号地址。指令性语句前的名字称为标号,伪指令前的名字通常为变量名、段名、过程名等。 由字母(az, AZ)、数字(09)或某些特殊 字符(,_,?) 等组成;但“”必须为首字符。 首字符是字母或某些特殊字符,但“ ?”不能 单独作标识符; 有效长度为131个字符。 组成名字的规则: 指令语句和伪指令语句名字的区别:有无冒号。 名字的属性: 段属性:段地址该属性定义了标号和变量的段起始地址。 偏移属性:偏移量(地址) 该属性表示标号和变量相距段起始地址
6、的字节数 ,为一个16位无符号数。 类型属性:对标号,该属性用于指出标号是在本段内引用还 是在其它段引用:NEAR、FAR。对变量,该属性说明变量的长度:BYTE、 WORD、DWORD。(2)操作数域操作数可以是常数、寄存器、存储器、变量 、标号和表达式。 常数 无属性的纯数,其值在汇编时完全确定,程序 运行中不变。二进制 “B”结尾;八进制 “Q”或“O”结尾;十进制 “D”结尾或省略;十六进制 “H”结尾。 变量 存放在存储单元中的数,程序运行中可以修改, 具有三个属性。变量名可看作变量的符号地址。 标号 可执行指令语句的符号地址,可作为JMP和 CALL指令的转向的目标操作数,具有三个
7、属性 。4.1.3 汇编程序和汇编处理过程编辑 程序PROG.ASM汇编程序 MASMPROG.OBJLINK连接PROG.EXE汇编程序是将汇编语言程序翻译成机器代码的 系统程序。汇编处理过程示意如下:汇编程序对源程序作二次扫描: 以发现源程序中的语法错误,给出出错信息。 得到无语法错误的OBJ文件(二进制代码), 并给出列表文件。 展开宏指令,处理伪操作。1. 汇编源程序中的标号和变量等的段内偏移地址在汇编 过程中确定。2. 连接LINK连接程序LINK.EXE将OBJ文件与库文件或其它目标文件连接成可执行文件(EXE文件),EXE文件由DOS装入存储器并在机器上运行。段地址在连接过程中确
8、定。4.1.4 汇编源程序从编写到运行的过程编写源程序用编辑程序将源程序输入计算机调用汇编程序对源程序进行汇编是否有错误?调用连接程序对汇编后生成的目标文件( OBJ)进行连接连接是否有错误?运行连接后生成的可执行文件结果是否有错误?调用调试文件进行调试运行是否成功?结束修改已输入的源程序YYNNYYNN表达式由运算对象及运算符组成,在汇编时由汇编程序对它进行运算,运算结果作为一个语句中的操作数去使用。运算对象可以是常数、变量或标号,运算结果可以是一个常数字或存储器地址。8086MASM使用了5类运算符: 算术运算符 逻辑运算符 关系运算符 分析运算符 合成运算符4.2.1 算术运算符、*、M
9、OD、SHL、SHR。若对数字运算,则运算对象与结果均为整数。若对地址运算,则只有加/减法才有意义,且要求两个地址在同一段内。例1 数组定义如下:A1 DW 1, 2, 3, 4, 5, 6, 7A2 DW ?指令为:MOV CX, (A2 A1)/2汇编时形成指令:MOV CX, 7即将字数组A1的长度7 (字数) 存入CX。4.2.2 逻辑运算符AND 、OR、 NOT、XOR。按位操作, 只能对常数 进行运算,结果也是常数。 例2 MOV AL,NOT 0FFHMOV BL,8CH AND 73HMOV AH,8CH OR 73HMOV CH,8CH XOR 73H汇编时形成指令:MOV
10、 AL,0MOV BL,0 MOV AH,0FFH MOV CH,0FFH4.2.3 关系运算符EQ (相等) NE (不等) LT (小于)GT (大于) LE (小于或等于) GE (大于或等于)两操作数必须都是数字或是同一段内的两个存储器地址。结果为逻辑值:输出全“1”为真(0FFH或0FFFFH), 输出全“0”为假。关系运算符一般与逻辑运算符组合起来使用。例3 MOV BX, (PORTVAL LT 5) AND 20) OR(PORTVAL GE 5) AND 30)则当 PORTVAL 5时汇编为: MOV BX, 20PORTVAL 5时汇编为: MOV BX, 304.2.4
11、 分析运算符加在标号或变量前,对其对应的存储器地址进行运算,将它的三个重要属性:段地址、偏移地址和类型分离出来,返回运算对象作操作数用。OFFSET、SEG、TYPE、LENGTH、SIZE。分析运算符又称数值返回运算符。1. OFFSET 格式: OFFSET 标号或变量功能:返回标号或变量的偏移地址。例4 MOV BX, OFFSET P1 LEA BX, P12. SEG 格式:SEG 标号或变量功能:返回标号或变量的段地址。例5 若 DATA是从存储器0500H地址开始的一个数据的段名, P1是该段中的一个变量名,则:MOV BX, SEG P1 MOV BX, 0500H3. TYP
12、E 格式:TYPE 标号或变量功能:返回标号的距离属性或变量的类型属性。变 量DB DW DD DQ类型返回值 1 2-1 FFH -2 FEHNEAR FAR标 号4 8TYPE运算符返回值例6 A1 DW 1, 2, 3则 ADD SI, TYPE A1 ADD SI, 24. LENGTH 格式:LENGTH 变量功能:当变量中使用DUP时,返回此变量所包含的 单元数,即DUP前的数字;对其它变量则返回 1。例7 FEES DW 100 DUP (0)A2 DB 1, 2, 3则: MOV CX, LENGTH FEES MOV CX, 100 MOV CX, LENGTH A2 MOV
13、 CX, 15. SIZE 格式:SIZE 变量功能:返回该变量包含的总字节数,即LENGTH值和TYPE值的乘积。则: MOV CX, SIZE FEES MOV CX, 200MOV CX, SIZE A2; MOV CX, 1例8 FEES DW 100 DUP (0)4.2.5 合成运算符段属性前缀、PTR、THIS、HIGH、LOW、SHORT。这种运算符为存储器地址临时指定一个新的属性,而忽略当前的属性,所以又称为属性修改运算符。1. 段属性前缀 格式:段前缀 变量或地址表达式功能:用来修改某个变量或地址的段属性。 例9 MOV AX,ES:BX+SI2. PTR 格式:类型 PT
14、R 变量或标号功能:将 PTR 左边的类型属性赋给右边的变量或标号, 从而生成一个新的存储器地址操作数。注意:PTR本身并不分配存储器, 只是用来给已分配的存 储地址赋予另一种属性, 使该地址具有另一种类型。 即 由 PTR生成的新地址操作数与原来的变量(或标号)指 示的是同一存储单元(具有相同的段基址与偏移量),仅 类型不同而已。 例10 已知变量A1定义为:A1 DW 2030HA2 EQU BYTE PTR A1; A2 成字节变量A3 EQU BYTE PTR A1+1 A3 EQU A1+1A2 A32030A1 A1+1.(1) 变量存储器分配2007A1 A1+1.(2) MOV
15、 BYTE PTR BX,70007A1 A1+1.(3) MOV WORD PTR BX,7有时汇编程序分不清所传送的数据是存入字节单 元还是字单元,此时必须用PTR来说明属性。 例11 MOV BX, OFFSET A1MOV BX, 7 上述程序段在汇编时将出现“操作类型不明确”的 错误,第二句应改成下面(2)或(3)。3. THIS 格式:THIS 类型功能:象PTR一样建立一个指定类型 的地址操作数,但该操作数的段地址和偏移地址与下一个存储单元的地址相同,类型由THIS指定。例12 F1 EQU THIS BYTEF2 DW 100 DUP(?)此时, F1的偏移地址与F2完全相同, 但F1 是字节类型,F2是字类型。例13 START E