汇编语言语法和DOS功能调用.ppt_第1页
汇编语言语法和DOS功能调用.ppt_第2页
汇编语言语法和DOS功能调用.ppt_第3页
汇编语言语法和DOS功能调用.ppt_第4页
汇编语言语法和DOS功能调用.ppt_第5页
已阅读5页,还剩66页未读 继续免费阅读

VIP免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章 汇编语言语法和DOS功能调用,4.1 汇编语言源程序 1.机器语言用二进制数来表示指令和数据. 例如:B0 64 2.汇编语言用助记符,符号地址以及标号等符号书写的程序。 例如:MOV AL,64H ; 用汇编语言编写的程序叫源程序。 3.高级语言接近自然语言、习惯的教学语言来描述具体的算法。,三种语言的比较,为什么还要学习和使用汇编语言呢? 主要有三点原因: 程序设计人员能更充分地利用机器硬件的全部功能,发挥机器长处。 底层的一些功能仍然靠汇编语言程序来实现。 汇编语言程序比高级语言程序的目标代码短且运行速度快。在要求节省内存空间和提高程序运行速度的重要场合(如实时控制等)常用汇编语言来编制。,用汇编语言编写的程序不能由机器直接执行,而必须经汇编程序翻译成机器语言程序。汇编语言指令与翻译成的机器语言指令之间基本是一一对应的关系。 汇编过程示意:,汇编语言程序的建立及汇编过程,汇编示意图,4.1 汇编语言程序格式 示例程序,DATA SEGMENT ;数据段 NUM DW 0011101000000111B NOTES DB The result is : , $ DATA ENDS CODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA BEGIN: MOV AX, DATA MOV DS,AX MOV DX,OFFSET NOTES ;显示提示信息 MOV AH,9H INT 21H MOV BX,NUM ;将数装入BX MOV CH,4 ;CH作循环计数器,示例程序(续),ROTATE : DISPLAY: MOV CL, 4 ;CL中放移位位数 MOV DL, AL ;显示16进制数 ROL BX,CL MOV AH,2 MOV AL,BL INT 21H AND AL,0FH ;AL中为一位16进制数 DEC CH ADD AL,30H ;转换为ASCII码值 JNZ ROTATE CMP AL,9 ;是09的数码? MOV AX,4C00H;返回DOS JLE DISPLAY INT 21H ADD AL,07H ;在AF之间 CODE ENDS ;代码段结束 END BEGIN ;模块结束,堆栈段定义格式,STACK SEGMENT STACK STA DB 50 DUP (?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS, AX MOV SP,TOP : CODE ENDS END START,汇编语言程序的格式可以归结为以下几点:,(1) 段的结构 段名1 SEGMENT 语句1 语句i 段名1 ENDS 段名2 SEGMENT 语句1 语句j 段名2 ENDS ,段名n SEGMENT 语句1 语句k 段名n ENDS END 标号,(2)语句的结构 3种基本语句类型: 指令语句 伪指令语句 宏指令语句,指令语句格式 标号: 指令助记符 操作数 ;注释 标号字段:是一个任选字段,性质为符号便移量,一般用于标记跳转指令的目的地址在汇编过程中标号会被替换为一个位的数值偏移量标号必须位于语句开头,结尾必须使用冒号。 指令助记符和操作数:这两个字段组成汇编指令本身,指令助记符是必不可少的,操作数则根据指令助记符来确定在汇编过程中,也只有这两个字段会被替换为确定的机器指令代码。 注释字段:是一个任选字段,用于说明程序片段或指令的功能,汇编过程中不处理这样的字段,它只是用于提高源程序的可读性注释必须使用分号作为开始。 例子:教材138 例1,伪指令语句格式 伪指令语句:这种语句用于指示汇编程序(翻译程序)如何汇编源程序和指令语句不同,汇编程序处理它时不会产生机器指令代码,只对伪指令提出的要求进行解释并立即完成要求的操作 伪指令的功能大致有分配存储单元、计算表达式、定义常量等等。,4. 2 汇编语言中的基本数据 1、标识符 标识符-由程序员自由建立起来的,有特定意义的字符序列。 标识符的组成规则如下: 必须由字母、数字(0,9)及特殊符号(?, ,)组成,且必须以字母打头。 字符总数限制在31个以内。 不能使用属于系统专用保留字(保留的字)。,2、常数 常数-语句中出现的那些固定值,除了自身的值以外, 没有其它任何属性。 常数分为两类 (1)数值常数 (2)字符串常数,(1)数值常数 (2)字符串常数 字符串常数是用单引号引起来的一个或多个字符。字符串常数是以各字符的ASC码表示的。如A用41H 表示,字符串A1B2用41H,41H,42H,42H表示。,3、变量 变量-存放在存储器单元中的操作数,它的值是可以改变 的,在程序中出现的是存储器单元地址的符号,即 与某一数据项第一字节相对应的标识符。 变量的3个属性: 段地址:变量所在段的段地址; 偏移地址:变量所在段内的偏移地址; 类型:所定义的每个变量所占据的字节数。 4、标号 标号-可执行指令语句地址的符号表示,即用标识符来表示地址。 标号的3个属性: 段地址:与标号对应的指令首字节所在的段地址。 偏移地址:与标号对应的指令首字节所在的偏移地址。 类型:标号的类型属性有两种:NEAR和FAR类型。,1、数据定义伪指令语句 共有五条:DB、DW、DD、DQ和DT,分别用来定义字节、字、双字、8字节和10字节。 指令格式: 变量名 助记符 操作数1,操作数2,操作数n ;注释 变量名 助记符 n DUP(操作数1,操作数2,操作数n) ;注释 注:操作数可以是常数或表达式,变量名,注释可有可无。,例4.2 操作数是常数、表达式、字符串数据的定义 DATA1 DB 10H,52H DATA2 DW 1122H,34H DATA3 DD 5*20H,0FFEEH DATA4 DB HELLO,例4.3 操作数用“?”定义不确定值的 变量,用DUP来定义重复变量,不确定 值的变量一般用作保留存储空间,以 便存放运算结果。 DATA1 DB ? DATA2 DW 0D55H, ? DATA3 DB 5 DUP(0) DATA4 DW 10 DUP(?) DATA5 DB 4 DUP(1,2 DUP(20),例4.4 BUFFER DW 3,4,$+3 设BUFFER的偏移地址为0088H,则汇编后如下图所示:,2、标识符赋值与解除伪指令语句 共有4条:等值伪指令语句EQU 等号伪指令语句“=” 解除伪指令语句PURGE 别名定义伪指令语句LABEL (1)等值伪指令EQU语句 指令格式: 标识符 EQU 操作数 例4.5 DATA EQU 100 DATA1 EQU DATA2 CI EQU ADD,(2)等号伪指令语句“=” 指令格式: 标识符=操作数 例4.6 DATA =100 DATA1 = DATA +10 SOURCE=BXSI MOV AX,SOURCE SOURCE=BX MOV CX,SOURCE 注:“” 允许重复定义,而 EQU一经定义不再重新定义。,(3)解除伪指令语句PURGE 指令格式: PURGE 标识符1,标识符2,标识符n (4)别名定义伪指令语句 格式:别名 LABEL 类型属性 LABEL:伪指令助记符,不可缺省。 例4.7 定义变量的别名 DATAB LABEL BYTE DATAW DW 1234H,5678H DISF LABEL FAR DISN: MOV AX,SI,3、段定义伪指令语句,因8086/8088 CPU的存储器是分段的,这就需要有段定语 句。 与段有关的伪指令有:SEGMENT、ENDS和ASSUME,含义分 别是段开始、段结束、指定段寄存器。 (1)段结构定义伪指令 格式: 段名 SEGMENT定位类型组合类型类别 段名 ENDS 从段名代表的段基值开始定义一个段。其中的定位类型、组合类型和类别一般都可省略,若不省略时各项的顺序不能变。, 定位类型: 连接时用于指定该段应开始于什么样的物理地址。可选择下列4种之一: BYTE: 从当前可用的字节地址XXXX XXXX XXXX XXXX XXXX(任一地址)开始; WORD: 从当前可用的字地址XXXX XXXX XXXX XXXX XXX0(偶数地址)开始; PARA(缺省): 从当前可用的节地址XXXX XXXX XXXX XXXX 0000(16的倍数)开始; PAGE: 从当前可用的页地址XXXX XXXX XXXX 0000 0000(256的倍数)开始。 其中,1节(paragraph) 为16字节,1页为16节即256字节。, 组合类型: 连接时用于指定同名的各段之间的组合方式。可选择下列6种之一: PUBLIC STACK COMMON MEMORY AT表达式 NONE(缺省) 若省略组合类型或说明为NONE类型,则表示各个段不组合,各有自己的段基值。 对堆栈段,必须用STACK类型说明,不能省略。, 类别: 是要将组合后的各段按类别分类存放,同类别的段 将被相邻地放在一起。类别是由用户定义的、用一对引号括起来的 长度不超过40个字符的名字(标识符)。,SEGMENT和ENDS这两个伪指令总是成对出现,二者前面的段名一致。二者之间的删节部分,对数据段、附加段及堆栈段,一般是符号、变量定义等伪指令。对于代码段则是指令及伪指令。 此外,还必须明确段和段寄存器的关系,这可由ASSUME语句来实现。,(2) 段分配伪指令ASSUME 该语句必须出现在有关的变量及标号使用之前,定义当前有效的4个逻辑段,用于指定程序中所定义的段与各段寄存器之间的对应关系,指示汇编程序在汇编过程中如何确定指令隐含使用的段寄存器。指定某段(用段名标识)中的变量、标号等数据项由哪个段寄存器寻址。 ASSUME语句是伪指令,它不能给段寄存器传送段基值,只能指定段与段寄存器之间的对应关系。该伪指令的作用时间也是在汇编阶段,不是在程序的执行阶段。,在程序设计中,一般ASSUME语句在代码段中位于所有指令语句之前。 注意:把段基值装入段寄存器这一个过程是在程序执行阶段完成的。即便程序中使用了ASSUME语句,如果在程序执行阶段各段寄存器没有装入正确的段基值,那么仍然不能正确的访问内存中的数据。,段寄存器的装入 (1)CS段寄存器的装入 CS段寄存器和IP指令指针的初始化是由操作系统来完成的。当用户向操作系统提交一个程序时,操作系统会自动把程序中第一条指令的逻辑地址装入到CS和IP中。在这之后,CPU就会从这条指令开始执行,并且不断修改IP中的内容使它指向下一条指令。,(2)DS、ES 、SS段寄存器的装入 和CS段寄存器的装入方式不同,DS、ES的段基值装入必 须由程序员使用MOV指令在自己的程序中来完成。 例子见教材P138,注意例子41中的ASSUME语句。 对DS、ES段寄存器的初始化指令一般在代码段的最开 始,因为以后的指令可能会频繁的访问数据段或附加段的数 据,只有先保证段寄存器中的段基值正确,后面的数据操作 才是正确的。,ASSUME 段寄存器名:段名, 段寄存器名:段名.,告诉汇编程序用SEGMENT伪操作定义过的段的段地址将要存放在哪个段寄存器中。,但真正把段地址装入段寄存器(称为段初始化)的操作需要由程序员自己完成,MOV AX,DATA MOV DS,AX MOV ES,AX 这些语句实现了将段基址装入段寄存器。 如程序中用到堆栈段,也需装入实际的初值。而代码段不需要用户装,由初始化程序装入。,4、过程定义伪指令语句,在MASM中,过程的含义和子程序是一样的,一个过程可以被其它程序所调用,这个过程的最后一条指令,一般是返回指令。 过程定义伪指令的格式为: 过程名 PROC NEAR/FAR RET 过程名 ENDP,调用一个过程的格式为: CALL 过程名,例如,有两个程序段,其结构如下: CODE1 SEGMENT ASSUME CS:CODE1 FARPROC PROC FAR RET FARPROC ENDP CODE1 ENDS CODE2 SEGMENT ASSUMECS:CODE2 CALL FARPROC CALL NEARP NEARP PROC NEAR RET NEARP ENDP CODE2 ENDS,5、定位伪指令 伪指令ORG规定了段内的起始地址或偏移地址,其格式为: ORG 表达式的值即为段内的起始地址或偏移地址,从此地址起连续存放程序或数据。,例4.8 用ORG指定数据段和代码段地址。 DATA SEGMENT X1 DW 20H,60H, ORG 100H X2 DB 10H,20H,30H ORG 200H X3 DW 1234H, 4321H DATA ENDS CODE SEGMENT ORG 100H ASSUME CS:CODE,DS:DATA START: MOV AX,DATA CODE ENDS,4.4 汇编语言的表达式,表达式由运算对象和运算符组成。在汇编的时候由汇编程序对它进行运算,其运算结果作为语句中的操作数来使用。 运算对象可以是常数、变量和标号,运算结果可以是常数,也可以是存储器的地址,若该地址中存放的是数据则称它为变量,若该地址中存放的是指令则称它为标号。 下面介绍五种运算符: 算术运算符 逻辑运算符 关系运算符 分析运算符 修改属性运算符,、算术运算符 算术运算符有:加()、减()、乘(*)、除()、取 模运算(MOD)、左移(SHL)和右移(SHR)。 取模运算是取两数相除的余数,对象必须为正整数。 例如: 92 MOD 16 结果为12(相当于取低4位的值) 97H MOD 20H 结果为23(相当于取低5位的值) 33H MOD 7 结果为2,例4.15 包含乘法和减法算术运算符的表达式 DATA SEGMENT ARRAY DB 1,2,3,4,5,6 TRY DB 20 DATA ENDS CODE SEGMENT MOV BX, 30*5 MOV CX, (TRY-ARRAY) CODE ENDS,例4.16 源程序包含除法、减法、模运算和移位运算的表达式 DATA SEGMENT KA EQU 800 DATA ENDS CODE SEGMENT MOV BX, KA-80 MOV AX, KA MOD 100 MOV CX, KA/100 MOV DH, 01100100B SHR 2 CODE ENDS,2、逻辑运算符 逻辑运算符有:与(AND)、或(OR)、非(NOT)和异或(XOR) 例 4.17 AND、OR、NOT、XOR逻辑运算的表达式 DATA SEGMENT PORT EQU 81H DATA ENDS CODE SEGMENT MOV AL,NOT 0FFH MOV BL,8CH AND 73H MOV AH,8CH OR 73H MOV CH,8CH XOR 73H CODE ENDS,3、关系运算符 共有6个,它们为: EQ(相等), NE(不等), LT(小于), GT(大于), LE(小于或等于), GE(大于或等于) 注:1)关系运算符的两个操作数必须是数字或者是同一段内的两个存储器地址。 2)关系为真,对于字操作数而言,结果为0FFFFH; 关系为假,结果为0 例:MOV BX,PORT_VAL GE 5 若 PORT_VAL5,则汇编后为: MOV BX, 0FFFFH 若 PORT_VAL5, 则汇编后为: MOV BX, 0,例4.18 用OFFSET返回标号或变量偏移地址值的表达式 DATA SEGMENT DAT1 DB 81H DATA ENDS CODE SEGMENT MOV SI,OFFSET LAB1 LAB1: MOV BX,OFFSET DAT1 CODE ENDS,4、分析运算符 分析运算符有:OFFSET、SEG、TYPE、LENGTH、SIZE (1)OFFSET 格式:OFFSET 变量或标号 功能:返回变量或标号的偏移地址部分。,(2)SEG 格式:SEG 变量或标号 功能:返回变量或标号所在段的段基值。 (3)TYPE 格式:TYPE 变量或标号 功能: 返回变量或标号的类型属性值。 表4-1 TYPE运算符返回值,例 4.19 TYPE加在变量和标号前的表达式 DATA SEGMENT AA1 DB 20H, 30H AA2 DW 0438H AA3 DD ? DATA ENDS CODE SEGMENT LL1: MOV AH,TYPE AA1 MOV BH,TYPE AA2 ADD AL,TYPE AA3 MOV BL,TYPE LL1 CODE ENDS,(4) LENGTH 格式:LENGTH 变量 功能:返回变量的长度,即以DUP形式表示的第一组变量被重复设置的次 数。 例 4.20 LENGTH加变量的表达式 DATA SEGMENT BB1 DW 100 DUP (?) BB2 DW 1,2,3 BB3 DB A B C D DATA ENDS CODE SEGMENT MOV CX, LENGTH BB1 MOV BL, LENGTH BB2 MOV AL, LENGTH BB3 。 CODE ENDS,(5) SIZE 格式:SIZE 变量 功能:返回变量的大小,即TYPELENGTH的值。也就是说, SIZE=TYPELENGTH 把例4.20中含有LENGTH表达式改为SIZE表达式,即: MOV CX, SIZE BB1 MOV BL, SIZE BB2 MOV AL, SIZE BB3,关于TYPE、LENGTH和SIZE的含义举例,对于“W1 DW 20 DUP(3, 10 DUP(7)”,则TYPE W1=2,LENGTH W1=20,SIZE W1=40; 对于“W2 DW 8, 20 DUP(3, 10 DUP(7)”,则TYPE W2=2,LENGTH W2=1, SIZE W2=2; 对于“B1 DB 20 DUP(3, 10 DUP(7)”,则TYPE B1=1,LENGTH B1= ,SIZE B1= ; 对于“B2 DB 8, 20 DUP(3, 10 DUP(7)”,则TYPE B2= ,LENGTH B2= , SIZE B2= 。,5、修改属性运算符(综合运算符) 修改属性运算符有:段操作符、PTR、THIS、HIGH、LOW、 SHORT (1) 段操作符 格式: 段寄存器名 : 存储器操作数 功能:临时指定存储器操作数的段归属。 例如,“MOV AX, ES:BX”表示该存储单元的段基值取自ES,而不是隐含的DS。,(2) PTR 格式: 类型 PTR 变量 距离 PTR 标号 例如,指令“MOVBX, 5”的含义是将常数5送入存储单元BX中 。该存储单元的偏移地址由BX确定,段基值隐含为DS。但汇编程序无法确定常数5是字节还是字,也无法确定存储单元BX的内容是字节还是字,所以无法操作。 MOV BYTE PTR BX,5,例 4.21 带PTR表达式的变量 DATA SEGMENT CC1 DB 16H,36H CC2 DW 1122H,3344H DATA ENDS CODE SEGMENT LL1: MOV AX,WORD PTR CC1 MOV BL,BYTE PTR CC2 MOV BYTE PTR BX, 10H MOV WORD PTR BX, 10H JMP FAR PTR LL1 CODE ENDS,(3) THIS 功能:临时指定当前地址处变量或标号的类型。 格式: 变量 EQU THIS 类型 标号 EQU THIS 距离 例如: DATA1 EQU THIS BYTE TABLE DW 200 DUP(?) 又如: LL1 EQU THIS FAR MOV AX,100,(4) SHORT 用来指出转移类指令中目的地址的属性,并规定要转的目的地址与本指令之间距离在128127之间。 格式:SHORT 标号 (5) HIGH和 LOW 它们称为字节分离运算符 格式: HIGH 变量或标号 LOW 变量或标号 例如,HIGH 1234H的操作结果为12H。 LOW 1234H的操作结果为34H。,例4.22 带HIGH和 LOW表达式的变量 DATA SEGMENT BB1 EQU 1234H BB2 EQU 0A0B0H DATA ENDS CODE SEGMENT MOV AH, HIGH BB1 MOV BL, LOW BB2 CODE ENDS,7) 注意点: (1)注意表达式中各运算符和操作符的优先级 从高到低排列如下: 圆括号,尖括号,方括号,圆点符,LENGTH,SIZE PTR,OFFSET,SEG,TYPE,THIS,冒号 *,MOD,SHL,SHR HIGH,LOW , EQ,NE,LT,LE,GT,GE NOT AND OR,XOR SHORT (2)注意数制统一 如:表达式23H AND 45H OR 67H 可表示成: 00100011B AND 01000101B OR 01100111B 其结果为 01100111B。,6) 其它运算符 其它运算符如:圆括号、尖括号、方括号、圆点符等,4.6 宏定义、宏调用和宏扩展,宏(MACRO)是源程序中一段有独立功能的程序代码、它只需在源程序中定义一次,就可以多次用一条宏指令来调用它。 宏定义是用伪指令来实现的。其格式为:,其中MACRO和ENDM是一对伪指令说明符,这对伪指令之间是宏定义一组有独立功能的程序代码。,Macro-name,经宏定义定义后的宏指令就可以在源程序中调用,这种对宏指令的调用称宏调用, 宏调用的格式为: Macro-name 实际参数1,实际参数2,. 当源程序被汇编时,汇编程序将对每个宏调用作宏展开。宏展开就是用宏定义体取代源程序中的宏指令名,而且用实在参数一一取代宏定义的形式参数。,例: 宏定义带形式参数 宏定义: FOO MACRO P1, P2, P3 MOV AX, P1 P2 P3 ENDM 宏调用: FOO WORD_VAR, INC, AX 宏展开: MOV AX, WORD_VAR INC AX,子程序调用和宏调用工作方式的区别,子程序调用工作方式:,XA,yB,CALL Q,xC,yD,CALL Q,主程序,Q: . . . RET,子程序Q(x,y),执行时调用,宏调用工作方式:,Q A,B,Q C,D,主程序,汇编时展开,Q(A,B),Q(C,D),Q MACRO x,y,ENDM,子程序调用和宏调用工作方式的区别,1. 宏指令调用比子程序调用执行速度快。 2. 过程调用使用CALL语句实现,在CPU执行时进行处理,宏指令调用由宏汇编软件MASM进行处理。 3. 子程序比宏指令节省内存空间。 用宏指令得到的目标代码长,占内存空间大,而且宏调用的次数越多,所占内存空间越大;用子程序占内存空间小,而且不会随调用次数的增加而增加,但执行时间长。 4. 宏指令比子程序灵活。,4.7 DOS和BIOS调用,操作系统 MS - DOS 的结构,用户,用户程序,命令处理模块,磁盘管理模块,基本输入输出模块,软件中断和,系统调用,键盘命令,COMMAND.COM,IBM DOS.COM,IBM BIO.COM ROM BIOS,系统功能调用的概念 MS-DOS是8086、8088微机系统广泛使用的一种操作系统,它提供了很多可供用户调用的功能子程序,包括控制台输入输出、文件管理、进程管理等。他们为用户的汇编语言程序设计提供了许多方便。用户可以在自己的程序中直接调用这些功能,而无须在自行编写。 系统软件中提供的功能调用有两种,一种称为DOS(Disc Operation System)功能调用(也称高级调用),另一种称为BIOS(Basic Input and Output System)功能调用(也叫低级调用)。用户在调用这些系统服务程序时,不是CALL命令,而是采用软中断INT n来实现。其中,常用软中断指令有8条,他们的中断类型码是20H27H。,1. 常用的DOS软中断,INT 2lH功能大致可以分为四个方面:设备管理、目录管理、文件管理和其它

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论