《第四章10.9.08汇编措辞语法与ods功效调用》由会员分享,可在线阅读,更多相关《第四章10.9.08汇编措辞语法与ods功效调用(100页珍藏版)》请在金锄头文库上搜索。
1、v第4章 汇编语言语法和DOS功能调用 4.1 汇编语言程序的格式 4.2 汇编语言中的基本数据4.3 伪指令语句4.4 汇编语言中的表达式4.5 指令语句4.6 宏指令语句及其使用4.7 DOS系统功能调用4.8 习题例解4.9 练习题v4.1 汇编语言程序的格式 v例4-1 试求小于100的所有非零偶数,并把结果存入以BUFF开v 始的内存区。 v 1 MY_DATA SEGMENT ; 定义数据段v 2 BUFF DB 50 DUP(?) ; 设置缓冲区v 3 MY_DATA ENDS ; 定义数据段结束v 4 MY_CODE SEGMENT ; 定义代码段v 5 ASSUME CS:M
2、Y_CODE, ; 规定CS和DS的内容v DS: MY_DATAv 6 START: MOVAX, MY_DATA ; DS初始化为MY_DATAv 7 MOVDS, AXv8 MOV AL, 2 ; 置循环初始值v9 LEA BX, BUFFv10 LLP: MOV BX, AL ;循环体v11 INC ALv12 INC ALv13 CMP AL, 100 ;循环控制v14 JNZ LLPv15 INT 20H ;返回DOSv16 MY_CODE ENDS ; 代码段结束v17 END START ; 整个程序结束v汇编语言程序的格式可以归结为以下几点:v(1) 段的结构 v段名1 SE
3、GMENT 伪指令语句定义段!v 语句1v v语句iv段名1ENDSv段名2 SEGMENTv 语句1v v 语句jv段名2ENDSvv段名n SEGMENTv 语句1v v语句kv段名n ENDSv END 标号 v(2)语句的结构v3种基本语句类型:v 指令语句v 伪指令语句v 宏指令语句v语句一般有4个部分组成,即:v 标号或名字 操作码 操作数 ;注释v标号或名字: 这是一个任选部分,在语句之首 v8 MOV AL, 2 ; 置循环初始值v9 LEA BX, BUFFv10 LLP: MOV BX, AL ;循环体v11 INC ALv12 INC ALv13 CMP AL, 100
4、;循环控制v14 JNZ LLPv15 INT 20H ;返回DOSv16 MY_CODE ENDS ; 代码段结束v17 END START ; 整个程序结束v4. 2 汇编语言中的基本数据v1、标识符v标识符-由程序员自由建立起来的,有特定意义的字符序列。v标识符的组成规则如下:v 必须由字母、数字(0,9)及特殊符号(?, ,)组成,且必须以字母打头。v 字符总数限制在31个以内。v 不能使用属于系统专用保留字(保留的字)。v4. 2 汇编语言中的基本数据v2、常数v 语句中出现的那些固定值,除了自身的值以外,没有其它任何属性。v常数分为两类v(1)数值常数 B Q D或不用 Hv(2)
5、字符串常数 不超过255个 如:D7S4v3、变量v 存放在存储器单元中的操作数,它的值是可以改变的,在程序中出现的是存储器单元地址的符号,即与某一数据项第一字节相对应的标识符。v变量的3个属性:v 段地址:变量所在段的段地址;v 偏移地址:变量所在段内的偏移地址;v 类型:所定义的每个变量所占据的字节数。v4、标号v 可执行指令语句地址的符号表示,即用标识符来表示地址。v标号的3个属性:v 段地址:与标号对应的指令首字节所在的段地址。v 偏移地址:与标号对应的指令首字节所在的偏移地址。v 类型:标号的类型属性有两种:NEAR和FAR类型。v4.3 伪指令语句v伪指令语句可分为以下几种类型:v
6、 数据定义伪指令语句v 标识符赋值与解除伪指令语句v 段定义伪指令语句v 过程定义伪指令语句v 程序开始与结束伪指令语句v 方式定义伪指令语句v 结构定义伪指令语句v 分组伪指令语句v 其它伪指令语句v1、数据定义伪指令语句v共有五条:DB、DW、DD、DQ和DT,分别用来定义字节、字、双 字、8字节和10字节。v指令格式:v变量名 助记符 操作数1,操作数2,操作数n ;注释v变量名 助记符 n DUP(操作数1,操作数2,操作数n) ;注释v例4-2 操作数是常数、表达式、字符串数据的定义v DATA1 DB 15H,25Hv DATA2 DW 9988H,56Hv DATA3 DD 2*
7、40H,0AABBHv DATA4 DB HELLO15H15H25H25H88H88H99H99H56H56H00H00H80H80H00H00H00H00H00H00HBBHBBHAAHAAH00H00H00H00H48H48H45H45H4CH4CH4CH4CH4FH4FHDATA1DATA1DATA2DATA2DATA3DATA3DATA4DATA4图4-1 例4-2的汇编结果v例4-3 操作数用“?”定义不确定值的变量,用DUP来定义重复变量,不确定值的变量一般用作保留存储空间,以便存放运算结果。v DATA1 DB ?v DATA2 DW 0D55H, ?v DATA3 DB 5
8、DUP(0)v DATA4 DW 10 DUP(?)v DATA5 DB 4 DUP(1,2 DUP(20) )图图4-2 4-2 例例4-34-3的汇编结果的汇编结果?55H55H0DH0DH00H00H00H00H00H00H00H00H00H00H?01H01H14H14H14H14HDATA1DATA1DATA2DATA2DATA3DATA3DATA4DATA4DATA5DATA5重复重复4 4次,次,共共1212个字节个字节共共2020个字节个字节?v2、标识符赋值与解除伪指令语句v共有4条:等值伪指令语句EQUv 等号伪指令语句“=”v 解除伪指令语句PURGEv 别名定义伪指令语
9、句LABELv(1)等值伪指令EQU语句v 指令格式:标识符 EQU 操作数vP128 例4-4v DATA EQU 100v DATA1 EQU DATA2v CI EQU ADDv(2)等号伪指令语句“=”v指令格式: 标识符=操作数P128 例4-5 DATA =100 DATA1 = DATA +10 SOURCE=BXSI MOV AX,SOURCE SOURCE=BX MOV CX,SOURCE v(3)解除伪指令语句PURGEv指令格式: PURGE 标识符1,标识符2,标识符nv功能:用该指令解除标识符,以后可用EQU重新定义v(4)别名定义伪指令语句v格式:别名 LABEL
10、类型属性v LABEL,伪指令助记符,不可缺省。v功能:给下一个变量或标号取另一个名字,重新定义类型,灵活vP129 例4-6 定义变量的别名 v DATAB LABEL BYTEv DATAW DW 1234H,5678Hv DISF LABEL FARv DISN MOV AX,SI v3、段定义伪指令语句v(1)段结构定义伪指令语句 SEGMENTENDSv 指令格式: 段名 SEGMENT 定位类型 组合类型 分类名 v 逻辑段内容v 段名 ENDSv 功能:将一个逻辑段的内容定义成一个整体。 v 段名:本段在存储器中的位置v 助记符:SEGMENT ENDv 参数:v 4种定位类型:
11、PARA、BYTE、WORD和PAGE P130v 6种组合类型:NONE、PUBLIC、COMMON、AT、STACK和MEMORYv 类别名:可省略,不超过40个字符,将所有分类名相同的逻辑段组成一个段组。v(2)段分配伪指令语句v指令格式:ASSUME CS:段名,DS:段名,SS:段名,ES:段名v功能:定义当前有效的4个逻辑段,指明段和段寄存器的关系,并把代码段的段基址装入CSv例4-1 试求小于100的所有非零偶数,并把结果存入以BUFF开v 始的内存区。 v 1 MY_DATA SEGMENT ; 定义数据段v 2 BUFF DB 50 DUP(?) ; 设置缓冲区v 3 MY_
12、DATA ENDS ; 定义数据段结束v 4 MY_CODE SEGMENT ; 定义代码段v 5 ASSUME CS:MY_CODE, ; 规定CS和DS的内容v DS: MY_DATAv 6 START: MOVAX, MY_DATA ; DS初始化为MY_DATAv 7 MOVDS, AXv说明:v一般放在代码段的开始,段名为用SEGMENT定义过的名字v: ,v通常代码段必须,数据段必须 vASSUME ES:NOTHING 取消 v 取消已经由ASSUME指定的段寄存器v其他的段,在代码段开始的程序中仍然需要初始化程序,把段基址装入相应寄存器v4、过程(子程序)定义伪指令语句v指令格
13、式:过程名 PROC 属性v 过程内容v RETv 过程名 ENDPv功能:定义一个在主程序中可以用CALL指令调用的过程。v CALL 过程名v说明:v过程名与属性:子程序入口的符号地址, 属性有三:v 段属性:过程所在段的段基址v 偏移地址属性:该过程第一个字节与段首之间的字节数v 距离属性: NEAR(默认) FAR v助记符:PROC ENDPv过程调用的子程序与主程序分开独立存在,经汇编后存储器中只占有一个子程序段的空间,主程序转入此处运行,因此目标代码长度短,节省空间v5、 程序开始与结束伪指令语句v共有4条伪指令语句:NAME、TITLE、ORG和END。v(1)目标模块命名伪指
14、令语句v 格式:NAME 程序名;定义一个程序名,程序每一页开头输出v TITLE 文本名;v 功能:为源程序目标模块赋一个程序名。v(2)定位伪指令语句v 格式:ORG 表达式v 功能:下一条语句的起始偏移位置v ORG $+6v例4-7 用ORG指定数据段和代码段地址。v DATA SEGMENTv X1 DW 20H,60H,v ORG 100Hv X2 DB 10H,20H,30Hv ORG 200Hv X3 DW 1234H, 4321Hv DATA ENDSvCODE SEGMENTv ORG 100Hv ASSUME CS:CODE,DS:DATAv START: MOV AX,
15、DATAv v CODE ENDSv(3)程序结束伪指令语句v格式: END 标号名v例4-8 程序结束伪指令语句的应用v CODE SEGMENTv START:MOV AX,BX v MOV CX,12Hv v CODE ENDSv END START vSTART为程序开始执行的起始地址v6、 方式定义伪指令语句v汇编语言有两种操作方式:8086和80386v格式: .8086 默认的v .386 使用32位寄存器必须加v功能:定义汇编程序的操作方式v7、 结构定义伪指令语句v有三条语句:结构定义伪指令,结构存储分配和预置伪指令及结构使用伪指令。v(1)结构定义伪指令语句v格式:结构名
16、STRUCv 数据变量序列 ;为DB、DW等;v 结构名 ENDSv例4-9 定义一个数据表格TAB的结构v TSTRU STRUCv DA1 DB SXYZv DA2 DW ?v DA3 DW SEG LP1v DA4 DW 2 DUP(3)v DA5 DW 5678H,1234Hv TSTRU ENDSv只定义,汇编时不产生目标代码,不分配空间v v字符串、简单变量、多重变量v(2) 结构存储分配和预置伪指令语句v格式:结构变量名 结构名 元素值,元素值v 结构变量名 结构名 N DUP(元素值,元素值)v例4-10 对例4-9中的TAB结构进行存储空间分配和预置,形成4个结构变量。P4-
17、10v DATA1 TSTRU v DATA2 TSTRU FROMv DATA3 TSTRU ,7FH,SEG LLLv DATA4 TSTRU 5 DUP(7890,11H)v 连续预置了5个相同的结构变量,每个结构变量的 v 第一个元素和第二个元素为7890 和 11Hv(3) 结构使用伪指令语句v 格式:结构变量名字段变量 DATA1.DA1=FORMv 功能:给出了不同结构变量名的数据结构中的变量元素值v 设当前数据段基址为1000H,结构变量DATA1的偏移地址为100H,则例4.10中的4个结构变量在存储器中的地址分配如图4-3所示。 v 经过预置的结构变量,具有三属性:v 段属
18、性、偏移地址属性、类型属性BYTE WORD DWORD(a)DATA1 TSTRU (c)DATA3 TSTRU (b) DATA2 TSTRU (d)DATA4 TSTRU 5 DUP()S SX XY YZ Z? ? ?SEG LP1SEG LP1低低SEG LP1SEG LP1高高03H03H00H00H03H03H00H00H78H78H56H56H34H34H12H12H10100H10100H(a a)F FR RO OM M? ? ?SEG LP1SEG LP1低低SEG LP1SEG LP1高高03H03H00H00H03H03H00H00H78H78H56H56H34H34
19、H12H12H10110H10110H(b b)S SX XY YZ Z7FH7FH00H00HSEG LLLSEG LLL低低SEG LLLSEG LLL高高03H03H00H00H03H03H00H00H78H78H56H56H34H34H12H12H10120H10120H(c c)7 78 89 90 011H11H00H00HSEG LP1SEG LP1低低SEG LP1SEG LP1高高03H03H00H00H03H03H00H00H78H78H56H56H34H34H12H12H10130H10130H(d d)重重复复5 5次次v8、 分组伪指令语句v格式:组名 GROUP 段
20、1,段2,v功能:将段1、段2等逻辑段放在同一个64KB的物理段内,并给它起一个新的名字。v例4-11v v GROUP1 GROUP SEG1,SEG2,SEG3v ASSUME DS:GROUP1v MOV AX,GROUP1v MOV DS,AXv MOV BX,GRPUP1:VAR1 v v9、 其它伪指令语句v(l)外部伪指令语句v格式:PUBLIC 名称1,名称2,v EXTRN 名称1:类型,名称2:类型, v功能:PUBLIC定义全局标识符,名称在本模块中定义的v EXTRN指出外部标识符,名称为在其他模块中用PUBLIC定义的v类型:BYTE WORD NEAR FAR 常数
21、为ABSv例4-12 用EXTRN和PUBLIC语句实现模块间标识符的交叉访问v模块1v EXTRN DATA2:BYTE, SUBTR1:NEAR v PUBLIC TABLE, DATA1v DSEG SEGMENT v TABLE DB 100 DUP(?)v DATA1 DW ?v DSEG ENDSvCODE SEGMENT v ASSUME CS:CODE, DS:DSEGv v MOV AX, DSEGv MOV DS, AXv v MOV AL, DATA1v CALL SUBTR1v v MOV AX, SEG DATA2v MOV ES, AXv MOV BX, ES:DA
22、TA2v vCODE ENDSv ENDv模块2v EXTRN TABLE:BYTEv PUBLIC SUBTR1, DATA2v DSEG SEGMENT v DATA2 DB ?v v DSEG ENDSv CODE SEGMENT v v SUBTR1: v v CODE ENDSv ENDv(2)对准伪指令语句v格式:EVEN ;下一个语句的地址调整为偶地址v 例4-13 EVEN直接放在某一语句前,汇编程序汇编时就会完成将地址调整在偶地址上。v DATA SEGMENTv ORG 100H v A1 DB 0DHv EVENv A2 DW 100 DUP(?)v DATA ENDS
23、v(3)条件汇编伪指令语句v一般格式是:v IF ;如果条件成立v ELSE ;否则v END IF ;结束条件汇编语句 vIF有多种形式,它们是:P138v IF 操作数 IFE 操作数v IFDEF 标号或变量 IFNDEF 标号或变量v IFB IFNB v IFIDN , v IFDIF ,v IF1 IF2v v4.4 汇编语言中的表达式v表达式-运算对象和运算符组成。汇编语言中有类运算v符,即:v算术运算符;v逻辑运算符;v关系运算符;v分析运算符;v修改属性运算符;v其它运算符 。 v、算术运算符v算术运算符有:加()、减()、乘(*)、除()、取模运算(MOD)、左移(SHL)
24、和右移(SHR)。v取模运算是取两数相除的余数,对象必须为正整数。v例如:v 92 MOD 16 结果为12(相当于取低4位的值)v 97H MOD 20H 结果为23(相当于取低5位的值)v 33H MOD 7 结果为2v例4-14 包含乘法和减法算术运算符的表达式v DATA SEGMENTv ARY DB 10,20,30,40,50v TY DB 20v DATA ENDSv CODE SEGMENTv MOVBX, 50*4v MOVCX, (TY-ARY)v v CODE ENDS v例4-15 源程序包含除法、减法、模运算和移位运算的表达式v DATA SEGMENTv KA E
25、QU 900v DATA ENDSv CODE SEGMENTv MOV BX, KA-70v MOV AX, KA MOD 100v MOV CX, KA/100v MOV DH, 01100100B SHR 3v v CODE ENDSMOV BX,830MOV AX,0MOV CX,9MOV DH,0CHv2、逻辑运算符v逻辑运算符有:与(AND)、或(OR)、非(NOT)和异或(XOR) v例 4-16 AND、OR、NOT、XOR逻辑运算的表达式v MOV AL,NOT 0AAH ;含有表达式NOT 0AAHv MOV BL,23H AND 0FH ;含有表达式23H AND 0FH
26、v MOV CH,24H OR 0F0H ;含有表达式24H OR 0F0H v MOV DH,25H XOR 0FFH ;含有表达式25H XOR 0FFHv汇编时,汇编程序对表达式进行计算,汇编后相应的指令变成:v MOV AL,055Hv MOV BL,03Hv MOV AH0F4Hv MOV CH,0DAHv3、关系运算符v关系运算符有:相等 EQ、不等 NE、小于 LT、大于 GT、小于 或等于 LE、大于或等于。v 4、分析运算符v分析运算符有:OFFSET、SEG、TYPE、LENGTH、SIZEv(1)OFFSETv 格式:OFFSET 变量或标号 ;取偏移地址v v例4-17
27、 用OFFSET返回标号或变量偏移地址值的表达式v DATA SEGMENTv v DAT1 DB 81H v DATA ENDSv CODE SEGMENTv MOV SI,OFFSET LAB1v v LAB1: MOV BX,OFFSET DAT1v v CODE ENDSv(2)SEGv 格式:SEG 变量或标号 ; 取段基址v(3)TYPEv 格式:TYPE 变量或标号 ;返回类型和距离v表4-1 TYPE运算符返回值 变变 量量标标 号号类型类型DBDBDWDWDDDDDQDQDTDTNEARNEARFARFAR返回值返回值1 12 24 48 81010-1-1-2-2v例 4-
28、18 TYPE加在变量和标号前的表达式v DATA EGMENTv XX1 DW 40H, 14Hv XX2 DD 1048Hv XX3 DB 30H,31H,32Hv DATA ENDSv CODE SEGMENTv LP1: MOV AL,TYPE XX1v MOV BL,TYPE XX2v ADD AH,TYPE XX3v MOV BH,TYPE LP1v CODE ENDS汇编时,汇编软件首先把表达式计算成常数,汇编后的相应指令如下: LP1: MOV AL, 2 MOV BL, 4 ADD AH, 1 MOV BH,0FFHv(4) LENGTHv格式:LENGTH 变量 v 返回变
29、量的个数,只有当变量中使用DUP时,才返回个数,否则为1v例 4-19 LENGTH加变量的表达式v DATA SEGMENTv XX1 DD 150 DUP (?)v XX2 DW ?,12,13v XX3 DB HOW ARE YOUv DATA ENDSv CODE SEGMENTv MOV AX, LENGTH XX1v MOV AL, LENGTH XX2v MOV BL, LENGTH XX3v CODE ENDS汇编后的相应指令如下: MOV AX,150 MOV AL,1 MOV BL,lv(5) SIZEv格式:SIZE 变量 ;返回变量所包含的总字节数v把例4-19中含有L
30、ENGTH表达式改为SIZE表达式,即:v MOV AX, SIZE XX1v MOV AL, SIZE XX2v MOV BL, SIZE XX3v汇编后的相应指令如下:v MOV AX,600v MOV AL,2 v MOV BL,lSIZE=LENGTH*TYPEv5、修改属性运算符(综合运算符)v修改属性运算符有:段操作符、PTR、THIS、HIGH、LOW、 SHORT v(1) 段操作符v 格式: 段前缀 : 变量或地址表达式v(2) PTRv 格式: 类型 PTR 变量v 距离 PTR 标号 ;将左边赋给右边v例 4-20 带PTR表达式的变量v DATA SEGMENTv CC
31、1 DB 16H,36Hv CC2 DW 1122H,3344Hv DATA ENDSv CODE SEGMENTv LL1: MOV AX,WORD PTR CC1v MOV BL,BYTE PTR CC2v MOV BYTE PTR BX, 10Hv MOV WORD PTR BX, 10Hv v JMP FAR PTR LL1v v CODE ENDS v(3) THISv格式: 变量 EQU THIS 类型 ;将右边赋给左边v 标号 EQU THIS 距离 v例如:v DATA1 EQU THIS BYTEv TABLE DW 200 DUP(?)v又如:v LL1 EQU THIS
32、FARv MOV AX,100DATA1的偏移地址值与TABLE相同,但DATA1为字节,TABLE为字!给MOV AX,100前的标号LL1修改距离为FARv(4) SHORTv 格式:SHORT 标号v 功能:指出转移类指令,目的地址范围在-128127间v(5) HIGH和 LOWv 它们称为字节分离运算符v 格式: HIGH 变量或标号 ;分别 分离高低字节部分v LOW 变量或标号v v例4-21 带HIGH和 LOW表达式的变量v DATA SEGMENTv BB1 EQU 1234Hv BB2 EQU 0A0B0Hv DATA ENDSv CODE SEGMENTv MOV AH
33、,HIGH BB1v MOV BL,LOW BB2v CODE ENDSv6、其它运算符 不介绍v7、注意点: v(1)注意表达式中各运算符和操作符的优先级 P145v(2)注意数制统一 :v 计算时将数据统一成同一进制数表示v4.5 指令语句v指令语句的格式:v 标号: 前缀指令 助记符 操作数 ;(注释)v(1) 立即寻址和直接寻址的表示形式v例4-22 立即寻址和直接寻址在表示形式上的区别v DATA SEGMENTv BB1 EQU 1234Hv BB2 DW 0A0B0Hv DATA ENDSv CODE SEGMENTv MOV AX, BB1v MOV BX, BB2v MOV
34、CX, BB1v CODE ENDSv(2) 基址寄存器加变址寄存器寻址的表示形式v有两种表示形式:v MOV AX,BXSIv MOV AX,BX+SI v(3) 相对寄存器寻址的表示形式v例4-23 相对寄存器寻址的两种表示形式v DATA SEGMENTv MYDAT DB 100 DUP(?)v DATA ENDSv CODE SEGMENTv v MOV AX, MYDATBXv MOV AX, MYDAT+BX v MOV CX, MYDATBXSIv MOV CX, MYDAT+BX+SIv CODE ENDS DATA1的偏移地址值与TABLE相同,但DATA1为字节,TABL
35、E为字!v4. 6 宏指令语句及其使用v1、宏定义v宏定义格式:v 宏指令名 MACRO 形式参数1,形式参数2v 宏体 ;程序代码v ENDMv2、宏调用v宏调用格式:v 宏指令名 实际参数1,实际参数2v3、宏展开 v例4-24 无形式参数的宏定义、宏调用及宏展开v宏定义:vPUSHAB MACROv PUSH AXv PUSH BXv ENDMv宏调用: PUSHABv宏展开: + PUSH AXv + PUSH BX v例4-25 带形式参数的宏定义、宏调用及宏展开v宏定义:v LDSF MACRO PR,VAR, N,REG,CCv MOV PR,VARv MOV AX,PRv MO
36、V CL, Nv S&CC REG, CLv ENDMv宏调用1: LDSF SI,WVAR1,4,AX,ARv宏调用2: LDSF DI,WVAR2,3,BX,ALv宏展开1: +MOV SI,WVAR1v +MOV AX,SIv +MOV CL, 4v +SAR AX, CLv宏展开2: +MOV DI,WVAR2v +MOV AX,DIv +MOV CL, 3v +SAL BX, CLv4、宏嵌套v(1)宏定义中使用宏调用v例4-26 设在程序的数据段已经定义了变量X,Y,Z,试计算X+YZ,并要求保护所有使用的寄存器。 v宏定义:vDBF MACRO P, Qv MOV BX, Pv
37、MOV AX, Q v ADD AX, BXv ENDMvDBFS MACRO X1, X2, X3v PUSH AXv PUSH BXv DBF X1, X2v MOV X3, AXv POP BXv POP AXv ENDMv宏调用: DBFS X,Y,Zv宏展开: +PUSH AXv +PUSH BXv +MOV BX, Xv +MOV AX,Yv +ADD AX, BXv +MOV Z, AXv +POP BXv +POP AX v(2)宏定义中包含宏定义v 例4-27 设在程序的数据段已经定义了变量X,Y,Z,试共用一个宏定义,计算X+YZ、X-YZ、X AND YZ,并要求保护所有
38、使用的寄存器。v宏定义:vDEFM MACRO MNAME,OPENvMNAME MACRO C1,C2,C3v PUSH AXv MOV AX,C1v OPEN AX,C2v MOV C3,AXv POP AXv ENDMv ENDMv宏调用定义加法:v DEFM ADDIT,ADDv宏调用定义减法:v DEFM SUBT,SUBv宏调用实现 X + YZ:v ADDIT X,Y,Zv宏展开: +PUSH AXv +MOV AX,Xv +ADD AX,Yv +MOV Z,AXv +POP AXv宏调用实现 X - YZv SUBT X,Y,Zv宏展开: +PUSH AXv +MOV AX,X
39、v +SUB AX,Y v +MOV Z,AXv +POP AXv v5、宏定义中的标号与变量 v定义局部标号的格式:v LOCAL 参数1、参数2、参数n v功能:放在宏体第一行,参数为宏体中用到的标号和变量v 局部标号或变量定义后,宏展开时程序中出现的各标号或变量依次用? 0000,? 0001,? 0002,? 0003代替v6、其它宏指令语句v(1)取消宏指令语句v格式:PURGE 宏指令名1,宏指令名2宏指令名nv功能:取消宏指令名,以后可重新定义v(2) 重复执行宏指令语句v 格式: REPT 表达式v 宏体v ENDMv功能:连续重复完成相同的操作,次数为表达式所给的值v7、宏指
40、令与子程序的区别v主要区别在以下几个方面:v 1)宏指令调用比子程序调用执行速度快:v 子程序调用需要入栈和出栈v 2)过程调用使用CALL语句实现,在CPU执行时进行处理,而宏指令调用由宏汇编软件MASM中的宏处理程序来处理。v v7、宏指令与子程序的区别v3)子程序比宏指令节省内存空间:v 过程调用的子程序与主程序分开独立存在,经汇编后存储器中只占有一个子程序段的空间,主程序转入此处运行,因此目标代码长度短,节省空间v 而宏调用在汇编过程中展开,宏调用多少次,就插入多少次宏体,因此目标代码长,占内存空间多。v7、宏指令与子程序的区别v4)宏指令比子程序灵活:v 子程序一般完成某一个功能,仅
41、入口参数可以改变,而宏指令可以带形式参数,调用时可以用实际参数取代,使不同的调用完成不同的操作。v4.7 DOS系统功能调用 P379 vP378 附录C DOS功能调用表INT21Hv1、常用的DOS软中断 P152 表4-2v(1)程序结束软中断v1) INT 20Hv调用格式举例: INT 20Hv功能:终止当前进程,关闭所有打开的文件,清除磁盘缓冲区,返回控制台的命令接收状态,不需要任何的入口参数,放在程序之后v2)INT 21Hv该软中断又有三种情况:无返回程序结束、程序结束并驻留和带 返回程序结束。v无返回程序结束的调用格式:v MOV AH,0v INT 21H程序退出,需入口参
42、数AH=0(调用功能号)v程序结束并驻留的调用格式举例:v MOV AH,31Hv MOV AL,1v MOV DX,400Hv INT 21H v带返回程序结束的调用格式举例:v MOV AH,4CHv MOV AL,1v INT 21H AH为功能号,AL返回号,DX保留从程序段前缀开始的内存长度程序退出,并返回代码为1,同时驻留内存,保留从程序段前缀开始的16KB内存。AH为功能号,AL返回号程序退出,并返回代码为1v3) INT 27Hv调用格式举例:v MOV DX,XXv INT 27H程序退出,DX保留从程序段前缀开始的内存长度,作为系统的一个组成部分,不被覆盖!v(2)磁盘扇区
43、读与写v 调用格式举例:v MOV AL,0 v MOV CX,4v MOV DX,4v MOV BX,3000H v INT 25HAL读写驱动器号CX读写扇区数DX起始逻辑扇区号BX读写内存的缓冲区首地址v表4-2 常用的DOS软中断 软中断指令软中断指令功能功能入口参数入口参数出口参数出口参数INTINT21H21H程序正常退出程序正常退出无无无无INTINT21H21H系统功能调用系统功能调用AHAH功能号,相应入口号功能号,相应入口号相应出口号相应出口号INTINT22H22H结束退出结束退出INTINT23H23HCtrl+BreakCtrl+Break处理处理INTINT24H2
44、4H出错退出出错退出INTINT25H25H读磁盘读磁盘ALAL驱动器号驱动器号CXCX读入扇区数读入扇区数DXDX起始逻辑扇区号起始逻辑扇区号DSDS:BXBX内存缓冲区地址内存缓冲区地址CFCF0 0成功成功CFCF1 1出错出错INTINT26H26H写磁盘写磁盘ALAL驱动器号驱动器号CXCX写入扇区数写入扇区数DXDX起始逻辑扇区号起始逻辑扇区号DSDS:BXBX内存缓冲区地址内存缓冲区地址CFCF0 0成功成功CFCF1 1出错出错INT27H驻留下退出驻留下退出DS:BX程序长度程序长度2、 DOS系统功能调用DOS系统功能可分为三个方面:设备管理、文件管理和目录管理设备管理包括
45、:键盘输入、显示输出、设置磁盘缓冲器、选择当 前盘等功能调用;文件管理包括:建立文件、打开文件、读写文件、删除文件等 功能调用;目录管理包括:查找目录项、更改目录项、建立子目录、删除子 目录等功能调用。 v(1)显示功能调用v1) 单字符显示v调用格式举例:v MOV DL, *v MOV AH, 2v INT 21Hv 2) 字符串显示 v调用格式举例:v 在屏幕上显示HOW ARE YOU?字符串2号功能调用,显示期间检测Ctrl+Break6号功能调用,显示期间不检测Ctrl+BreakvDATA SEGMENTv CR EQU 0DHv LF EQU 0AHvDAT1 DB HOW A
46、RE YOU?,CR,LF,vDATA ENDSvCODE SEGMENTv ASSUME CS:CODE,DS:DATAvSTART: MOV AX,DATAv MOV DS,AXv MOV DX,OFFSET DAT1v MOV AH,9v INT 21Hv MOV AH,4CHv INT 21Hv CODE ENDSv END START v(2)键盘功能调用AH功能功能入口参数入口参数出口参数出口参数1从键盘输入一个字符,并在屏从键盘输入一个字符,并在屏幕上回显,检查幕上回显,检查Ctrl+BreakCtrl+Break键键AL字符字符6直接控制台输入输出字符,直接控制台输入输出字符,
47、回显,不检查回显,不检查Ctrl+BreakCtrl+Break键键DL0FFHAL字符字符7直接输入字符,无回显,不检直接输入字符,无回显,不检查查Ctrl+BreakCtrl+Break键键AL字符字符8键盘输入字符,无回显,检查键盘输入字符,无回显,检查Ctrl+BreakCtrl+Break键键AL字符字符0AH 输入字符串到内存缓冲区输入字符串到内存缓冲区DS:DX缓冲区首址缓冲区首址0BH 检查键盘输入状态检查键盘输入状态ALFFH有键入有键入AL0无键入无键入0CH清键盘缓冲区,调用键盘输入清键盘缓冲区,调用键盘输入功能功能AL键盘功能号(键盘功能号(1,6,7,8,A)表4-3
48、 DOS键盘功能调用v1) 单字符键盘输入v调用格式举例:从键盘输入字符并显示v MOV AH,1v INT 21Hv2)字符串键盘输入v调用格式举例:从键盘输入一个字符串,将输入的字符数送CL寄存器,并将指针指向字符串的第一个字符。v v DATA SEGMENTv BUFF DB 300v DB ?v DB 300 DUP(?)v DATA ENDSv CODE SEGMENTv ASSUME CS:CODE,DS:DATAv START: MOV AX,DATAv MOV DS,AXv MOV DX,OFFSET BUFFv MOV AH,0AHv INT 21H v MOV BX, D
49、Xv MOV CL, BX1v ADD DX, 2v v CODE ENDSv END START1.P121 7至至10题题2.P160 1题、题、5题、题、8题题3.请写出汇编语言程序完整的框架。请写出汇编语言程序完整的框架。4.一个小于一个小于16的数存放在的数存放在X单元中,计算该数单元中,计算该数的平方,结果保存到的平方,结果保存到Y单元中。单元中。 P1975.试编写程序实现如下功能,将两个试编写程序实现如下功能,将两个4字节的字节的无符号数相加,结果存入无符号数相加,结果存入S开始的开始的5个字节个字节的存储区域中。的存储区域中。 P174vDA1 SEGMENTv X DB 12H ;语句ivDA1 ENDSvED1 SEGMENTv Y DW 0 ;语句ivED1 ENDSvS1 SEGMENT STACK v DW 64 DUP(?)vSTACK ENDSvCODE SEGMENTv ASSUME CS: CODE,DS:DA1,ES:ED1,SS:S1 START:MOV AX,DA1 MOV DS,AX MOV AX,ED1 MOV ES,AX MOV AX,S1 MOV SS,AX . MOV AH,4CH INT 21H CODEENDSEND START