第04章+汇编语言程序设计.ppt_第1页
第04章+汇编语言程序设计.ppt_第2页
第04章+汇编语言程序设计.ppt_第3页
第04章+汇编语言程序设计.ppt_第4页
第04章+汇编语言程序设计.ppt_第5页
已阅读5页,还剩202页未读 继续免费阅读

下载本文档

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

文档简介

第三章第4章汇编语言程序设计,第4章汇编语言程序设计,4.1概述4.2汇编语言程序的格式与基本语法4.3伪操作命令与宏指令4.4DOS与BIOS的调用4.5汇编语言程序设计,主要内容:,汇编语言源程序的结构汇编语言语句格式伪指令功能调用汇编语言程序设计,4.1概述,一、机器语言(MachineLanguage)二进制数形式的指令和数据。B064这就是机器语言。既不直观,又不易理解和记忆.目标程序(ObjectProgram)用机器语言编写的程序,MOVAL,64H;这就是助记符。助记符用便于记忆的英语单词表示的指令操作码。它反映了指令的功能和主要特征,便于人们理解和记忆。,二、汇编语言(AssemblyLanguage)指令助记符,符号地址,标号,伪指令等语言元素的集合以及这些元素使用的规则。,采用标号或符号来代替地址,汇编语言源程序(SourceProgram)用汇编语言编写的程序。,操作数可能放在存储器中,这就涉及操作数的地址。程序中遇到转移指令或调用指令,也需要知道转移地址,若采用具体地址就很不方便,一旦有错,改动也很麻烦。,10D1:010009750BORDI+0B,SI10D1:0103807C0A2CCMPBYTEPTRSI+0A,2C10D1:01077505JNZ010E10D1:0109FF36A22CPUSH2CA210D1:010D41INCCX10D1:010E93XCHGBX,AX10D1:010F33D2XORDX,DX10D1:0111EBA7JMP00BA10D1:011333D2XORDX,DX10D1:011533C0XORAX,AX10D1:0117FF36952CPUSH2C9510D1:011BC3RET10D1:011C33D2XORDX,DX10D1:011E0BC9ORCX,CX,汇编程序,源程序的编译程序,汇编程序,汇编语言源程序,机器语言目标程序,汇编源程序需翻译成机器语言,变成可执行文件,机器才能执行,这个翻译过程叫汇编。高级语言中称该过程为“解释”或“编译”。执行翻译的程序称为“汇编程序”。,汇编语言程序设计与执行过程,输入汇编语言源程序,源文件.ASM,汇编(编译),目标文件.OBJ,链接,可执行文件.EXE,调试,最终程序,MASM、DEBUG,MASMX.ASM,LINKX.OBJ,X.EXE,三、高级语言(HighlevelLanguage),适合于描述各种算法,不依赖于计算机结构和指令系统。可移植性好,编成方法适合人们的习惯、通用性好。编译和解释程序复杂,占内存大,产生目标代码长。执行速度慢。处理中断和接口困难。,高级语言源程序,目标程序,编译,编译软件程序或解释软件程序,4.1.1汇编语言源程序的结构,汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三个逻辑段组成:数据段存放数据、变量堆栈段堆栈区域代码段存放程序指令,堆栈段,数据段,代码段,一个基本的汇编语言程序框架如下:,4.2汇编语言源程序的格式与基本语法,汇编语言的语句有三种:指令性语句由8086指令助记符构成的语句,由CPU执行,每一条指令性语句都有一条机器码指令与其对应。指示性语句由伪指令构成的语句,由汇编程序执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。宏指令语句简化汇编语言,可以用一条宏指令指令代替定义过的一段程序,汇编时将该段程序插入对应程序中。,一、语句的种类,指令性语句的格式为:标号:指令助记符目的操作数,源操作数;注释指示性语句的格式为:名字伪指令参数1,参数2,参数n;注释宏指令语句的格式为:标号:宏指令参数1,参数2,参数n;注释注:各部分之间至少要用一个空格作为分隔符。,二、语句的构成元素:标号指令的符号地址,用来代表指令在存储器中的地址。只能出现在指令性语句中,标号后应加上冒号。名字段、过程、变量的名字,用来代表它们在存储器中的地址。只能出现在指示性语句中,名字后不加冒号。指令助记符8086助记符、伪指令操作数即指令的操作对象对指令性语句0,1,2个对指示性语句根据需要而定操作数之间以逗号分隔操作数可以是:寄存器、存储单元、常数或表达式例如:AX,DI+BX+10,200,16*8+TABLE,等等,注释以分号开头,可放在指令后,也可单独一行。注意注解的写法。要写指令(段)在程序中的作用,而不要写指令的操作。例如:以下为同一条指令写的注释1)MOVCX,100;传送100到CX2)MOVCX,100;循环计数器置初值显然,第二种写法要比第一种写法要好。,汇编语言的一个实例:hello.asmdataSEGMENTHelloDBHello,world!,0DH,0AH,$dataENDSprogSEGMENTASSUMECS:prog,DS:datastart:MOVAX,dataMOVDS,AXLEADX,hello;取字符串首地址MOVAH,9INT21H;显示字符串MOVAH,4CHINT21H;退回DOSprogENDSENDstart,名字,标号,三、数据项与表达式,数据项包括常量、变量、标号及表达式。1.常量常数二进制数,以B结尾。如01001101B。十进制数,如85。十六进制数,以H结尾。第1个数字为A-F时,前面应加0,如0F160H。字符串:用引号括起来的1个或多个字符。如ERROR!,a,汇编时被翻译成对应的ASCII码45H,52H,52H,4FH,52H,21H和61H。数值符号名:用伪指令定义的(EQU)符号名.常量表达式:用各种运算符与各种数值常数组成的可求值的表达式。由汇编程序计算而得。,有三个属性:段地址:即标号所在段的段地址;偏移量:标号所代表存储单元的段内偏移地址;类型:NEAR或FAR:NEAR表示标号所在语句与转移指令/调用指令在同一码段内,跳转时只需改变IP即可。FAR标号所在语句与转移指令/调用指令不在同一代码段内。若没有对类型进行说明,默认为NEAR。标号通常作为转移指令或CALL指令的转移地址。,2.标号指令所在内存单元的符号地址,变量即内存中的存储单元或数据区。变量名是存储单元(数据区)的符号地址或名字。变量也有三个属性:段地址变量所在段的段地址偏移量变量单元地址与段首地址之间的位移量。类型有BYTE、WORD和DWORD三种。变量在程序中作为存储器操作数被引用。,3.变量,标号和变量名的使用规则组成:A-Z(不分大小写),0-9,?._$不能以数字开头,句号(.)只能作为首字符长度小于31个字符不能与保留字(指令助记符、伪指令、预定义符号等)重名不能重复定义例如:正确的:LP1,AGAIN,NEXT,_GO,OK_1错误的:4M,LOOP,AAA,#HELP,+ONE,4.表达式,表达式是常数、寄存器、标号、变量与运算符的组合。有数字表达式和地址表达式两种。汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运行时不能改变。表达式中的运算符有5类:算术运算符、逻辑运算符、关系运算符、分析运算符和合成运算符。,用于数字表达式,例:MOVAX,4*1024汇编后的形式为:MOVAX,4096用于地址表达式,例:LEASI,TAB+3若TAB的偏移地址为1000H,则汇编后的形式为:LEASI,1003H,1)算术运算符+、-、*、/,MOD,SHL,SHR,逻辑运算符只能用于数字表达式中。例:MOVCL,36HAND0FH经汇编后:MOVCL,06H注意,不要把逻辑运算符与逻辑运算指令混淆:例:ANDAX,3FC0HAND0FF00H汇编后源操作数被翻译为:3F00H,所以上述指令与ANDAX,3F00H等价。,2)逻辑运算符AND、OR、XOR、NOT,关系运算的结果是一个逻辑值:真或假关系为真,结果为全1关系为假,结果为全0,3)关系运算符EQ、NE、LT、GT、LE、GE,例:MOVBX,PORTGT300H;若PORT的值大于300H,则汇编后为:MOVBX,0FFFFH否则汇编后为:MOVBX,0,例:MOVBX,(PORTGT300H)AND20H)OR(PORTLE300H)AND30H)若PORT的值大于300H,则汇编后为:MOVBX,20H否则汇编后为:MOVBX,30H,SEG:取变量/标号的段地址OFFSET:取变量/标号的偏移地址例:VARDB12HMOVBX,OFFSETVAR;取变量VAR的偏移地址MOVAX,SEGVAR;取变量VAR的段地址注意,以下指令的异同:MOVBX,OFFSETVARLEABX,VAROFFSET只能取静态的偏移地址;LEA指令即可取静态的偏移地址,也可取动态的偏移地址。,取地址运算符SEG、OFFSET,4)分析运算符:分析对MEM(变量或标号)的三个重要的属性。,TYPE取变量的类型(1,2,4)LENGTH取所定义变量的长度(即变量中元素的个数)SIZE取所定义存储区的字节数(=TYPE*LENGTH)例:VARDW20DUP(?),2DAT1DB5,1则TYPEVAR=2LENGTHVAR=20SIZEVAR=40LENGTH、SIZE仅用于带DUP的外层有效,取值运算符TYPE、LENGTH、SIZE,格式运算符操作数,SEGOFFSETTYPE,变量名或标号变量名或标号标号或变量名,返回其所在段的段基址返回其所在段的偏移地址返回其属性值NEAR、FARDB、DW、DD、DQ、DT,变量名变量名,LENGTHSIZE,1、2、4、8、10,-1、-2,元素个数字节数,SIZE=TYPE*LENGTH,用于带DUP的外层有效,6)合成运算符PTR、THIS,用来指定地址操作数的类型。格式:PTR类型BYTE,WORD,DWORD,NEAR,FARBYTE、WORD、DWORD用于描述数据存储单元(变量)地址NEAR、FAR用于描述转移、调用的目的地址,变量:指令中临时指定的变量的新属性可利用PTR指定地址相同而类型不同的新变量,例:MOVBYTEPTRDI,0;字节类型MOVWORDPTRDI,0;字类型MOVDI,0B5H;类型不定例:STR1DW?;STR1定义为字类型STR2EQUBYTEPTRSTAR1MOVAX,STR1;合法MOVAL,STR1;非法MOVAL,BYTEPTRSTR1;合法MOVAL,STR2,标号:可用PTR建立地址相同而类型不同的新符号。可临时指定其标号的新属性。C1SEGMENTASSUMEC1:CSJMPNEARPTRNEXT;超前引用FNEXTEQUFARPTRNEXTFFNEXTEQUTHISFARNEXT:MOVBX,100C2SEGMENTC2:CSJMPFNEXT,符号equthis类型另一符号;放于被指定类型前,6.汇编运算符(THIS),格式:THIS类型可以像PTR一样建立一个指定类型的地址操作数,该操作数的段地址和偏移地址与下一个存储单元地址相同。,例:BUFBEQUTHISBYTEBUFWDW1234H,5678H.MOVAX,BUFW;AX=1234HMOVBL,BUFB;BL=34H,BUFB的偏移地址和BUFW完全相同,但它是字节类型;而BUFW则是字类型。,P237页运算符的优先级,4.3伪操作命令与宏指令,数据定义伪指令符号定义伪指令模块定义伪指令(段)过程定义伪指令宏指令模块连接列表伪指令,由汇编程序执行的指令,它本身不被汇编成机器指令。这里仅介绍MASM常用的伪指令。,4.3.1数据定义与存储器分配伪指令(define),用于定义变量,即内存单元或数据区。数据定义伪指令的格式为:变量名数据定义伪指令操作数,操作数,DB、DW、DD、DQ、DT作用:定义变量类型属性,并可以进行初始化常数或表达式字符串(hello表示其ASC值的)?(该单元不初始化,预留出存储空间)带DUP表达式ndup(操作数)带$(表示地址计数器当前值),常数或表达式:DATA_BDB10,5,10HDATA_WDW100H,-4DATA_DDD0FFFBH,注意下面两个定义的不同之处:DBAB;41H在低字节;42H在高字节DWAB;42H在低字节,;41H在高字节,操作数可以是字符串,例如STRDBHELLO,操作数?用来保留存储空间,但不存入数据.例3:ABCDB0,1,2,3,4,OK,$RSVDW?,?,?,?,?,?,?,?复制操作符DUP:重复的数据可以使用复制操作符DUP,如上面RSV亦可写成:RSVDW8DUP(?),若操作数中若使用$,则表示的是地址计数器的当前值。例:TABLEDB10DUP(?)BUFFERDWTABLE,$+3设TABLE的偏移地址为0080H,则汇编后如下图所示:$表示当前存储单元的偏移地址。,BUFFER,0080H,80H,TABLE,008AH008BH008CH008DH,.,8FH,00H,00H,0089H,10Bytes,DATASEGMENTDAT1DB40HDAT10EQUWORDPTRDAT1DAT9EQUTHISWORDDAT2DW00H,23HDAT3DB2DUP(20H)DAT4DBABDAT5DWABDAT6DW?,$+3DAT7DB25H*4A1EQU10HDAT8DB2DUP(2DUP(A1)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMOVAX,DATAMOVDS,AXMOVBX,SEGDAT2MOVCX,OFFSETDAT2XX:MOVDX,TYPEDAT2MOVAX,TYPEXXMOVAL,LENGTHDAT3MOVAH,LENGTHDAT8MOVBL,SIZEDAT8movah,4chint21hCODEENDSEND,?H,?H,10H,00H,94H,10H,10H,10H,10H,09H,10H,41H,42H,42H,41H,20H,20H,00H,23H,00H,00H,40H,DAT9,DAT10,D:MASM1DEBUGDEFINED.EXE-D1254:00004000002300202041-4242410000100094.#.ABBA.1254:00101010101000000000-0000000000000000.1254:0020B854128ED8BB5412-B90100BA0200B8FF8T.X;T.9.:.8.1254:0030FFB002B400B300B4-4CCD21000000000.4LM!.1254:00400000000000000000-0000000000000000.1254:00500000000000000000-0000000000000000.1254:00600000000000000000-0000000000000000.1254:00700000000000000000-0000000000000000.-,AX=0000BX=0000CX=0082DX=0002SP=0000BP=0000SI=0000DI=0000DS=1244ES=1244SS=1254CS=1254IP=0020NVUPDIPLNZNAPONC1254:0020B85412MOVAX,1254-TAX=1254BX=0000CX=0082DX=0002SP=0000BP=0000SI=0000DI=0000DS=1244ES=1244SS=1254CS=1254IP=0023NVUPDIPLNZNAPONC1254:00238ED8MOVDS,AX-TAX=1254BX=0000CX=0082DX=0002SP=0000BP=0000SI=0000DI=0000DS=1254ES=1244SS=1254CS=1254IP=0025NVUPDIPLNZNAPONC1254:0025BB5412MOVBX,1254-TAX=1254BX=1254CX=0082DX=0002SP=0000BP=0000SI=0000DI=0000DS=1254ES=1244SS=1254CS=1254IP=0028NVUPDIPLNZNAPONC1254:0028B90100MOVCX,0001-TAX=1254BX=1254CX=0001DX=0002SP=0000BP=0000SI=0000DI=0000DS=1254ES=1244SS=1254CS=1254IP=002BNVUPDIPLNZNAPONC1254:002BBA0200MOVDX,0002-,AX=1254BX=1254CX=0001DX=0002SP=0000BP=0000SI=0000DI=0000DS=1254ES=1244SS=1254CS=1254IP=002ENVUPDIPLNZNAPONC1254:002EB8FFFFMOVAX,FFFF-TAX=FFFFBX=1254CX=0001DX=0002SP=0000BP=0000SI=0000DI=0000DS=1254ES=1244SS=1254CS=1254IP=0031NVUPDIPLNZNAPONC1254:0031B002MOVAL,02-TAX=FF02BX=1254CX=0001DX=0002SP=0000BP=0000SI=0000DI=0000DS=1254ES=1244SS=1254CS=1254IP=0033NVUPDIPLNZNAPONC1254:0033B402MOVAH,02-TAX=0202BX=1254CX=0001DX=0002SP=0000BP=0000SI=0000DI=0000DS=1254ES=1244SS=1254CS=1254IP=0035NVUPDIPLNZNAPONC1254:0035B302MOVBL,02-TAX=0202BX=1202CX=0001DX=0002SP=0000BP=0000SI=0000DI=0000DS=1254ES=1244SS=1254CS=1254IP=0037NVUPDIPLNZNAPONC1254:0037B44CMOVAH,4C-,4.3.2符号定义伪指令,用EQU定义的符号未清除前,不能重新定义。清除EQU定义可用PURGE伪指令。用”=”定义的符号可在任何时候进行重定义。二者均不占用存储空间,仅是给符号赋值,格式:符号名EQU或=表达式,把一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示。类似于C语言中的#define。符号定义伪指令有两种:EQU,=,可以为数值和地址及其表达式,变量,标号、指令助记符,例:FIVEEQU5COUNTEQUCXTENEQU10DIST=BYTEPTRSI+BPGOTO=JMPMOVAX,TENMOVCX,COUNTADDDIST,FIVEDIST=WORDPTRSI+BP+1ADDDIST,AXGOTOLABEL,定义,引用,4.3.3程序模块定义伪指令,当功能复杂、大型的程序设计任务,先分解成多个相对独立的小任务,单独编写、调试、汇编。,格式:NAMEmodule_name,1、NAME可省2、NAME省后文件模块名?(1)若有TITLEtest,默认test前6字符(2)都无,为源文件名(x.asm)为模块名,TITLEtest,END表达式,最多6个字符,以字母开头,可指定每页的打印标题,60多字符(列表文件上),1、可不加表达式,默认第一条成机器码指令的地址2、每个模块仅有一个END主模块:END表达式,为第一条代码的标号。子模块:不加表达式,汇编结束伪指令,END后不形成机器码,一、模块定义伪指令,二、段定义伪指令,汇编语言源程序是按段来组织程序和数据的。汇编语言程序中的段称为逻辑段。汇编连接后被映射到物理段中。三类段:代码(程序)、数据、堆栈段定义伪指令:SEGMENT、ENDS、ASSUME、ORG定义一个段的基本格式:段名SEGMENT定位类型组合方式类别段名ENDS,这两个伪指令总是成对出现,二者前面的段名应一致。SEGMENT说明了一个段的开始,ENDS说明了一个段的结束。对数据段和堆栈段,段中的语句一般是变量定义。对代码段则是指令语句。如:dataSEGMENTdataENDS,(一)SEGMENT和ENDS伪指令,SEGMENT语句后可以带有可选参数,用以规定逻辑段的其他一些属性。,1)定位类型说明如何确定逻辑段的边界。有四种:PARA(Paragraph):逻辑段从一个节(16个字节)的边界开始。即段的起始地址应能被16整除,或这说段起始物理地址应为0H。默认类型BYTE:逻辑段从字节边界开始,即段可以从任何地址开始。WORD:逻辑段从字边界开始。即段的起始地址必须是偶数。PAGE:逻辑段从页边界开始。256字节称为一页,故段的起始物理地址应为00H。,2)组合类型说明不同模块中同名段的组合方式。PUBLIC:所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中。COMMON:所有此类型的同名段具有相同的起始地址(覆盖),共享相同的存储区域。AT:按绝对地址定位,段地址就是表达式的值。STACK:专用于说明堆栈段,组合方式同PUBLIC,3)类别用单引号括起来的字符串。所有同类别的段被安排在连续的存储区域中。如:在模块1中有段定义:seg1SEGMENTPARASTACKstackseg1ENDS在模块2中有段定义:seg2SEGMENTPARASTACKstackseg2ENDS则连接时这两个段被安排在一起。,(二)、ASSUME伪指令,功能:在代码段中,说明段和段寄存器的关系,并未将段寄存器赋值。格式:ASSUME段寄存器:段名,段寄存器:段名例:ASSUMECS:code,DS:data,ES:data:程序段比为CS,堆栈段必须为SS该语句一般放于代码段的最前面。仅是说明性语句,除CS外(由系统赋值),各段寄存器均需在程序中赋值取消语句ASSUMENOTHING,段寄存器的填入:,1、代码段段寄存器CS及指令指针IP的填入当汇编程序扫描到程序结束伪指令END符号地址时,系统自动将当前代码段基址CS同时将END后面的符号地址的偏移地址IP,(若无符号地址,将第一条可执行性语句的偏移地址IP),2、数据段段寄存器DS及扩展数据段段寄存器ES的填入由指令填入MOVAX,段名MOVDS,AXMOVAX,段名MOVES,AX,3、堆栈段段寄存器SS及堆栈指针SP的填入系统自动填入当定义段的组合类型为STACK时。即STACKSEGMENTSTACK;将相同名连接在一起形成一个大的堆栈段DW200DUP(?)STACKENDS系统自动将此段段基址SS段长度SP用指令填入当定义段的组合类型缺省(非STACK)代码段中用MOV指令来完成,S_SEGSEGMENTSTADB200DUP(?)S_SEGENDSC_SEGSEGMENTASSUMECS:C_SEG,SS:S_SEGSTART:MOVAX,S_SEGMOVSS,AXMOVSP,SIZESTA;或movsp,lengthstaCODEENDS,S_SEGSEGMENTSTADB200DUP(?)topequsizesta;或topequlengthstaS_SEGENDSC_SEGSEGMENTASSUMECS:C_SEG,SS:S_SEGSTART:MOVAX,S_SEGMOVSS,AXMOVSP,TOPCODEENDS,ORG规定了段内的指令或数据存放的开始地址(偏移地址的初值),其格式为:ORG表达式的值即为开始地址,从此地址起连续存放程序或数据。例:ABCSEGMENTORG100Hbegin:ABCENDS,(三)、ORG伪指令,指令从100H开始存放,4.3.4过程定义伪指令PROC、ENDP,过程就是子程序。一个过程可以被其它程序所调用(用CALL指令),过程的最后一条指令一般是返回指令(RET)过程定义伪指令的格式为PROC类型RETENDP注意:PROC和ENDP必须成对出现。,过程的类型有两种:NEAR(默认类型)表示段内调用FAR表示段间调用调用一个过程的格式为:CALL,4.3.5宏定义伪指令,如果需要多次使用同一个程序段,可以将这个程序段定义为一个”宏指令”,然后在需要时,可简单地用宏指令名来代替这个程序段。,指令的格式为:MACRO形参表ENDM,例:两个数之和的宏定义和宏调用。宏定义为:DADDMACROX,Y,ZMOVAX,XADDAX,YMOVZ,AXENDM,X、Y、Z是形式参数。调用宏DADD时可写为:DADDDATA1,DATA2,SUMDATA1,DATA2,SUM是实际参数,由它们替换定义中的X、Y、Z。,宏调用与过程(子程序)调用都是一次定义,多次调用。它们之间的差别是:执行形式:宏命令伪指令由宏汇编程序在汇编过理中进行处理,而CALL、RET则是由CPU执行的指令。汇编结果:宏命令伪指令汇编后被展开。执行速度:宏命令执行速度较快(因无调用转移)占用内存:宏指令简化了源程序,但不能简化目标程序,并不节省内存单元。使用过程可以节省代码占用的内存空间。,宏展开:汇编程序会把宏调用按宏定义展开。例如:宏定义为:DisplayMACROstringLEADX,stringMOVAH,9INT21HENDM程序中宏调用:DISPLAYERROR_MESSAGEDISPLAYEXIT_MESSAGE汇编后的结果:(带有+号的指令为宏展开后的结果)+LEADX,ERROR_MESSAGE+MOVAH,9+INT21H+LEADX,EXIT_MESSAGE+MOVAH,9+INT21H,4.3.6模块连接伪指令,用于模块之间的共享信息。即A模块中的变量和标号被B模块使用时必须加以说明,一、PUBLIC;本模块说明,格式:PUBLIC符号名1,符号名2,功能:公共引用,说明本模块定义,其它模块引用的共享信息。,二、EXTRN;引用外模块的说明(external),格式:EXTRN符号名:类型,符号名:类型,功能:其他模块定义的,本模块引用。,NAMEAEXTRNVAR2:WORD,LAB2:FARPUBLICVAR1,LAB1,VAR4DATA1SEGMENTVAR1DB12H,34HVAR3DW10DUP(?)VAR4DW10DUP(?)DATA1ENDS,NAMEBEXTRNVAR1:BYTE,VAR4:WORDPUBLICVAR2DATA2SEGMENTVAR2DW0VAR5DB5DUP(0)DATA2ENDS,NAMECEXTRNLAB1:FAR,VAR5:BYTEPUBLICLAB2,存储模式决定了一个程序的规模,也确定了子程序调用、指令转移和数据访问等的缺省属性当使用简化段定义的源程序格式时,必须有存储模式.MODEL语句,且位于所有简化段定义语句之前。其格式为:.MODEL存储模式.MODEL语句确定了程序采用的存储模式,MASM有7种可以选择,4.3.7存储模式(MemoryModel),2.逻辑段的简化定义,.STACK大小;堆栈段定义伪指令.STACK创建一个堆栈段,段名是:STACK。可选的“大小”参数指定堆栈段所占存储区的字节数,默认是1KB(1024400H字节).DATA;数据段定义伪指令.DATA创建一个数据段,段名是:_DATA。数据段名可用DATA预定义标识符表示.CODE段名;代码段定义伪指令.CODE创建一个代码段,可选的“段名”参数指定该代码段的段名。如果没有给出段名,则采用默认段名,一个段的开始自动结束前面的一个段简化段定义伪指令之前,需有存储模式语句,3.程序开始,为了指明程序开始执行的位置,需要使用一个标号(例题中采用了start标识符)连接程序会根据程序起始点正确地设置CS和IP值,根据程序大小和堆栈段大小设置SS和SP值连接程序没有设置DS和ES值。程序如果使用数据段或附加段,必须明确给DS或ES赋值大多数程序需要数据段,程序的执行开始应是:start:movax,data;data表示数据段的段地址movds,ax;设置DS,4.程序终止,应用程序执行结束,应该将控制权交还操作系统汇编语言程序设计中,有多种返回DOS的方法,但一般利用DOS功能调用的4CH子功能实现,它需要的入口参数是AL返回数码(通常用0表示程序没有错误)于是,应用程序的终止代码就是:movax,4c00hint21h,5.汇编结束,汇编结束表示汇编程序到此结束将源程序翻译成目标模块代码的过程源程序的最后必须有一条END伪指令END标号可选的“标号”参数指定程序开始执行点,连接程序据此设置CS和IP值(例题中采用了start标识符),不要糊涂程序终止和汇编结束是两码事,第一个源程序文件wjl301.asm,;wjl301.asm.modelsmall.stack.datastringdbHello,Assembly!,0dh,0ah,$.codestart:movax,datamovds,axmovdx,offsetstringmovah,9int21hmovax,4c00hint21hendstart,简化段定义的源程序格式,.modelsmall;小型模式存储模式.stack;1KB空间堆栈段.data;数据段;数据定义.code;代码段start:movax,data;起始点movds,ax;设置DS;程序代码movax,4c00hint21h;结束点,返回DOS;子程序代码endstart;汇编结束,完整段定义格式,完整段定义利用SEGMENT和ENDS一对伪指令定义逻辑段同时需要配合ASSUME伪指令指明逻辑段是代码段、堆栈段、数据段还是附加段完整段定义的优势是可以指明逻辑段的定位、组合、类别等属性;而简化段定义只能采用系统默认的属性完整段定义和简化段定义的实质是一致的,2.汇编汇编就是用宏汇编程序MASM.EXE把汇编语言源程序翻译(汇编)成机器语言的目标程序。宏汇编程序主要有以下功能:检查源程序中语法错误,给出错误信息;展开宏指令;生目标程序(.OBJ),列表文件(.LST)和交叉引用文件(.CRF)。,4.3.8汇编语言上机调试,1.编辑调用编辑程序EDIT.EXE,WS.EXE等,用键盘敲入源程序,退出编辑系统时,保存编辑完成的文件,且扩展名为.ASM。,接着屏幕上显示:,宏汇编程序询问汇编产生的目标程序文件(目标程序文件是一个纯二进制代码文件,不能直接在屏幕上显示观察)的文件名是否为方括号中的默认值(即目标程序与源程序同名)。若是,直接按一回车键,否则需自己输入另一文件名。在回答完这一询问后,宏汇编程序接着依次询问产生列表文件(列表文件.LST是一个很有用的文件,文件中包含了源程序中各语句及其对应的目标代码。给出了源程序中各语句所属段内的偏移量,并且把源程序中所用的标号、变量和符号,列出它们的名字、类型和值,便于查阅)和交叉引用文件(交叉引用文件中给出了源程序中定义的符号如标号、变量等以及程序中引用这些符号的情况,且是按字母顺序排列的。若要查看这个符号表,必须使用CREF软件,它根据.CRF文件建立一个扩展名为.REF的文件。然后再显示.REF文件的内容就可以看到这个符号表)的文件名,屏幕上显示:,这两个文件是否建立由操作人员确定:若要建立其中一个或两个,操作人员便可输入所需建立的文件名,否则直接送入回车键。待完成上述人机对话后,宏汇编程序便对源程序进行扫描,检查源程序中各语句是否有语法错误,同时把各语句汇编成对应的机器目标代码。在汇编过程中,若发现源程序有语法错误,便随时给出出错信息。屏幕上显示:,如果警告错误和严重错误总数都等于零,那么这次源程序的汇编获得通过,可以进行连接。否则,返回编辑程序,修改源程序,然后再次进行汇编,直到源程序汇编正确无误。如果汇编时,无须产生列表文件和交叉引用文件,则在启动宏汇编程序时可用分号结尾,比如:C:MASMTEST;如果需要后面的列表文件和交叉引用文件,且它们的文件名与源文件名相同,这时启动宏汇编程序时,可用逗号指明,比如:C:MASMTEST,;,3.连接源程序经过汇编后产生的目标程序,必须经过连接程序LINK.EXE连接后才能运行。连接程序把一个或多个独立的目标程序模块连接装配成一个可重定位的可执行文件(扩展名为.EXE)。连接程序LINK除产生一个可执行文件外,还可产生一个内存映象文件(扩展名为.MAP)。LINK连接的一定是扩展名为.OBJ的目标程序。在操作系统状态下,直接启动连接程序LINK.EXE。例如:C:LINKTEST接着屏幕上显示:,连接程序询问连接时产生的可执行文件名是否用方括号中的默认值(即可执行文件与目标程序文件同名)。若是,可直接按一回车键,否则需要重新输入一文件名。接着依次询问,屏幕上显示:,其中MAP文件(MAP文件列出各段的起点,终点及长度。)是否建立,由操作人员确定。若要,则输入一文件名,否则直接送一回车键。后一个是询问在连接时是否要用库文件。对于来自宏汇编语言程序的目标程序文件,通常是直接送一回车键。与启动宏汇编程序一样,可以在启动连接程序时,用分号结束后续询问。如:C:LINKTEST;若要产生MAP文件,且使用目标程序文件名,可用一逗号表示。C:LINKTEST,;,若需要连接多模块的目标程序时,可用“+”把它们连接起来。例如连接三个目标程序文件P1.OBJ、P2.OBJ、P3.OBJ,其操作如下:C:LINKP1+P2+P3;这样产生的一个可执行文件是约定取用第一个目标程序文件名,当然操作人员也可重新用另外的文件名。,4.调试运行在建立好可执行文件后,就可以直接从DOS执行程序,如下所示:C:TEST.EXEC:程序运行结束后返回DOS。如果用户程序已直接把结果在终端上显示出来,那么程序已经运行结束,结果也已经得到了。,生成.COM文件.COM文件也是一种可执行文件,由程序本身的二进制代码组成,它没有.EXE文件所具有的包括有关文件信息的标题区(HEADER),因此它占有的存储空间比.EXE文件要小。.COM文件不允许分段,它所占有的空间不允许超过64KB,因而只能用来编制较小的程序。由于其小而简单,装入速度比.EXE文件要快。使用.COM文件时,程序不分段,其入口点(开始运行的起始点)必须是100H(其前的256个字节为程序段前缀所在地),且不必设置堆栈段。在程序装入时,由系统自动把SP建立在该段之末。对于所有的过程则应定义为NEAR。,用户在建立源文件以后,同样经过汇编、连接生成.EXE文件,然后可以通过DOS操作系统下的EXE2BIN程序来建立.COM文件,操作方法如下:C:EXE2BINFILENAMEFILENAME.COM请读者注意,上行中的第一个FILENAME给出了已形成的.EXE文件的文件名,但不必给出文件扩展名。第二个FILENAME即为所要求的.COM文件的文件名,它必须带有文件扩展名.COM,这样就形成了所要的.COM文件。在DOS系统下,可直接在机器上键入文件名以执行程序。如果第二个FILENAME后不跟扩展名,则将形成.BIN文件,在DOS系统下运行该程序时,必须先用RENAME命令把它改名为.COM文件才能直接运行。此外,.COM文件还可以直接在调试程序DEBUG中用A或E命令建立,对于一些短小的程序,这也是一种相当方便的方法。,1.DEBUG程序的调用在DOS的提示符下,可键入命令:C:DEBUGD:PATHFILENAME.EXEPARM1PARM2其中,文件名是被调试文件的名字。如用户键入文件,则DEBUG将指定的文件装入存储器中,用户可对其进行调试。如果未键入文件名,则用户可以用当前存储器的内容工作,或者用DEBUG命令N和L把需要的文件装入存储器后再进行调试。命令中的D指定指定驱动器PATH为路径,PARM1和PARM2则为运行被调试文件时所需要的命令参数。,4.3.9DEBUG主要命令DEBUG是为汇编语言设计的一种高度工具,它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。,2.DEBUG的主要命令(1)显示存储单元的命令D(DUMP),格式为:_Daddress或_Drange例如,D命令的使用情况如下:,(2)修改存储单元内容的命令有两种。输入命令E(ENTER),有两种格式如下:第一种格式可以用给定的内容表来替代指定范围的存储单元内容。命令格式为:-Eaddresslist例如,-EDS:100F3XYZ8D第二种格式则是采用逐个单元相继修改的方法。命令格式为:-Eaddress,(3)检查和修改寄存器内容的命令R(register)它有三种格式显示CPU内所有寄存器内容和标志位状态,其格式为:-R显示和修改某个寄存器内容,其格式为:-Rregistername显示和修改标志位状态,命令格式为:-RF,(4)运行命令G,其格式为:-G=address1address2address3其中,地址1指定了运行的起始地址,如不指定则从当前的CS:IP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执行的指令。(5)跟踪命令T(Trace),有两种格式:逐条指令跟踪-T=address从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值。如未指定地址则从当前的CS:IP开始执行。多条指令跟踪-T=addressvalue从指定地址起执行n条指令后停下来,n由value指定。,(6)汇编命令A(Assemble),其格式为:-Aaddress该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。必须注意:DEBUG把键入的数字均看成十六进制数,所以如要键入十进制数,则其后应加以说明,如120D。(7)反汇编命令U(Unassemble)有两种格式。从指定地址开始,反汇编32个字节,其格式为:-Uaddress如果地址被省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。对指定范围内的存储单元进行反汇编,格式为:-Urange,(8)命名命令N(Name),其格式为:-Nfilespecsfilespecs命令把两个文件标识符格式化在CS:5CH和CS:6CH的两个文件控制块中,以便在其后用L或W命令把文件装入存盘。filespecs的格式可以是:d:pathfilename.ext(9)装入命令(Load),有两种功能。把磁盘上指定扇区范围的内容装入到存储器指定地址开始的区域中。其格式为:-Laddressdrivesectorsector装入指定文件,其格式为:-Laddress此命令装入已在CS:5CH中格式化了文件控制块所指定的文件。如未指定地址,则装入CS:0100开始的存储区中。,(10)写命令W(Write),有两种功能。把数据写入磁盘的指定扇区。其格式为:-Waddressdrivesectorsector把数据写入指定的文件中。其格式为:-Waddress(11)退出DEBUG命令Q(Quit),其格式为:-Q它退出DEBUG,返回DOS。本命令并无存盘功能,如需存盘应先使用W命令。,4.4DOS与BIOS的调用,系统功能调用由OS提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编程工作量。系统功能调用有两种,一种称为DOS(DiskOperationSystem)功能调用一种称为BIOS(basicinput/outputsystem)功能调用用户程序在调用这些系统服务程序时,不是用CALL命令,而是采用软中断指令INTn来实现。在DOS系统中,功能调用都是用软中断指令INT21H来实现的。,操作系统:用以控制和管理计算机硬件资源,方便用户使用的程序的集合。MS-DOS命令行式的界面WINDOWS采用图形式界面,ROMBIOS中的中断子程序使用IN/OUT指令直接控制外设,实现与外设之间的输入/输出操作以软件形式向其上层提供服务。,IO.SYS中的中断子程序序(称基本输入/输出BIOS模块)调用ROMBIOS的基本I/O功能,向MSDOS.SYS提供设备驱动服务。,MSDOS.SYS中的中断子程序(称DOS内核模块)调用IO.SYS,实现对外设控制其中21H类型的中断子程序提供了丰富的系统服务,称21H类型的中断调用为DOS系统(功能)调用。,用户编程原则应用高级语言的I/O语句尽可能使用DOS的系统功能调用,提高程序可移植性。在DOS功能不能实现情况下,考虑用BIOS功能调用。在DOS和BIOS的中断子程序不能解决问题时,使用IN/OUT指令直接控制硬件。,4.4.2系统功能调用,系统功能调用是IBMPC微机系统为汇编用户提供的一个程序接口。DOS系统的软中断处理程序MS-DOS下进行的。主要功能:1、磁盘的读/写控制2、内存的管理、文件操作和目录管理3、基本输入/输出(对键盘、打印机和显示器控制)、日期、时间等。,一、DOS软中断调用,调用方法,为了使用方便,系统已将所有子程序按顺序编号,称为调用号。其调用号为075H。对于所有的功能调用,使用时一般需要经过以下三个步骤:(1)子程序的入口参数送相应的寄存器。(2)子程序编号送AH。(3)发出中断请求:INT21H(系统功能调用指令)。,键盘和显示器的DOS调用,调用号,功能,入口参数,出口参数,1,键入并显示一个字符,键入字符的ASCII码在AL中,2,显示器显示一个字符,DL中置输出字符的ASCII码,5,打印机打印一个字符,DL中置输出字符的ASCII码,8,键盘输入一个字符,键入字符的ASCII码在AL中,9,显示器显示一个字符串,DS:DX置字符串首址,字符串以$结束,10(0AH),键入并显示字符串,DS:DX置字符串首址,第1单元置允许键入的字符数(含一个回车符),DS:DX第一个字节能容纳的字符个数,不为零;第二个字节保留,以用填写实际输入的字符数第三个字节开始存放从键盘上接收的字符串。,11(0BH),检测有无键入,有键入ALFFH,无键入AL0,1)1号功能调用(键入并显示一个字符)调用格式

温馨提示

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

评论

0/150

提交评论