精品PPT课件--第5章汇编语言程序设计.ppt
精品PPT课件-第5章汇编语言程序设计 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望5.15.1汇编语言概述汇编语言概述 1 1、机器语言机器语言二进制数形式的指令和数据。二进制数形式的指令和数据。B0 64 B0 64 是什么意思?这就是机器语言。既不直观是什么意思?这就是机器语言。既不直观,又不易理解和记忆又不易理解和记忆.2 2、汇编语言汇编语言-MOV AL MOV AL,64H64H ;很容易记忆理解,这就是很容易记忆理解,这就是助记符助记符。助记符助记符用便于记忆的英语单词表示的指令操作码。它用便于记忆的英语单词表示的指令操作码。它反映了指令反映了指令的功能和主要特征的功能和主要特征,便于人们理解和记忆。便于人们理解和记忆。指令除了操作码以外指令除了操作码以外,还有一个操作数问题。还有一个操作数问题。操作数可能放在存储器中操作数可能放在存储器中,这就涉及操作数的地址。程序中遇到转移指这就涉及操作数的地址。程序中遇到转移指令或调用指令令或调用指令,也需要知道转移地址也需要知道转移地址,若采用具体地址就很不方便若采用具体地址就很不方便,一旦有错,一旦有错,改动也很麻烦。于是人们改动也很麻烦。于是人们采用标号或符号来代替地址。采用标号或符号来代替地址。2 LP1LP1:mov ax,:mov ax,VARVAR loop loop LP1LP1 汇编语言汇编语言指令助记符指令助记符,符号地址,标号,伪指令等语言元素的集合符号地址,标号,伪指令等语言元素的集合以及这些元素使用的规则。以及这些元素使用的规则。用汇编语言编写的程序叫用汇编语言编写的程序叫汇编语言源程序汇编语言源程序。汇汇编编源源程程序序需需翻翻译译成成机机器器语语言言,变变成成可可执执行行文文件件,机机器器才才能能执执行行,这这个个翻翻译译过过程程叫叫汇汇编编。高高级级语语言言中中称称该该过过程程为为“解解释释”或或“编编译译”。执执行行翻译的程序称为翻译的程序称为“汇编程序汇编程序”。源程序的编译程序源程序的编译程序汇编程序汇编程序汇编语言源程序汇编语言源程序机器语言目标程序机器语言目标程序3汇编语言程序设计与执行过程汇编语言程序设计与执行过程输入汇编语言源程序输入汇编语言源程序 源文件源文件.ASM汇编(编译)汇编(编译)目标文件目标文件.OBJ链接链接 可执行文件可执行文件.EXE调试调试 最终程序最终程序小汇编:小汇编:ASM 宏汇编:宏汇编:MASM3、高级语言:通用性强。例:、高级语言:通用性强。例:MATLAB、C、Pascal45.2 5.2 汇编语言源程序的格式汇编语言源程序的格式 汇编语言源程序通常由一个或几个程序模块组成汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三每个模块一般由三个逻辑段组成:个逻辑段组成:数据段数据段存放数据、变量存放数据、变量 DATA SEGMENT DATA SEGMENT DATA EDNS DATA EDNS 堆栈段堆栈段堆栈区域堆栈区域 STACK SEGMENTSTACK SEGMENT STACK ENDS STACK ENDS 代码段代码段存放程序指令存放程序指令 CODE SEGMENT CODE SEGMENT CODE EDNSCODE EDNS5.2.1 分段结构分段结构5一个基本的汇编语言程序框架如下: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 AH,4CH INT 21H code ENDS END start 堆栈段堆栈段数据段数据段代码段代码段6例:将两个五字节的例:将两个五字节的16进制数相加进制数相加DATA SEGMENT ;定义数据段;定义数据段DATA1 DB 0F8H,60H,0ACH,74H,3BH ;变量一,字节;变量一,字节DATA2 DB 0C1H,36H,93H,0D5H,20H ;变量二,字节;变量二,字节DATA ENDS ;数据段结束;数据段结束CODE SEGMENT ;定义代码段;定义代码段 ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX ;初始化;初始化DS MOV CX,5 ;置循环次数送;置循环次数送CX MOV SI,0 ;(SI)=0 CLC ;(CF)=07LOOPER:MOV AL,DATA2SI ;取一个字节加数;取一个字节加数 ADC DATA1SI,AL ;与被加数相加,带进位加法;与被加数相加,带进位加法 INC SI ;SI加加1 DEC CX ;CX减减1 JNZ LOOPER ;若;若(CX)不等于不等于0,转,转LOOPER MOV AH,4CH INT 21H ;返回;返回DOSCODE ENDS ;代码段结束;代码段结束 END START ;源程序结束;源程序结束注:注:MOV AH,4CH INT 21H ;DOS功能调用,结束正在运行的程序,返回功能调用,结束正在运行的程序,返回DOS85.2.2 5.2.2 汇编语言语句的类型和组成汇编语言语句的类型和组成汇编语言的语句有两种:汇编语言的语句有两种:指令性语句指令性语句由由80868086指令助记符构成的语句指令助记符构成的语句指令性语句指令性语句的格式为:的格式为:标号标号:指令助记符指令助记符 目的操作数,源操作数目的操作数,源操作数 ;注释注释注:各部分之间至少要用一个空格作为分隔符。注:各部分之间至少要用一个空格作为分隔符。l指令性语句指令性语句由由CPU执行,每一条指令性语句都有一条机器码指令与其对应执行,每一条指令性语句都有一条机器码指令与其对应 指令性语句汇编时生成机器码指令性语句汇编时生成机器码;例:例:LOOPER:MOV AL,DATASILOOPER:MOV AL,DATASI9汇编语言的语句有两种:汇编语言的语句有两种:指示性语句指示性语句由伪指令构成的语句由伪指令构成的语句指示性语句指示性语句的格式为:的格式为:名字名字 伪指令伪指令 操作数操作数1,1,操作数操作数2,2,操作数操作数n n ;注释注释注:各部分之间至少要用一个空格作为分隔符。注:各部分之间至少要用一个空格作为分隔符。l指示性语句指示性语句由汇编程序执行。它指出汇编程序应如何对源程序进行汇编,由汇编程序执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。机器码指令与其相对应。指示性语句汇编时指示性语句汇编时不不生成机器码。生成机器码。例:例:DATA DB 0FBH,60HDATA DB 0FBH,60H10标号有三个属性:标号有三个属性:段地址段地址:即标号所在段的段地址;:即标号所在段的段地址;程序中引用一个标号,该标号的段地址应在程序中引用一个标号,该标号的段地址应在CSCS中。中。偏移量偏移量:标号所代表存储单元的段内偏移地址;:标号所代表存储单元的段内偏移地址;1616位的无符号数位的无符号数 类类 型型:NEARNEAR或或FARFAR:NEARNEAR表示标号所在语句与转移指令表示标号所在语句与转移指令/调用指令在同一码段内调用指令在同一码段内,跳转时只需改变跳转时只需改变IPIP即可。即可。FARFAR标号所在语句与转移指令标号所在语句与转移指令/调用指令不在同一代码段内。调用指令不在同一代码段内。若没有对类型进行说明若没有对类型进行说明,默认为默认为NEARNEAR。标号通常作为标号通常作为转移指令转移指令或或CALLCALL指令指令的转移地址。的转移地址。5.2.3 5.2.3 名字名字11汇编语言的一个实例汇编语言的一个实例:hello.asm:hello.asm datadatadatadata SEGMENT SEGMENT SEGMENT SEGMENTHello Hello DB DB Hello,Hello,world!world!,0DH,0AH,0DH,0AH,$data data data data ENDSENDSENDSENDSprogprogprogprog SEGMENT SEGMENT SEGMENT SEGMENT ASSUMEASSUME CS:CS:progprog,DS:,DS:datadatastartstart:MOV AX,:MOV AX,datadata MOV DS,AX MOV DS,AX LEA DX,LEA DX,hellohello;取字符串首地址取字符串首地址 MOV AH,9MOV AH,9 INT 21H INT 21H;显示字符串显示字符串 MOV AH,4CH MOV AH,4CH INT 21H INT 21H;退回退回DOSDOSprogprogprogprog ENDS ENDS ENDS ENDS END END END END startstartstartstart名字标号12 5.2.4 5.2.4 助记符和伪操作助记符和伪操作助记符:助记符:80868086、8088CPU8088CPU指令的助记符,例如:指令的助记符,例如:MOV,ADD,MULMOV,ADD,MUL等等伪操作指令:如伪操作指令:如DBDB、SEGMENTSEGMENT、ENDSENDS、ASSUMEASSUME、ENDSENDS5.2.5 5.2.5 操作数操作数操作数包括操作数包括常量常量、寄存器寄存器、标号标号、变量变量及及表达式表达式。1.1.常量常量二进制数二进制数,以以B B结尾。如结尾。如01001101B01001101B。十进制数十进制数,如如8585。八进制数八进制数,以以Q Q结尾。如结尾。如174Q174Q。13 十六进制数十六进制数,以以H H结尾。第结尾。第1 1个数字为个数字为A-FA-F时,时,前面应加前面应加0 0,如,如0 0F160HF160H。字符串:用引号括起来的字符串:用引号括起来的1 1个或多个字符。如个或多个字符。如ERROR!,a,ERROR!,a,汇编汇编时被时被 翻译成对应的翻译成对应的ASCIIASCII码码4 45H,52H,52H,4FH,52H,21H5H,52H,52H,4FH,52H,21H和和61H61H。十进制科学计数法。如:十进制科学计数法。如:8.75E-48.75E-4十六进制实数。如:十六进制实数。如:10A4E87R10A4E87R2 2、寄存器、寄存器8 8位寄存器:位寄存器:AHAH、ALAL、BHBH、BLBL、CHCH、CLCL、DHDH、DLDL1616位寄存器:位寄存器:AXAX、BXBX、CXCX、DXDX、SISI、DIDI、BPBP、SPSP、DSDS、CSCS、SSSS、DSDS3 3、标号:代表一条指令的、标号:代表一条指令的符号地址符号地址14 变量名变量名是存储单元是存储单元(数据区数据区)的符号地址或名字。的符号地址或名字。变量也有三个属性变量也有三个属性:段地址段地址变量所在段的段地址变量所在段的段地址偏移量偏移量变量单元地址与段首地址之间的位移量。变量单元地址与段首地址之间的位移量。类类 型型有有BYTEBYTE、WORDWORD和和DWORDDWORD三种。三种。变量在程序中作为变量在程序中作为存储器操作数存储器操作数被引用。被引用。标号和变量名的使用规则标号和变量名的使用规则组成:组成:A-Z(不不分大小写分大小写),0-9,?._$不不能以数字开头能以数字开头长度小于长度小于31个字符个字符不不能与保留字能与保留字(指令助记符、伪指令、预定义符号等指令助记符、伪指令、预定义符号等)重名重名不不能重复定义能重复定义例如:例如:正确的:正确的:LP1,AGAIN,NEXT,_GO,OK_1 错误的:错误的:4M,LOOP,AAA,#HELP,+ONE4.4.变量变量-即内存中的存储单元或数据区。即内存中的存储单元或数据区。155.5.表达式表达式表达式是常数、寄存器、标号、变量与运算符的组合。表达式是常数、寄存器、标号、变量与运算符的组合。有有数字表达式数字表达式和和地址表达式地址表达式两种。两种。汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运行时不能改变。行时不能改变。表达式中的运算符有表达式中的运算符有6 6类:算术、逻辑、关系、取地址、属性、杂类。类:算术、逻辑、关系、取地址、属性、杂类。(1)1)算术运算符算术运算符 +、-、*、/,MODMOD用于数字表达式用于数字表达式,例:例:MOV AX,4*1024MOV AX,4*1024汇编后的形式为汇编后的形式为:MOV AX,4096 MOV AX,4096 用于地址表达式用于地址表达式,例例:LEA SI,TAB+3LEA SI,TAB+3若若TABTAB的偏移地址为的偏移地址为1000H1000H,则汇编后的形式为:,则汇编后的形式为:LEA SI,1003H LEA SI,1003H 16逻辑运算符只能用于数字表达式中。逻辑运算符只能用于数字表达式中。例:例:MOVMOVCL,36H AND 0FHCL,36H AND 0FH 经汇编后:经汇编后:MOV CL,06HMOV CL,06H注意,不要把逻辑运算符与逻辑运算指令混淆:注意,不要把逻辑运算符与逻辑运算指令混淆:例:例:AND AX,AND AX,3FC0H AND 0FF00H3FC0H AND 0FF00H汇编后源操作数被翻译为:汇编后源操作数被翻译为:3F00H3F00H,所以上述指令与,所以上述指令与AND AX,3F00HAND AX,3F00H等价。等价。(2)2)逻辑运算符逻辑运算符 AND AND、OROR、XORXOR、NOTNOT关系运算的结果是一个逻辑值:关系运算的结果是一个逻辑值:真真或或假假 关系为真关系为真,结果为全结果为全1 1;关系为假关系为假,结果为全结果为全0 0例:例:MOV BX,PORT GT 300HMOV BX,PORT GT 300H 若若PORTPORT的值大于的值大于300H,300H,则汇编后为:则汇编后为:MOV BX,0FFFFHMOV BX,0FFFFH 否则汇编后为:否则汇编后为:MOV BX,0MOV BX,0(3)3)关系运算符关系运算符EQEQ、NENE、LTLT、GTGT、LELE、GEGE17OFFSET:取变量:取变量/标号的偏移地址标号的偏移地址注意,以下指令的异同:注意,以下指令的异同:MOV BX,OFFSET VAR LEA BX,VAROFFSET只能取静态的偏移地址;只能取静态的偏移地址;LEA指令即可取静态的偏移地址,也可取动态的偏移地址。指令即可取静态的偏移地址,也可取动态的偏移地址。SEG:取变量:取变量/标号的段地址。标号的段地址。例:例:MOV AX,SEG DATA MOV DS,AX ;取变量;取变量DATA的段地址的段地址(4)4)分析运算符和合成运算符分析运算符和合成运算符18TYPE 取变量的类型(取变量的类型(1,2,4)VAR DW?;字字ARRAY DD 10 DUP(?);双字双字STR DB This is a test ;字节字节 MOV AX,TYPE VAR ;(AX)=2 MOV BX,TYPE ARRAY ;(BX)=4 MOV CX,TYPE STR ;(CX)=1LENGTH 取所定义变量的长度(即变量中元素的个数)取所定义变量的长度(即变量中元素的个数)未使用重复操作符未使用重复操作符DUP,变量个数为,变量个数为1;否则如上例中的变量否则如上例中的变量ARRAY的个数为的个数为10;19SIZE 取所定义存储区的字节数(取所定义存储区的字节数(=TYPE*LENGTH)例:例:VAR DW 1,2,3,4,5 则则 TYPE VAR=2,LENGTH VAR=1,SIZE VAR =2合成运算符合成运算符PTR:用来指定地址操作数的类型用来指定地址操作数的类型格式:格式:PTR 类型类型BYTE,WORD,DWORD,NEAR,FARBYTE、WORD、DWORD 用于描述数据存储单元用于描述数据存储单元(变量变量)地址地址NEAR、FAR 用于描述转移、调用的目的地址用于描述转移、调用的目的地址例:例:MOVMOV BYTE PTRDI,0;BYTE PTRDI,0;字节类型字节类型 MOV MOV WORD PTRDI,0;WORD PTRDI,0;字类型字类型 MOVMOV DI,0B5H ;DI,0B5H ;类型不定类型不定20PTRPTR也可用来进行强制类型转换也可用来进行强制类型转换例:例:STR1 DW STR1 DW?;STR1 ;STR1定义为字类型定义为字类型 MOV MOVAX,STR1 ;AX,STR1 ;合法合法 MOV MOVAL,STR1 ;AL,STR1 ;非法非法 MOV AL,MOV AL,BYTE PTRBYTE PTR STR1;STR1;合法合法21(5)5)其他运算符其他运算符方括号方括号:存储器地址:存储器地址MOV CL,BX ;MOV CL,BX ;间址寻址间址寻址MOV AL,SI+5 ;MOV AL,SI+5 ;变址寻址变址寻址段超越运算符:段超越运算符:MOV AX,ES:DIMOV AX,ES:DIHIGHHIGH、LOWLOW:获取数值或地址表达式的高位和低位字节:获取数值或地址表达式的高位和低位字节VAR EQU 0ABCDHVAR EQU 0ABCDH MOV AH,HIGH VAR;(AH)=0ABH MOV AH,HIGH VAR;(AH)=0ABH MOV AL,LOW VAR;(AL)=0CDH MOV AL,LOW VAR;(AL)=0CDH225.2.6 注释注释注释注释以分号开头,可放在指令后,也可单独一行。以分号开头,可放在指令后,也可单独一行。注意注解的写法。要写指令(段)在程序中的作用,而注意注解的写法。要写指令(段)在程序中的作用,而不不要写指令要写指令的操作。的操作。例如:以下为同一条指令写的注释例如:以下为同一条指令写的注释 1)MOV CX,100 ;传送传送100到到CX 2)MOV CX,100 ;循环计数器置初值循环计数器置初值 显然,第二种写法要比第一种写法要好。显然,第二种写法要比第一种写法要好。235.3 5.3 伪操作命令伪操作命令数据定义伪指令数据定义伪指令符号定义伪指令符号定义伪指令段定义和段寄存器指定伪指令段定义和段寄存器指定伪指令过程定义伪指令过程定义伪指令结束伪指令结束伪指令 由汇编程序执行的指令,它本身不被汇编成机器指令。由汇编程序执行的指令,它本身不被汇编成机器指令。由汇编程序执行的指令,它本身不被汇编成机器指令。由汇编程序执行的指令,它本身不被汇编成机器指令。常用的伪指令有:常用的伪指令有:常用的伪指令有:常用的伪指令有:245.3.2 5.3.2 数据定义伪指令数据定义伪指令 用于定义变量,即内存单元或数据区。数据定义伪指令的格式为:用于定义变量,即内存单元或数据区。数据定义伪指令的格式为:变量名变量名 数据定义伪指令数据定义伪指令 操作数,操作数,操作数,操作数,常用的数据定义伪指令有如下几种:常用的数据定义伪指令有如下几种:DB DB 定义定义字节、字节、DW DW 定义定义字、字、DD DD 定义定义双字、双字、DQ DQ 定义定义八八字节字节 DT DT 定义定义十字节十字节操作数可以是常数、变量或表达式操作数可以是常数、变量或表达式例例1 1:DATA_B DB 10,5,10HDATA_B DB 10,5,10H DATA_W DW 100H,-4 DATA_W DW 100H,-4 DATA_D DD 0FFFBH DATA_D DD 0FFFBH 汇编后的内存分配情况如右图所示汇编后的内存分配情况如右图所示。05H10H00H01HFCHFFHFBHFFH00H00H0AHDATA_BDATA_BDATA_WDATA_WDATA_DDATA_D10105 510H10H0100H0100H-4 40FFFBH0FFFBH25例例2 2:DATA DB 100,0FFH ;DATA DB 100,0FFH ;存入存入64H64H,0FFH0FFH EXPR DB 2*3+7 ;EXPR DB 2*3+7 ;存入存入0DH=13D0DH=13D STR DB WELCOME!;STR DB WELCOME!;存入存入8 8个字符个字符 AB DB AB ;AB DB AB ;存入存入41H41H,42H42H BA DW AB ;BA DW AB ;存入存入42H42H,41H41H ABDD DD AB ;ABDD DD AB ;存入存入42H42H,41H41H,0000,0000 OFFAB DW AB ;OFFAB DW AB ;存入变量存入变量ABAB的偏移地址的偏移地址 ADRS DW TABLE,TABLE+5,TABLE+10 ;ADRS DW TABLE,TABLE+5,TABLE+10 ;存入存入3 3个偏移地址个偏移地址 TOTAL DD TABLE ;TOTAL DD TABLE ;先存入先存入TABLETABLE偏移地址,再存段地址偏移地址,再存段地址 NUM DQ 00 11 22 33 44 55 66 77H NUM DQ 00 11 22 33 44 55 66 77H ;存入存入77H77H,66H66H,55H55H,44H44H,33H33H,22H22H,11H11H,00H00H,DECML DT 1234567890H DECML DT 1234567890H ;存入存入90H90H,78H78H,56H56H,34H34H,12H12H,0000,0000,0000,0000,0000 HEXTAB DB 01,02,03,04,05,06,07,08,09 HEXTAB DB 01,02,03,04,05,06,07,08,09 DB 0AH,0BH,0CH,0DH,0EH,0FH DB 0AH,0BH,0CH,0DH,0EH,0FH 26例例3 3:操作数可以是字符串,例如:操作数可以是字符串,例如STR DBHELLO 汇编后的情况如图:汇编后的情况如图:注意下面两个定义的不同之处:注意下面两个定义的不同之处:DBAB ;41H ;41H在低字节,在低字节,42H42H在高字节在高字节DW AB ;42H ;42H在低字节,在低字节,41H41H在高字节在高字节STRHELLO48H45H4CH4CH4FH操作数操作数?用来保留存储空间用来保留存储空间,但不存入数据但不存入数据.例例4:ABC DB 0,1,2,3,4,OK,$RSV DW?,?,?,?,?,?,?,?27l复制操作符复制操作符DUP:重复的数据可以使用复制操作符重复的数据可以使用复制操作符DUP,如上面如上面RSV亦可写成亦可写成:RSV DW 8 DUP(?)若操作数中若使用若操作数中若使用$,则表示的是地址计数器的当前值。则表示的是地址计数器的当前值。例:例:TABLE DB 10 DUP(?)BUFFER DW TABLE,$+3设设TABLE的偏移地址为的偏移地址为0080H,则汇编后如下图所示:则汇编后如下图所示:BUFFER0080H80HTABLE.8FH00H0089H10 Bytes285.3.3 5.3.3 符号定义伪指令符号定义伪指令1 1、EQU 格式:名字格式:名字 EQU 表达式表达式 把一个表达式用一个符号表示,以后凡出现该表达式的地方都可用把一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示。类似于这个符号表示。类似于C C语言中的语言中的#define#define。用用EQUEQU定义的符号未清除前不能重新定义。清除定义的符号未清除前不能重新定义。清除EQUEQU定义用定义用PURGEPURGE伪指令。伪指令。不占用存储空间不占用存储空间,仅是给符号赋值仅是给符号赋值 CR EQU ODH ;CR EQU ODH ;常数常数A EQU ASCII_TABLE A EQU ASCII_TABLE ;变量;变量STR EQU 64*1024 STR EQU 64*1024 ;数值表达式;数值表达式ADR EQU ES:BP+DI+5 ADR EQU ES:BP+DI+5;地址表达式;地址表达式CBD EQU AAM CBD EQU AAM ;指令助记符;指令助记符292 2、=格式:名字格式:名字 =表达式表达式区别:可对同一名字重复定义区别:可对同一名字重复定义不不占用存储空间占用存储空间,仅是给符号赋值仅是给符号赋值例例1:FIVE EQU 5 COUNT EQU CX TEN EQU 10 DIST =BYTE PTRSI+BP GOTO =JMP MOV AX,TEN MOV CX,COUNT ADD DIST,FIVE DIST=WORD PTRSI+BP+1 ADD DIST,AX GOTO LABEL 定义定义引用引用30例例2 2:COUNT=10COUNT=10 MOV CX,COUNT ;(CX)=10 MOV CX,COUNT ;(CX)=10 COUNT=COUNT-1 COUNT=COUNT-1 MOV BX,COUNT ;(BX)=9 MOV BX,COUNT ;(BX)=9例例3 3:COLUMN COLUMN EQU 80 EQU 80 ROW ROW EQU 25 EQU 25 SCREENFUL SCREENFUL EQU COLUMN*ROW EQU COLUMN*ROW3 3、LABEL 格式:名字格式:名字 LABEL 类型类型例:例:AREAW LABEL WORD ;AREAWAREAW LABEL WORD ;AREAW类型为类型为WORDWORD315.3.4 5.3.4 段定义伪操作段定义伪操作1 1、SEGMENT/ENDSSEGMENT/ENDS格式:格式:段名段名 SEGMENT 定位类型定位类型组合方式组合方式类别类别 段名段名 ENDS汇编语言程序是按段来组织程序和数据的。汇编语言程序是按段来组织程序和数据的。和存储器的物理段相对应,汇编语言程序中的段称为逻辑段。汇编和存储器的物理段相对应,汇编语言程序中的段称为逻辑段。汇编连接后被映射到物理段中。连接后被映射到物理段中。SEGMENTSEGMENT语句后可以带有可选参数语句后可以带有可选参数语句后可以带有可选参数语句后可以带有可选参数,用以用以用以用以规定逻辑段的其他一些规定逻辑段的其他一些规定逻辑段的其他一些规定逻辑段的其他一些属性属性属性属性。321 1)定位类型定位类型定位类型定位类型说明说明说明说明如何确定逻辑段的边界。有四种:如何确定逻辑段的边界。有四种:如何确定逻辑段的边界。有四种:如何确定逻辑段的边界。有四种:PARAPARA(Paragraph):(Paragraph):逻辑段从一个节逻辑段从一个节(16个字节个字节)的边界开始。的边界开始。即即段的起始地址应能被段的起始地址应能被16整除整除,或这说段或这说段起始物理地址应为起始物理地址应为0H。默认类型默认类型BYTE:BYTE:逻辑段从字节边界开始,即段可以从任何地址开始。逻辑段从字节边界开始,即段可以从任何地址开始。WORD:WORD:逻辑段从字边界开始。即段的起始地址必须是偶数。逻辑段从字边界开始。即段的起始地址必须是偶数。PAGE:PAGE:逻辑段从页边界开始。逻辑段从页边界开始。256字节称为一页,故段的起始字节称为一页,故段的起始物理地址应为物理地址应为00H。33 2)2)组合类型组合类型组合类型组合类型说明不同模块中同名段的组合方式。说明不同模块中同名段的组合方式。PUBLIC:所有此类型的同名段组合成一个逻辑段,公用一个段地所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中。址,运行时装入同一个物理段中。COMMON:所有此类型的同名段具有相同的起始地址所有此类型的同名段具有相同的起始地址(覆盖覆盖),共享相,共享相同的存储区域。同的存储区域。AT :按绝对地址定位,段地址就是表达式的值。按绝对地址定位,段地址就是表达式的值。STACK:专用于说明堆栈段,组合方式同专用于说明堆栈段,组合方式同PUBLIC34STACK SEGMENT STACK DB 100 DUP(?)STACK ENDSDATA1 SEGMENT BYTESTRING DB This is an example!DATA1 ENDSDATA2 SEGMENT WORDBUFFER DW 40 DUP(0)DATA2 ENDS 35CODE1 SEGMENT PAGE CODE1 ENDSCODE2 SEGMENT PAGE CODE2 ENDS START:MOV AX,STACK;MOV SS,AXCODE2 ENDS END START 36长度说明:长度说明:STACK的长度为的长度为100*1=100D=64HDATA1的长度为的长度为19*1=19D=13HDATA2的长度为的长度为40*2=80D=50HCODE1的长度为的长度为13*1=13D=0DHCODE2的长度为的长度为52*1=52D=34H所占内存地址:所占内存地址:STACK:00000H00063H,占,占64H=100个字节,从个字节,从00H开始开始DATA1:00064H00076H,占,占13H=19个字节,从个字节,从任何地址开始任何地址开始DATA2:00078H000C7H,占,占50H=80个字节,以偶数地址个字节,以偶数地址开始开始CODE1:00100H0010CH,占,占0DH=13个字节,从个字节,从00H开始开始CODE2:00110H00143H,占,占34H=52个字节,从个字节,从00H开始开始 372 2、ASSUME伪指令伪指令在代码段中,还必须明确段和段寄存器的关系,这由在代码段中,还必须明确段和段寄存器的关系,这由ASSUME语句语句来指定。如来指定。如 ASSUME CS:code,DS:data,ES:dataASSUME CS:code,DS:data,ES:data 语句中的语句中的codecode和和datadata为段名。为段名。这个语句说明:这个语句说明:CSCS将指向名字为将指向名字为codecode的代码段的代码段DSDS和和ESES将指向名字为将指向名字为datadata的数据段的数据段但要注意但要注意,ASSUMEASSUME伪指令只是告知汇编程序有关段寄存器与段的关系伪指令只是告知汇编程序有关段寄存器与段的关系,并并没有给段寄存器赋予实际的初值。故下面的语句没有给段寄存器赋予实际的初值。故下面的语句 MOVMOV AX,DATA AX,DATA MOV MOV DS,AX DS,AX MOV MOV ES,AX ES,AX将段基址装入段寄存器将段基址装入段寄存器。如果程序中用到堆栈。如果程序中用到堆栈段,则段,则SS也需装入实际的初值。也需装入实际的初值。代码段基地址代码段基地址不需要程序员装入不需要程序员装入CS寄存器,而由寄存器,而由OS负责装入。负责装入。38例例1:CODE SEGMENT1:CODE SEGMENT ASSUME CS:CODE,DS:DATA1,SS:STACKASSUME CS:CODE,DS:DATA1,SS:STACK MOV AX,DATA1 MOV AX,DATA1 MOV DS,AX MOV DS,AX MOV AX,STACK MOV AX,STACK MOV SS,AX MOV SS,AX CODE ENDS CODE ENDS39例例2:.DOSSEG2:.DOSSEG .MODEL SMALL .MODEL SMALL .STACK 100H .STACK 100H .DATA .DATAIVAR DB 5IVAR DB 5IARRAY DW 50DUP(5)IARRAY DW 50DUP(5)STRING DB This is a stringSTRING DB This is a string .CODE.CODE405.3.5 5.3.5 过程定义伪指令过程定义伪指令PROCPROC、ENDPENDP 过程就是子程序。一个过程可以被其它程序所调用过程就是子程序。一个过程可以被其它程序所调用(用用CALLCALL指令指令),过,过程的最后一条指令一般是返回指令程的最后一条指令一般是返回指令(RET)(RET)。过程定义伪指令的格式为过程定义伪指令的格式为 PROCPROC NEAR/FAR NEAR/FAR RET RET ENDPENDP 注意:注意:PROCPROC和和ENDPENDP必须成对出现。必须成对出现。调用调用NEARNEAR过程:先将过程:先将IPIP内容压入堆栈,再将入口地址传送到内容压入堆栈,再将入口地址传送到IPIP(SP)(SP)(SP)-2,(SP)+1:SP)(IP)41调用调用FARFAR过程:先将过程:先将CSCS内容压入堆栈,再将内容压入堆栈,再将IPIP内容压入堆栈,最后内容压入堆栈,最后将段地址送将段地址送CSCS,偏移地址送,偏移地址送IPIP(SP)(SP)(SP)-2,(SP)+1:SP)(CS);(SP)(SP)(SP)-2,(SP)+1:SP)(IP)(CS)(CS)SEG far_proc,(IP)(IP)OFFSET far_proc,例:例:NAME1 PROC FARNAME1 PROC FAR CALL NAME2 CALL NAME2 RET RET NAME2 PROC NEAR NAME2 PROC NEAR .RET RET NAME2 ENDP NAME2 ENDP NAME1 ENDP NAME1 ENDP 425.3.6 模块定义与连接伪操作模块定义与连接伪操作1、NAME 模块名模块名 ;NAME前面不允许加标号前面不允许加标号2、END 标号标号 ;END后面语句不予处理后面语句不予处理3、PUBLIC 符号符号,;说明某些符号是公共的;说明某些符号是公共的4、EXTRN 名字:类型名字:类型,若为变量,类型可以是若为变量,类型可以是BYTE、WORD、DWORD例:例:EXTRN ALPHA:BYTE,BETA:WORD若为过程,类型可以是若为过程,类型可以是NEAR、FAR例:例:EXTRN SBRT:FAR若为数值,类型可以是若为数值,类型可以是ABS435.4 5.4 DOS系统功能调用介绍系统功能调用介绍系统功能调用系统功能调用由由OSOS提供的一组实现特殊功能的子程序供程序员在提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。程序中调用,以减轻编程工作量。系统功能调用有两种,一种称为系统功能调用有两种,一种称为DOS功能调用,另一种称为功能调用,另一种称为BIOS功功能调用。能调用。用户程序在调用这些系统服务程序时,不是用用户程序在调用这些系统服务程序时,不是用CALL命令,而是采用命令,而是采用软中断指令软中断指令INT n来实现。来实现。n=5n=51FH,调用,调用BIOS中的服务程序;中的服务程序;n=20n=203FH,调用,调用DOS中