《微机原理 第四章 汇编语言程序设计4.1.ppt》由会员分享,可在线阅读,更多相关《微机原理 第四章 汇编语言程序设计4.1.ppt(185页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第四章 汇编语言程序设计4.1 4.1 汇编语言程序设计汇编语言程序设计4.2 Win324.2 Win32汇编语言程序设计汇编语言程序设计4.1 4.1 汇编语言程序设计汇编语言程序设计一一汇编语言上机过程汇编语言上机过程二二汇编语言程序结构汇编语言程序结构三三指示性语句指示性语句四四BIOS和和DOS功能调用功能调用五五汇编语言程序设计汇编语言程序设计应用软件应用软件上机环境上机环境系统软件系统软件硬件硬件操作系统:操作系统:DOS系统系统编辑器编辑器:EDIT.exe编程序编程序:MASM.exe连接程序连接程序:LINK.exe调试程序:调试程序:DEBUG.exe用户开发的程序:用户
2、开发的程序:ABC.exe等等CPU、存储器、存储器(ROM、RAM)、I/O接口、输入、输出设备接口、输入、输出设备一一汇编语言上机过程汇编语言上机过程D:EDITABC.asmD:MASMABC;有语法错,回有语法错,回EDIT下改该程序下改该程序D:LINKABC;有错,回在有错,回在EDIT下改程序下改程序D:ABC运行结果错,回运行结果错,回EDIT下改程序下改程序或在或在DEBUG下调试,找原因。下调试,找原因。D:DEBUGABC.exe编辑源程序编辑源程序 EDITABC.ASM汇编源程序汇编源程序 MASMABC.ASM形成目标程序形成目标程序ABC.OBJ连接目标程序连接目
3、标程序 LINKABC.OBJ有连接错误信息有连接错误信息?形成可执行程序形成可执行程序 ABC.EXE装入可执行程序到内存装入可执行程序到内存,并执行并执行D:subABC下一程序下一程序用用DEBUG调试可执行程序调试可执行程序D:sub DEBUGABC.EXE找到原因找到原因YNYNNYN有汇编错误信息有汇编错误信息?Y运行结果正确运行结果正确?用用DEBUG调试程序查错调试程序查错?二二汇编语言程序结构汇编语言程序结构(一)程序结构(一)程序结构(二)语句结构(二)语句结构(一)程序结构(一)程序结构l程序由数条语句构成,每条语句占一行。程序由数条语句构成,每条语句占一行。指令性语句
4、指令性语句(指令语句指令语句)指示性语句指示性语句(伪指令语句伪指令语句)l分段结构分段结构程序按段编写程序按段编写,与与8088/86内存分段编址相对应。内存分段编址相对应。每段由伪操作每段由伪操作SEGMENT开始、由开始、由ENDS结束。结束。l程序最后为程序最后为END结束语句,后跟一启动地址。结束语句,后跟一启动地址。启动地址指示程序开始执行的第一条语句。启动地址指示程序开始执行的第一条语句。l程序中设有返回程序中设有返回DOS的功能。的功能。使程序执行完后返回使程序执行完后返回DOS系统的命令接受状态。系统的命令接受状态。l程序中用到内存操作数时程序中用到内存操作数时,应按操作数的
5、寻应按操作数的寻址方式址方式,给相应的段寄存器赋值给相应的段寄存器赋值;汇编语言程序结构例一汇编语言程序结构例一movs.asm;实现数据传送功能实现数据传送功能aaSEGMENT;数据段数据段1str1DBHello!aaENDSbbSEGMENT;数据段数据段2str2DB6dup(?)bbENDSccSEGMENT;代码段代码段ASSUMECS:cc,DS:aa,ES:bbstart:CLDMOVAX,aaMOVDS,AXLEASI,str1MOVAX,SEGstr2MOVES,AXMOVDI,OFFSETstr2MOVCX,6REPMOVSBMOVAH,4CHINT21H;返回返回DO
6、SccENDSENDstart;指示程序结束指示程序结束程序可由多个段构成,至少有一个代码段程序可由多个段构成,至少有一个代码段;汇编语言程序结构例(子程结构)汇编语言程序结构例(子程结构)scans.asm;用二进制显示中断向量表中(用二进制显示中断向量表中(0:00:3FFH)数据)数据D0H的个数的个数keyEQU0D0H;用符号表示常量用符号表示常量(关键字关键字)codeSEGMENT;代码段开始代码段开始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,keynext:CMPSI,ALJ
7、NZpointINCBXpoint:INCSILOOPnextCALLdisplay;调用显示子程调用显示子程MOVAH,4CH;返回返回DOSINT21H;用二进制显示用二进制显示BX内容子程内容子程displayPROCMOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回子程返回displayENDPcodeENDS;代码段结束代码段结束ENDbegin;指示程序结束和指示程序结束和;程序入口程序入口data1SEGMENT;数据段数据段1,(可据需要设定可据需要设定,也可无也可无)
8、;变量定义变量定义data1ENDSdata2SEGMENT;数据段数据段2(可据需要设定可据需要设定,也可无也可无)data2ENDScodeSEGMENT;程序段程序段ASSUMECS:code,DS:data1,ES:data2start:、;程序主体部分程序主体部分、MOVAH,4CH;返回返回DOSINT21HcodeENDSENDstart完整汇编语言程序框架(适用于所有完整汇编语言程序框架(适用于所有masm版本版本)一个简化的源程序文件demosim.asm.model.model small small.stack.stack.data.datastringstringdb
9、db Hello,Assembly!Hello,Assembly!,0dh,0ah,0dh,0ah,$.code.codestart:start:mov ax,datamov ax,datamov ds,axmov ds,axmov dx,offset stringmov dx,offset stringmov ah,9mov ah,9int 21hint 21hmov ax,4c00hmov ax,4c00hint 21hint 21hend startend start 简化的汇编语言程序框架(适用于简化的汇编语言程序框架(适用于简化的汇编语言程序框架(适用于简化的汇编语言程序框架(适用于
10、masm5.0/6.0masm5.0/6.0masm5.0/6.0masm5.0/6.0版本版本版本版本).model small.model small;定义程序的;定义程序的存储模式存储模式(小型模式)(小型模式).stack.stack;定义;定义堆栈段堆栈段(默认是(默认是1KB1KB空间)空间).data.data;定义;定义数据段数据段;数据定义;数据定义.code.code;定义;定义代码段代码段start:start:mov ax,datamov ax,data;程序;程序起始点起始点mov ds,axmov ds,ax;设置;设置DSDS指向用户定义的数据段指向用户定义的数据
11、段;程序代码;程序代码mov ax,4c00hmov ax,4c00hint 21hint 21h;程序结束点,返回;程序结束点,返回DOSDOS;子程序代码;子程序代码end startend start;汇编结束,同时指明程序起始点;汇编结束,同时指明程序起始点startstart存储模式存储模式存储模式存储模式存储模式存储模式特特 点点TINY(微型模式)(微型模式)COM类型程序,只有一个小于类型程序,只有一个小于64KB的逻的逻辑段(辑段(MASM 6.x支持)支持)SMALL(小型模式)(小型模式)小应用程序,只有一个代码段和一个数据小应用程序,只有一个代码段和一个数据段(含堆栈段
12、),每段不大于段(含堆栈段),每段不大于64KBCOMPACT(紧凑模式)(紧凑模式)代码少、数据多的程序,只有一个代码段,代码少、数据多的程序,只有一个代码段,但有多个数据段但有多个数据段MEDIUM(中型模式)(中型模式)代码多、数据少的程序,可有多个代码段,代码多、数据少的程序,可有多个代码段,只有一个数据段只有一个数据段LARGE(大型模式)(大型模式)大应用程序,可有多个代码段和多个数据大应用程序,可有多个代码段和多个数据段(静态数据小于段(静态数据小于64KB)HUGE(巨型模式)(巨型模式)更大应用程序,可有多个代码段和多个数更大应用程序,可有多个代码段和多个数据段(对静态数据没
13、有限制)据段(对静态数据没有限制)FLAT(平展模式)(平展模式)32位应用程序,运行在位应用程序,运行在32位位80 x86CPU和和Windows 9x或或NT环境环境完整段定义格式与简化定义格式关系完整段定义格式与简化定义格式关系完整段定义利用完整段定义利用SEGMENTSEGMENT和和ENDSENDS一对伪指令定义一对伪指令定义逻辑段逻辑段同时需要配合同时需要配合ASSUMEASSUME伪指令指明逻辑段是代码段、伪指令指明逻辑段是代码段、堆栈段、数据段还是附加段堆栈段、数据段还是附加段完整段定义的优势是可以指明逻辑段的定位、组合、完整段定义的优势是可以指明逻辑段的定位、组合、类别等属
14、性;而简化段定义只能采用系统默认的属性类别等属性;而简化段定义只能采用系统默认的属性完整段定义和简化段定义的实质是一致的完整段定义和简化段定义的实质是一致的可执行程序的结构可执行程序的结构DOSDOS操作系统支持两种可执行程序结构操作系统支持两种可执行程序结构1.EXE1.EXE程序程序程序可以有多个代码段和多个数据段,程序长度可以程序可以有多个代码段和多个数据段,程序长度可以超过超过64KB64KB通常生成通常生成EXEEXE结构的可执行程序结构的可执行程序2.COM2.COM程序程序只有一个逻辑段,程序长度不超过只有一个逻辑段,程序长度不超过64KB64KB需要满足一定条件才能生成需要满足
15、一定条件才能生成COMCOM结构的可执行程序结构的可执行程序(MASM 6.xMASM 6.x需要采用需要采用TINYTINY模式)模式)(二)语句结构(二)语句结构dataSEGMENT;数据段数据段varDB?dataENDScodeSEGMENT;代码段代码段ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回返回DOScodeENDSENDstart例:例:1.名字项名字项l据语句功能的不同,据语句功能的不同,名字项可用来表示段名、变量名、名字项可用来表示段名、变量名、标号、过程名以及常量名等。
16、标号、过程名以及常量名等。dataSEGMENT;数据段数据段varDB?dataENDScodeSEGMENT;代码段代码段ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回返回DOScodeENDSENDstartl名字项用一个符号表示。名字项用一个符号表示。对符号的规定对符号的规定:由字符由字符AZ,az,09及符号及符号、$、下划线、下划线_等组成,等组成,最长最长31个字符,超出部分忽略。个字符,超出部分忽略。不能用数字打头,以免与十六进制数相混。不能用数字打头,以免与十六进制数相混。不使用
17、汇编程序中的保留字。不使用汇编程序中的保留字。(如指令的助记符等如指令的助记符等)对定义的符号不区分大小写。对定义的符号不区分大小写。汇编语言中的保留字汇编语言中的保留字保留字(保留字(Reserved WordReserved Word)是汇编程序已经利用的标识符(也称为关键字),主要有:是汇编程序已经利用的标识符(也称为关键字),主要有:指令助记符指令助记符例如:例如:MOVMOV、ADDADD伪指令助记符伪指令助记符例如:例如:DBDB、DWDW操作符操作符例如:例如:OFFSETOFFSET、PTRPTR寄存器名寄存器名例如:例如:AXAX、CSCS预定义符号预定义符号例如:例如:da
18、tadata 汇编语言大小写不敏感2.助记符项助记符项助记符可以是指令、伪操作中的助记符。助记符可以是指令、伪操作中的助记符。对于指令对于指令,汇编程序将其翻译成机器语言指令。,汇编程序将其翻译成机器语言指令。MOVAX,100B80001对于伪操作对于伪操作,汇编程序据其要求的功能进行处理。,汇编程序据其要求的功能进行处理。dataSEGMENTdata与一段值对应与一段值对应stringDBLiaoDastring与一内存地址对应与一内存地址对应3操作数项操作数项l操作数给出参与操作的数或数所在的地方。操作数给出参与操作的数或数所在的地方。l操作数多于一个时,用逗号分开。操作数多于一个时,
19、用逗号分开。l操作数可以是操作数可以是常数常数、寄存器、存储器操作数、寄存器、存储器操作数、标号名、过程名或标号名、过程名或表达式表达式等。等。常数常数给出具体的数据。可以是数字常量或字符常量。给出具体的数据。可以是数字常量或字符常量。数字默认十进制,也可加数字默认十进制,也可加D表示十进制数。表示十进制数。如如1234D,1234 数字后加数字后加B表示二进制数。表示二进制数。如如1010B 数字后加数字后加H表示十六进制数。表示十六进制数。如如1234H 字符常量,用单引号表示。字符常量,用单引号表示。如如1234汇编时,用字符对应的汇编时,用字符对应的ASCII表示。表示。如如31H,3
20、2H,33H,34H例例 data1DB12,34,56;十进制;十进制data2DB12H,34H,56H;十六进制;十六进制MOVAL,G;字符;字符stringDB1234;字符串;字符串lA、B、C、D、E、F开头的十六进制数前面加开头的十六进制数前面加0,与与H结尾的标识符区别。结尾的标识符区别。如如寄存器名寄存器名AH、BH、CH、DH变量名变量名abcdH等等例例 movAL,0AHmovAL,AHmovBX,0abcdH4注释项注释项l由分号引出,用来说明语句或程序的功能。由分号引出,用来说明语句或程序的功能。汇编程序对分号后的内容不做处理。汇编程序对分号后的内容不做处理。l作
21、用:作用:注释程序,增强程序可读性。注释程序,增强程序可读性。可放在语句最前,暂时注释某语句,调试程序用。可放在语句最前,暂时注释某语句,调试程序用。例例 、;MOVAH,2;显示提示信息显示提示信息;MOVDL,A;INT21H 、三三指示性语句指示性语句(一)(一)程序开始和结束程序开始和结束 (二)(二)段定义段定义(三)(三)变量定义变量定义(四)(四)ASSUMEASSUME语句语句(五)(五)表达式中的操作符表达式中的操作符(六)(六)过程定义过程定义(七)(七)等值定义等值定义(八)(八)数值回送操作符数值回送操作符指示性语句指示性语句与与指令性语句指令性语句:l指令性语句指令性
22、语句是用指令系统中的指令构成的语句。是用指令系统中的指令构成的语句。例例MOVAX,BXl指示性语句指示性语句是指示汇编程序进行汇编的操作。是指示汇编程序进行汇编的操作。例例 MOVAX,4+8中的中的+codeSEGMENT中的中的SEGMENTMOVBX,OFFSETstring中的中的OFFSET指示性语句与指令性语句指示性语句与指令性语句指示性语句与指令性语句指示性语句与指令性语句指令(指令(InstructionInstruction)使使CPUCPU产生动作、并在程序执行时产生动作、并在程序执行时才处理的指令才处理的指令硬指令就是处理器指令,与具体的处理器有关、与汇编程序硬指令就是
23、处理器指令,与具体的处理器有关、与汇编程序无关无关伪指令(伪指令(DirectiveDirective)不产生不产生CPUCPU动作、在程序执行前由动作、在程序执行前由汇编程序处理的说明性指令汇编程序处理的说明性指令伪指令与具体的处理器类型无关,但与汇编程序有关。不同伪指令与具体的处理器类型无关,但与汇编程序有关。不同版本的汇编程序支持不同的伪指令版本的汇编程序支持不同的伪指令 指令和伪指令采用易于记忆的符合表达,这就是助记符l指示性语句与指令性语句区别指示性语句与指令性语句区别一个程序经汇编,连接和装入内存后,在执行程序之前:一个程序经汇编,连接和装入内存后,在执行程序之前:指示性语句的功能
24、已经完成,故又称伪操作。指示性语句的功能已经完成,故又称伪操作。而指令性语句的功能尚未完成,需控制而指令性语句的功能尚未完成,需控制CPUCPU去执行,才能完成。去执行,才能完成。aaSEGMENT;数据段数据段1str1DBHello!aaENDSbbSEGMENT;数据段数据段2str2DB6dup(?)bbENDSccSEGMENT;代码段代码段ASSUMECS:ccASSUMEDS:aa,ES:bbstart:CLDMOVAX,aaMOVDS,AXLEASI,str1MOVAX,bbMOVES,AXLEADI,str2MOVCX,6REPMOVSBMOVAH,4CHINT21HccEN
25、DSENDstartD:masmDEBUGhello2.exe-U:查看代码段查看代码段12A0:0000FCCLD12A0:0001B89E12MOVAX,129E12A0:00048ED8MOVDS,AX12A0:00068D360000LEASI,000012A0:000AB89F12MOVAX,129F12A0:000D8EC0MOVES,AX12A0:000F8D3E0000LEADI,000012A0:0013B90600MOVCX,000612A0:0016F3REPZ12A0:0017A4MOVSB12A0:0018B44CMOVAH,4C12A0:001ACD21INT21、
26、-D129E:0L10;查看数据段查看数据段1的内容的内容129E:000048656C6C6F210000-0000000000000000Hello!.-D129F:0L10;查看数据段查看数据段2的内容的内容129F:00000000000000000000-0000000000000000.-数据传送源程序数据传送源程序hello2.asm程序经汇编、连接后,装入内存的情况如下:程序经汇编、连接后,装入内存的情况如下:(一)模块定义和程序结束伪操作(一)模块定义和程序结束伪操作1.NAME和和TITLE伪操作伪操作格式格式NAME模块名模块名格式格式TITLE模块名模块名在源程序开始可
27、用在源程序开始可用NAME或或TITLE为模块命名为模块命名,模块名的作用是指示给连接程序进行连接用。模块名的作用是指示给连接程序进行连接用。源程序中可无模块定义,此时源文件名作为模块名。源程序中可无模块定义,此时源文件名作为模块名。2.END伪操作伪操作格式格式END启动地址启动地址作用是指示源程序到此结束。作用是指示源程序到此结束。汇编程序对汇编程序对END之后的语句不进行处理。之后的语句不进行处理。程序中所有有效语句应放在程序中所有有效语句应放在END语句之前。语句之前。源程序中必须有源程序中必须有END结束语句。结束语句。汇编程序对无汇编程序对无END语句的源程序不进行处理语句的源程序
28、不进行处理,只给出无只给出无END语句错误信息。语句错误信息。假设假设TEST.asm是一个无是一个无END语句的汇编语言源程序。语句的汇编语言源程序。其汇编结果如下其汇编结果如下:D:MASM TEST;Microsoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.EndoffileencounteredoninputfileEndoffileencounteredoninputfile49968+421181Bytessymbolspacefree0WarningError
29、s0SevereErrorsD:由于没有由于没有END语句,汇编程序根本没对源程序进行汇编,语句,汇编程序根本没对源程序进行汇编,此时显示警告性错误总数为此时显示警告性错误总数为0,严重性错误总数为,严重性错误总数为0,用户不要被此值的误导用户不要被此值的误导。启动地址可是一个标号或过程名启动地址可是一个标号或过程名,指示程序的入口。指示程序的入口。程序装入内存后,系统跳转到入口处程序装入内存后,系统跳转到入口处,开始执行程序。开始执行程序。aaSEGMENT;数据段数据段1str1DBHello!aaENDSbbSEGMENT;数据段数据段2str2DB6dup(?)bbENDSccSEGM
30、ENT;代码段代码段ASSUMECS:ccASSUMEDS:aa,ES:bbstart:CLDMOVAX,aaMOVDS,AXLEASI,str1MOVAX,SEGstr2MOVES,AXMOVDI,OFFSETstr2MOVCX,6REPMOVSBMOVAH,4CHINT21HccENDSENDstartD:masmDEBUGhello.exe-U:查看代码段查看代码段129F:0000FCCLD129F:0001B89D12MOVAX,129D129F:00048ED8MOVDS,AX129F:00068D360000LEASI,0000129F:000AB89E12MOVAX,129E1
31、29F:000D8EC0MOVES,AX129F:000FBF0000MOVDI,0000129F:0012B90600MOVCX,0006129F:0015F3REPZ129F:0016A4MOVSB129F:0017B44CMOVAH,4C129F:0019CD21INT21、-D129d:0L10;查看数据段查看数据段1的内容的内容129D:000048656C6C6F210000-0000000000000000Hello!.-D129e:0L10;查看数据段查看数据段2的内容的内容129E:00000000000000000000-0000000000000000.-(二)段定义伪操
32、作(二)段定义伪操作格式格式段名段名SEGMENT、段名段名ENDS段定义由伪操作段定义由伪操作SEGMENT开始开始、ENDS结束结束。其中:其中:SEGMENT和和ENDS必须成对出现,必须成对出现,且语句前必须有段名,且语句前必须有段名,段名必须相同段名必须相同。SEGMENT和和ENDS语句之间可以有指令和其他伪操作语句之间可以有指令和其他伪操作,表示存放在该段内存的变量、指令或其他伪操作对该段内存的处理表示存放在该段内存的变量、指令或其他伪操作对该段内存的处理程序中可以定义多个段。程序中可以定义多个段。程序经汇编、连接及装入内存后,段名为一具体的段值。程序经汇编、连接及装入内存后,段
33、名为一具体的段值。aaSEGMENT;数据段数据段1str1DBHello!aaENDSbbSEGMENT;数据段数据段2str2DB6dup(?)bbENDSccSEGMENT;代码段代码段ASSUMECS:ccASSUMEDS:aa,ES:bbstart:CLDMOVAX,aaMOVDS,AXLEASI,str1MOVAX,bbMOVES,AXLEADI,str2MOVCX,6REPMOVSBMOVAH,4CHINT21HccENDSENDstartD:masmDEBUGhello2.exe-U:查看代码段查看代码段12A0:0000FCCLD12A0:0001B89E12MOVAX,12
34、9E12A0:00048ED8MOVDS,AX12A0:00068D360000LEASI,000012A0:000AB89F12MOVAX,129F12A0:000D8EC0MOVES,AX12A0:000F8D3E0000LEADI,000012A0:0013B90600MOVCX,000612A0:0016F3REPZ12A0:0017A4MOVSB12A0:0018B44CMOVAH,4C12A0:001ACD21INT21、-D129E:0L10;查看数据段查看数据段1的内容的内容129E:000048656C6C6F210000-0000000000000000Hello!.-D1
35、29F:0L10;查看数据段查看数据段2的内容的内容129F:00000000000000000000-0000000000000000.-数据传送源程序:数据传送源程序:程序经汇编、连接后,装入内存的情况如下:程序经汇编、连接后,装入内存的情况如下:(三)变量定义伪操作(三)变量定义伪操作格式格式变量名变量名类型助记符类型助记符操作数操作数,操作数操作数,.用来定义程序中所用的内存操作数。用来定义程序中所用的内存操作数。其中其中变量名变量名指示内存操作数的地址(符号地址)指示内存操作数的地址(符号地址)类型助记符类型助记符指示内存操作数的类型指示内存操作数的类型(字节、字、双字等字节、字、双
36、字等)操作数操作数指示内存操作数的内容指示内存操作数的内容汇编程序将定义的操作数,按其类型分配内存单元数汇编程序将定义的操作数,按其类型分配内存单元数,顺序存入变量名指向的内存单元中。顺序存入变量名指向的内存单元中。常用的类型助记符有:常用的类型助记符有:DB指示其后的操作数为字节类型指示其后的操作数为字节类型DW指示其后的操作数为字类型指示其后的操作数为字类型DD指示其后的操作数为双字类型指示其后的操作数为双字类型例例:定义赋初值的变量定义赋初值的变量dataSEGMENTxxDB1,-1,0fcHyyDW1,-1,0fcHzzDD1,-1,0fcHdataENDS例例:定义字符串变量定义字
37、符串变量(只能用只能用DB定义定义)dataSEGMENTstr1DBLiaochenstr2DBINPUT:,0dH,0aH,$dataENDS注意注意:3个及其以上的字符,个及其以上的字符,只能用只能用DB定义定义str1DWabcdstr2DDabcdstr1str24C69616F63686E67494e5055543a0d0a24LiaochenINPUT:0dH0aH$操作数可以是用操作数可以是用常量、表达式和常量、表达式和?表示。表示。常量和表达式常量和表达式表示内存操作数的初始值表示内存操作数的初始值,其值应在其定义的类型范围内,否则汇编出错。其值应在其定义的类型范围内,否则汇
38、编出错。例例aaDB270bbDW80000用用?表示不置初始值的内存操作数。表示不置初始值的内存操作数。例例ccDB?可用可用DUP复制操作符复制操作符定义相同的操作数,其格式为定义相同的操作数,其格式为重复次数重复次数DUP(操作数操作数)例例eeDB3DUP(4)等价于等价于eeDB4,4,4dataSEGMENTxxDB1,-1,0FCHyyDW1,-1,0FCHzzDD1,-1,0FCHstrDBTsingHuabufDB4,?,4DUP(?)DBdataenddataENDScodeSEGMENTASSUMECS:codeASSUMEDS:datastart:MOVAX,dataM
39、OVDS,AXLEABX,xxLEASI,yyLEADI,zzMOVAH,4CHINT21HcodeENDSENDstart例例:在在DEBUG下查看变量存放情况。下查看变量存放情况。(四)(四)ASSUME伪操作伪操作格式格式ASSUME段寄存器:段名段寄存器:段名,段寄存器段寄存器:段名段名,其中其中段寄存器段寄存器为为CS、DS、ES、SS中的一个中的一个段名段名为用伪操作为用伪操作SEGMENT定义过的段名定义过的段名例例 ASSUMECS:cc,DS:aaASSUME伪操作的作用伪操作的作用指示汇编程序指令中用到的标号、过程及变量所在的段。指示汇编程序指令中用到的标号、过程及变量所在
40、的段。其中其中对标号、过程必须用对标号、过程必须用CS段寄存器指示段寄存器指示对变量可用对变量可用CS、DS、ES、SS段寄存器指示段寄存器指示若未用若未用ASSUME语句指示指令中用到的标号、语句指示指令中用到的标号、过程和变量所在的段过程和变量所在的段,汇编程序将给出错误信息。汇编程序将给出错误信息。ASSUME语句只起指示作用,并无实际的操作。语句只起指示作用,并无实际的操作。在程序中引用定义的变量做内存操作数时,在程序中引用定义的变量做内存操作数时,需按寻址方式用传送指令(如需按寻址方式用传送指令(如MOV)给相应的段寄存器赋值)给相应的段寄存器赋值。例例用程序实现用程序实现1234H
41、+5678HdataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;给给DS赋值赋值MOVDS,AXMOVAX,value;取数取数ADDAX,value+2;两数相加两数相加MOVresult,AX;保存结果保存结果MOVAH,4CH;返回返回DOSINT21HcodeENDSENDstart注释掉注释掉ASSUME语句,其汇编结果:语句,其汇编结果:dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGME
42、NT;ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVAX,valueADDAX,value+2MOVresult,AXMOVAH,4CHINT 21HcodeENDSENDstartD:MASMMASMassume;Microsoft(R)MacroAssemblerVersion5.10Copyright(C)Microsoft Corp 1981,1988.All rightsreserved.assume.ASM(8):MissingorunreachableCSassume.ASM(10):Cannotaddresswithsegmen
43、tregisterassume.ASM(11):Cannotaddresswithsegmentregisterassume.ASM(12):Cannotaddresswithsegmentregister49872+421341Bytessymbolspacefree0WarningErrors4SevereErrorsD:MASM程序中有程序中有ASSUME语句,经汇编,连接和装入内存后的情况:语句,经汇编,连接和装入内存后的情况:dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENTASSUMECS:code,DS:datast
44、art:MOVAX,data;给给DS赋值赋值MOVDS,AXMOVAX,value;取数取数ADDAX,value+2;两数相加两数相加MOVresult,AX;保存结果保存结果MOVAH,4CH;返回返回DOSINT21HcodeENDSD:MASMDEBUGassume.exe-R;查看程序执行前各寄存器查看程序执行前各寄存器AX=0000BX=0000CX=0023DX=0000SP=0000BP=0000SI=0000DI=0000DS=1295ES=1295SS=12A5CS=12A6IP=0000NVUPEIPLNZNAPONC12A6:0000B8A512MOVAX,12A5-
45、U;查看在内存的程序查看在内存的程序12A6:0000B8A512MOVAX,12A512A6:00038ED8MOVDS,AX12A6:0005A10000MOVAX,000012A6:000803060200ADDAX,000212A6:000CA30400MOV0004,AX12A6:000FB44CMOVAH,4C12A6:0011CD21INT21、-注意:注意:程序装入内存后,执行程序前,程序装入内存后,执行程序前,当前的当前的DS值并非程序定义的值并非程序定义的data段值,段值,1295不等于不等于12A5思考:思考:如果上例中没有如果上例中没有MOVDS,AX程序执行的结果会
46、怎样?程序执行的结果会怎样?D:MASMDEBUGassume.exe-R;查看程序执行前各寄存器查看程序执行前各寄存器AX=0000BX=0000CX=0023DX=0000SP=0000BP=0000SI=0000DI=0000DS=1295ES=1295SS=12A5CS=12A6IP=0000NVUPEIPLNZNAPONC12A6:0000B8A512MOVAX,12A5-U;查看在内存的程序查看在内存的程序12A6:0000B8A512MOVAX,12A512A6:0003A10000MOVAX,000012A6:000603060200ADDAX,000212A6:000AA30
47、400MOV0004,AX12A6:000DB44CMOVAH,4C12A6:000FCD21INT21、dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;给给DS赋值赋值;MOVDS,AXMOVAX,value;取数取数ADDAX,value+2;两数相加两数相加MOVresult,AX;保存结果保存结果MOVAH,4CH;返回返回DOSINT21HcodeENDS结论:结论:1.ASSUME语句只起指示作用语句只起指示作用,没有赋值作用没有赋值作用2.
48、程序中用到内存操作数时,程序中用到内存操作数时,应按操作数的寻址方式应按操作数的寻址方式,给相应的段寄存器赋值给相应的段寄存器赋值。u汇编语言程序举例汇编语言程序举例了解了解DOS的返回,装入功能的返回,装入功能例例将将BL寄存器的内容按二进制形式显示出来寄存器的内容按二进制形式显示出来(BL)MOVCX,8;显示字符个数为显示字符个数为8next:SHLBL,1;将显示位移至将显示位移至CF中中JCone;CF=1?MOVDL,30H;CF=0,将将0的的ASCII放在放在DL中中JMPexitone:MOVDL,31H;CF=1,将将1的的ASCII放在放在DL中中exit:MOVAH,2
49、INT21H;调用调用DOS功能显示功能显示DECCX;循环次数减循环次数减1JNZnext;判断是否结束判断是否结束 、3130313030313130codeSEGMENTASSUMECS:codestart:.codeENDSENDstartMOVCX,8;显示字符个数为显示字符个数为8next:SHLBL,1;将显示位移至将显示位移至CF中中JCone;CF=1?MOVDL,30H;CF=0,将将0的的ASCII放在放在DL中中JMPexitone:MOVDL,31H;CF=1,将将1的的ASCII放在放在DL中中exit:MOVAH,2INT21H;调用调用DOS功能显示功能显示DE
50、CCX;循环次数减循环次数减1JNZnext;判断是否结束判断是否结束D:MASMSBL;汇编成汇编成ShowBL.objMicrosoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.48912+447243Bytessymbolspacefree0WarningErrors0SevereErrorsD:LINKSBL;连接成连接成ShowBL.exeMicrosoft(R)OverlayLinkerVersion3.61Copyright(C)MicrosoftCorp198