汇编程序设计及高级汇编语言技术_第1页
汇编程序设计及高级汇编语言技术_第2页
汇编程序设计及高级汇编语言技术_第3页
汇编程序设计及高级汇编语言技术_第4页
汇编程序设计及高级汇编语言技术_第5页
已阅读5页,还剩198页未读 继续免费阅读

下载本文档

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

文档简介

1、第汇编语言上机过程汇编语言上机过程第汇编语言程序结构汇编语言程序结构第指示性语句指示性语句第汇编语言程序举例汇编语言程序举例第BIOS和和DOS功能调用功能调用第汇编语言程序设计汇编语言程序设计一、汇编语言上机过程一、汇编语言上机过程上机环境上机环境硬件硬件系统软件系统软件应用软件应用软件操作系统:操作系统:DOS系统系统编辑器编辑器:EDIT.exe编程序编程序:MASM.exe连接程序连接程序:LINK.exe调试程序:调试程序:DEBUG.exe用户开发的程序:用户开发的程序:ABC.exe等等CPU、存储器、存储器(ROM、RAM)、I/O接口、输入、输出设备接口、输入、输出设备汇编语

2、言上机过程汇编语言上机过程D:EDITABC.asmD:MASMABC;有语法错,回有语法错,回EDIT下改该程序下改该程序D:LINKABC;有错,回在有错,回在EDIT下改程序下改程序D:ABC运行结果错,回运行结果错,回EDIT下改程序下改程序或在或在DEBUG下调试,找原因。下调试,找原因。D:DEBUGABC.exe编辑源程序编辑源程序 EDITABC.ASM汇编源程序汇编源程序 MASM ABC.ASM形成目标程序形成目标程序 ABC.OBJ连接目标程序连接目标程序LINKABC.OBJ有连接错误信息有连接错误信息? ?形成可执行程序形成可执行程序 ABC.EXE装入可执行程序到内

3、存装入可执行程序到内存 , ,并执行并执行D:subABC下一程序下一程序用用DEBUG调试可执行程序调试可执行程序D:sub DEBUGABC.EXE找到原因找到原因YNYNNYN有汇编错误信息有汇编错误信息 ? ?Y运行结果正确运行结果正确 ? ?用用DEBUG调试程序查错调试程序查错 ? ?二、汇编语言程序结构二、汇编语言程序结构一、程序结构一、程序结构l程序由数条语句构成,每条语句占一行。程序由数条语句构成,每条语句占一行。指令性语句指令性语句(指令语句指令语句)指示性语句指示性语句(伪指令语句伪指令语句)l分段结构分段结构程序按段编写程序按段编写,与与8088内存分段编址相对应。内存

4、分段编址相对应。每段由伪操作每段由伪操作SEGMENT开始、由开始、由ENDS结束。结束。l程序最后为程序最后为END结束语句,后跟一启动地址。结束语句,后跟一启动地址。启动地址指示程序开始执行的第一条语句。启动地址指示程序开始执行的第一条语句。l程序中设有返回程序中设有返回DOS的功能。的功能。使程序执行完后返回使程序执行完后返回DOS系统的命令接受状态。系统的命令接受状态。l程序中用到内存操作数时程序中用到内存操作数时,应按操作数的寻址方式应按操作数的寻址方式,给相应的段寄存器赋值给相应的段寄存器赋值;汇编语言程序结构例一汇编语言程序结构例一movs.asm;实现数据传送功能实现数据传送功

5、能aaSEGMENT;数据段数据段1str1DBHello!aaENDSbbSEGMENT;数据段数据段2str2DB6dup(?)bbENDSccSEGMENT;代码段代码段ASSUMECS:cc,DS:aa,ES:bbstart:CLDMOVAX,aaMOVDS,AXLEASI,str1MOVAX,SEGstr2MOVES,AXMOVDI,OFFSETstr2MOVCX,6REPMOVSBMOVAH,4CHINT21H;返回返回DOSccENDSENDstart;指示程序结束指示程序结束程序可由多个段构成,至少有一个代码段程序可由多个段构成,至少有一个代码段;汇编语言程序结构例二(子程结构

6、)汇编语言程序结构例二(子程结构)scans.asm;用二进制显示中断向量表中(用二进制显示中断向量表中(0:00:3FFH)数据)数据D0H的个数的个数keyEQU0D0H;用符号表示常量用符号表示常量(关键字关键字)codeSEGMENT;代码段开始代码段开始ASSUMECS:codebegin:MOVAX,0000HMOVDS,AXMOVSI,0000HMOVCX,0400HMOVBX,0MOVAL,keynext:CMPSI,ALJNZpointINCBXpoint:INCSILOOPnextCALLdisplay;调用显示子程调用显示子程MOVAH,4CH;返回返回DOSINT21H

7、;用二进制显示用二进制显示BX内容子程内容子程displayPROCMOVCX,16rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回子程返回displayENDPcodeENDS;代码段结束代码段结束ENDbegin;指示程序结束和指示程序结束和;程序入口程序入口二、语句结构二、语句结构名名字字:助助记记符符操操作作数数,;注注释释名名字字项项助助记记符符项项操操作作数数项项注注释释项项dataSEGMENT;数据段数据段varDB?dataENDScodeSEGMENT;代码段代码段ASSUMEC

8、S:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回返回DOScodeENDSENDstart例:例:名名字字: 助助记记符符 操操作作数数, ;注注释释名名字字项项 助助记记符符项项 操操作作数数项项 注注释释项项1.名字项名字项l据语句功能的不同,据语句功能的不同,名字项可用来表示段名、变量名、名字项可用来表示段名、变量名、标号、过程名以及常量名等。标号、过程名以及常量名等。dataSEGMENT;数据段数据段varDB?dataENDScodeSEGMENT;代码段代码段ASSUMECS:code,DS:dat

9、astart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回返回DOScodeENDSENDstartl名字项用一个符号表示。名字项用一个符号表示。 对符号的规定对符号的规定:由字符由字符AZ,az,09及符号及符号、$、下划线、下划线_等组成,等组成,最长最长31个字符,超出部分忽略。个字符,超出部分忽略。不能用数字打头,以免与十六进制数相混。不能用数字打头,以免与十六进制数相混。不使用汇编程序中的保留字。不使用汇编程序中的保留字。(如指令的助记符等如指令的助记符等)对定义的符号不区分大小写。对定义的符号不区分大小写。名名字字: 助助记记符符 操操

10、作作数数, ;注注释释名名字字项项 助助记记符符项项 操操作作数数项项 注注释释项项名名字字: 助助记记符符 操操作作数数, ;注注释释名名字字项项 助助记记符符项项 操操作作数数项项 注注释释项项2.助记符项助记符项助记符可以是指令、伪操作中的助记符。助记符可以是指令、伪操作中的助记符。对于指令对于指令,汇编程序将其翻译成机器语言指令。,汇编程序将其翻译成机器语言指令。MOVAX,100B80001对于伪操作对于伪操作,汇编程序据其要求的功能进行处理。,汇编程序据其要求的功能进行处理。dataSEGMENTdata与一段值对应与一段值对应stringDBTsinghuastring与一内存地

11、址对应与一内存地址对应3操作数项操作数项l操作数给出参与操作的数或数所在的地方。操作数给出参与操作的数或数所在的地方。l操作数多于一个时,用逗号分开。操作数多于一个时,用逗号分开。l操作数可以是操作数可以是常数常数、寄存器、存储器操作数、寄存器、存储器操作数、标号名、过程名或标号名、过程名或表达式表达式等。等。名名字字: 助助记记符符 操操作作数数, ;注注释释名名字字项项 助助记记符符项项 操操作作数数项项 注注释释项项常数常数给出具体的数据。可以是数字常量或字符常量。给出具体的数据。可以是数字常量或字符常量。数字默认十进制,也可加数字默认十进制,也可加D表示十进制数。表示十进制数。如如12

12、34D,1234数字后加数字后加B表示二进制数。表示二进制数。如如1010B数字后加数字后加H表示十六进制数。表示十六进制数。如如1234H字符常量,用单引号表示。字符常量,用单引号表示。如如1234汇编时,用字符对应的汇编时,用字符对应的ASCII表示。表示。如如31H,32H,33H,34H例例 data1DB12,34,56;十进制;十进制data2DB12H,34H,56H;十六进制;十六进制MOVAL,G;字符;字符stringDB1234;字符串;字符串lA、B、C、D、E、F开头的十六进制数前面加开头的十六进制数前面加0,与与H结尾的标识符区别。结尾的标识符区别。如如寄存器名寄存

13、器名AH、BH、CH、DH变量名变量名abcdH等等例例 movAL,0AHmovAL,AHmovBX,0abcdH4注释项注释项l由分号引出,用来说明语句或程序的功能。由分号引出,用来说明语句或程序的功能。汇编程序对分号后的内容不做处理。汇编程序对分号后的内容不做处理。l作用:作用:注释程序,增强程序可读性。注释程序,增强程序可读性。可放在语句最前,暂时注释某语句,调试程序用。可放在语句最前,暂时注释某语句,调试程序用。例例 、;MOVAH,2;显示提示信息显示提示信息;MOVDL,A;INT21H 、名名字字: 助助记记符符 操操作作数数, ;注注释释名名字字项项 助助记记符符项项 操操作

14、作数数项项 注注释释项项第三节第三节指示性语句指示性语句/第四节第四节汇编语言程序举例汇编语言程序举例一、一、程序开始和结束程序开始和结束二、二、段定义段定义三、三、变量定义变量定义四、四、ASSUME语句语句汇编语言程序汇编语言程序举例一举例一了解了解DOS的返回,装入功能的返回,装入功能五、五、表达式及表达式中的操作符表达式及表达式中的操作符汇编语言程序例二汇编语言程序例二六、六、过程定义过程定义(第五节程序设计介绍第五节程序设计介绍)七、七、等值定义等值定义(第五节程序设计介绍第五节程序设计介绍)汇编语言程序例三汇编语言程序例三(第五节程序设计介绍第五节程序设计介绍)指示性语句与指令性语

15、句:指示性语句与指令性语句:l指令性语句指令性语句是用指令系统中的指令构成的语句。是用指令系统中的指令构成的语句。例例MOVAX,BXl指示性语句指示性语句是指示汇编程序进行汇编的操作。是指示汇编程序进行汇编的操作。例例 MOVAX,4+8中的中的+codeSEGMENT中的中的SEGMENTMOVBX,OFFSETstring中的中的OFFSETl指示性语句与指令性语句区别指示性语句与指令性语句区别一个程序经汇编,连接和装入内存后,在执行程序之前:一个程序经汇编,连接和装入内存后,在执行程序之前:指示性语句的功能已经完成,故又称伪操作。指示性语句的功能已经完成,故又称伪操作。而指令性语句的功

16、能尚未完成,需控制而指令性语句的功能尚未完成,需控制CPU去执行,才能完成。去执行,才能完成。aaSEGMENT;数据段数据段1str1DBHello!aaENDSbbSEGMENT;数据段数据段2str2DB6dup(?)bbENDSccSEGMENT;代码段代码段ASSUMECS:ccASSUMEDS:aa,ES:bbstart:CLDMOVAX,aaMOVDS,AXLEASI,str1MOVAX,bbMOVES,AXLEADI,str2MOVCX,6REPMOVSBMOVAH,4CHINT21HccENDSENDstartD:masmDEBUGhello2.exe-U:查看代码段查看代码

17、段12A0:0000FCCLD12A0:0001B89E12MOVAX,129E12A0:00048ED8MOVDS,AX12A0:00068D360000LEASI,000012A0:000AB89F12MOVAX,129F12A0:000D8EC0MOVES,AX12A0:000F8D3E0000LEADI,000012A0:0013B90600MOVCX,000612A0:0016F3REPZ12A0:0017A4MOVSB12A0:0018B44CMOVAH,4C12A0:001ACD21INT21、-D129E:0L10;查看数据段查看数据段1的内容的内容129E:000048656

18、C6C6F210000-0000000000000000Hello!.-D129F:0L10;查看数据段查看数据段2的内容的内容129F:00000000000000000000-0000000000000000.- -数据传送源程序数据传送源程序hello2.asm程序经汇编、连接后,装入内存的情况如下:程序经汇编、连接后,装入内存的情况如下:常用伪操作介绍常用伪操作介绍一、一、程序开始和结束程序开始和结束二、二、段定义段定义三、三、变量定义变量定义四、四、ASSUME语句语句五、五、表达式中的操作符表达式中的操作符六、六、过程定义过程定义七、七、等值定义等值定义一一、模块定义和程序结束伪操

19、作模块定义和程序结束伪操作1.NAME和和TITLE伪操作伪操作格式格式NAME模块名模块名格式格式TITLE模块名模块名在源程序开始可用在源程序开始可用NAME或或TITLE为模块命名为模块命名,模块名的作用是指示给连接程序进行连接用。模块名的作用是指示给连接程序进行连接用。源程序中可无模块定义,此时源文件名作为模块名。源程序中可无模块定义,此时源文件名作为模块名。 2.END伪操作伪操作格式格式END启动地址启动地址作用是指示源程序到此结束。作用是指示源程序到此结束。汇编程序对汇编程序对END之后的语句不进行处理。之后的语句不进行处理。程序中所有有效语句应放在程序中所有有效语句应放在END

20、语句之前。语句之前。源程序中必须有源程序中必须有END结束语句。结束语句。汇编程序对无汇编程序对无END语句的源程序不进行处理语句的源程序不进行处理,只给出无只给出无END语句错误信息。语句错误信息。假设假设TEST.asm是一个无是一个无END语句的汇编语言源程序。语句的汇编语言源程序。其汇编结果如下其汇编结果如下:D:MASM TEST; Microsoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.EndoffileencounteredoninputfileEndoff

21、ileencounteredoninputfile49968+421181Bytessymbolspacefree0WarningErrors0SevereErrorsD:由于没有由于没有END语句,汇编程序根本没对源程序进行汇编,语句,汇编程序根本没对源程序进行汇编,此时显示警告性错误总数为此时显示警告性错误总数为0,严重性错误总数为,严重性错误总数为0,用户不要被此值的误导用户不要被此值的误导。启动地址可是一个标号或过程名启动地址可是一个标号或过程名,指示程序的入口。指示程序的入口。程序装入内存后,系统跳转到入口处程序装入内存后,系统跳转到入口处,开始执行程序。开始执行程序。aaSEGME

22、NT;数据段数据段1str1DBHello!aaENDSbbSEGMENT;数据段数据段2str2DB6dup(?)bbENDSccSEGMENT;代码段代码段ASSUMECS:ccASSUMEDS:aa,ES:bbstart:CLDMOVAX,aaMOVDS,AXLEASI,str1MOVAX,SEGstr2MOVES,AXMOVDI,OFFSETstr2MOVCX,6REPMOVSBMOVAH,4CHINT21HccENDSENDstartD:masmDEBUGhello.exe- -U:查看代码段查看代码段129F:0000FCCLD129F:0001B89D12MOVAX,129D12

23、9F:00048ED8MOVDS,AX129F:00068D360000LEASI,0000129F:000AB89E12MOVAX,129E129F:000D8EC0MOVES,AX129F:000FBF0000MOVDI,0000129F:0012B90600MOVCX,0006129F:0015F3REPZ129F:0016A4MOVSB129F:0017B44CMOVAH,4C129F:0019CD21INT21、- -D129d:0l10;查看数据段查看数据段1的内容的内容129D:000048656C6C6F210000-0000000000000000Hello!.- -D129

24、e:0l10;查看数据段查看数据段2的内容的内容129E:00000000000000000000-0000000000000000.- -二、段定义伪操作二、段定义伪操作格式格式段名段名SEGMENT、段名段名ENDS段定义由伪操作段定义由伪操作SEGMENT开始开始、ENDS结束结束。其中:其中:SEGMENT和和ENDS必须成对出现,必须成对出现,且语句前必须有段名,且语句前必须有段名,段名必须相同段名必须相同。SEGMENT和和ENDS语句之间可以有指令和其他伪操作语句之间可以有指令和其他伪操作,表示存放在该段内存的变量、指令或其他伪操作对该段内存的处理表示存放在该段内存的变量、指令或

25、其他伪操作对该段内存的处理程序中可以定义多个段。程序中可以定义多个段。程序经汇编、连接及装入内存后,段名为一具体的段值。程序经汇编、连接及装入内存后,段名为一具体的段值。aaSEGMENT;数据段数据段1str1DBHello!aaENDSbbSEGMENT;数据段数据段2str2DB6dup(?)bbENDSccSEGMENT;代码段代码段ASSUMECS:ccASSUMEDS:aa,ES:bbstart:CLDMOVAX,aaMOVDS,AXLEASI,str1MOVAX,bbMOVES,AXLEADI,str2MOVCX,6REPMOVSBMOVAH,4CHINT21HccENDSEND

26、startD:masmDEBUGhello2.exe-U:查看代码段查看代码段12A0:0000FCCLD12A0:0001B89E12MOVAX,129E12A0:00048ED8MOVDS,AX12A0:00068D360000LEASI,000012A0:000AB89F12MOVAX,129F12A0:000D8EC0MOVES,AX12A0:000F8D3E0000LEADI,000012A0:0013B90600MOVCX,000612A0:0016F3REPZ12A0:0017A4MOVSB12A0:0018B44CMOVAH,4C12A0:001ACD21INT21、-D129

27、E:0L10;查看数据段查看数据段1的内容的内容129E:000048656C6C6F210000-0000000000000000Hello!.-D129F:0L10;查看数据段查看数据段2的内容的内容129F:00000000000000000000-0000000000000000.- -数据传送源程序:程序经汇编、连接后,装入内存的情况如下:数据传送源程序:程序经汇编、连接后,装入内存的情况如下:三、变量定义伪操作三、变量定义伪操作格式格式变量名变量名类型助记符类型助记符操作数操作数,操作数操作数,.用来定义程序中所用的内存操作数。用来定义程序中所用的内存操作数。其中其中变量名变量名指

28、示内存操作数的地址(符号地址)指示内存操作数的地址(符号地址)类型助记符类型助记符指示内存操作数的类型指示内存操作数的类型(字节、字、双字等字节、字、双字等)操作数操作数指示内存操作数的内容指示内存操作数的内容汇编程序将定义的操作数,按其类型分配内存单元数汇编程序将定义的操作数,按其类型分配内存单元数,顺序存入变量名指向的内存单元中。顺序存入变量名指向的内存单元中。常用的类型助记符有:常用的类型助记符有:DB指示其后的操作数为字节类型指示其后的操作数为字节类型DW指示其后的操作数为字类型指示其后的操作数为字类型DD指示其后的操作数为双字类型指示其后的操作数为双字类型例例1:定义赋初值的变量定义

29、赋初值的变量dataSEGMENTxxDB1,-1,0fcHyyDW1,-1,0fcHzzDD1,-1,0fcHdataENDSxxyyzz01FFFC0100FFFFFC0001000000FFFFFFFFFC0000001- -1FC1- -1FC1- -1FC例例2:定义字符串变量定义字符串变量(只能用只能用DB定义定义)dataSEGMENTstr1DBTsingHuastr2DBINPUT:,0dH,0aH,$dataENDS注意注意:3个及其以上的字符,个及其以上的字符,只能用只能用DB定义定义str1DWabcdstr2DDabcdstr1str25473696e67487561

30、494e5055543a0d0a24TsingHuaINPUT:0dH0aH$操作数可以是用操作数可以是用常量、表达式和常量、表达式和?表示。表示。常量和表达式常量和表达式表示内存操作数的初始值表示内存操作数的初始值,其值应在其定义的类型范围内,否则汇编出错。其值应在其定义的类型范围内,否则汇编出错。例例aaDB270bbDW80000用用?表示不置初始值的内存操作数。表示不置初始值的内存操作数。例例ccDB?可用可用DUP复制操作符复制操作符定义相同的操作数,其格式为定义相同的操作数,其格式为重复次数重复次数DUP(操作数操作数)例例eeDB3DUP(4)等价于等价于eeDB4,4,4dat

31、aSEGMENTxxDB1,-1,0FCHyyDW1,-1,0FCHzzDD1,-1,0FCHstrDBTsingHuabufDB4,?,4DUP(?)DBdataenddataENDScodeSEGMENTASSUMECS:codeASSUMEDS:datastart:MOVAX,dataMOVDS,AXLEABX,xxLEASI,yyLEADI,zzMOVAH,4CHINT21HcodeENDSENDstartD:MASMDEBUGvarible.exe- -U12A1:0000B89E12MOVAX,129E12A1:00038ED8MOVDS,AX12A1:00058D1E0000LE

32、ABX,000012A1:00098D360300LEASI,000312A1:000D8D3E0900LEADI,000912A1:00118D1E1500LEABX,001512A1:00158D361D00LEASI,001D12A1:0019B44CMOVAH,4C12A1:001BCD21INT2112A1:001DFF36243EPUSH3E24-D129E:0L30129E:000001FFFC0100FFFFFC-0001000000FFFFFF.129E:0010FFFC000000547369-6E67487561040000.TsingHua.129E:002000000

33、06461746165-6E64000000000000.dataend.129E:0030B89E128ED88D1E00-008D3603008D3E09.6.- -xxyyzzstrbufdataend段段名名data变变量量xx变变量量yy变变量量zz变变量量str变变量量buf例例4:在在DEBUG下查看变量存放情况。下查看变量存放情况。四、四、ASSUME伪操作伪操作格式格式ASSUME段寄存器:段名段寄存器:段名,段寄存器段寄存器:段名段名,其中其中段寄存器段寄存器为为CS、DS、ES、SS中的一个中的一个段名段名为用伪操作为用伪操作SEGMENT定义过的段名定义过的段名例例 A

34、SSUMECS:cc,DS:aaASSUME伪操作的作用伪操作的作用指示汇编程序指令中用到的标号、过程及变量所在的段。指示汇编程序指令中用到的标号、过程及变量所在的段。其中其中对标号、过程必须用对标号、过程必须用CS段寄存器指示段寄存器指示对变量可用对变量可用CS、DS、ES、SS段寄存器指示段寄存器指示若未用若未用ASSUME语句指示指令中用到的标号、语句指示指令中用到的标号、过程和变量所在的段过程和变量所在的段,汇编程序将给出错误信息。汇编程序将给出错误信息。ASSUME语句只起指示作用,并无实际的操作。语句只起指示作用,并无实际的操作。在程序中引用定义的变量做内存操作数时,在程序中引用定

35、义的变量做内存操作数时,需按寻址方式用传送指令(如需按寻址方式用传送指令(如MOV)给相应的段寄存器赋值给相应的段寄存器赋值。例例用程序实现用程序实现1234H+5678Hvalueresult341278560000dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;给给DS赋值赋值MOVDS,AXMOVAX,value;取数取数ADDAX,value+2;两数相加两数相加MOVresult,AX;保存结果保存结果MOVAH,4CH;返回返回DOSINT2

36、1HcodeENDSENDstart注释掉注释掉ASSUME语句,其汇编结果:语句,其汇编结果:dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENT;ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVAX,valueADDAX,value+2MOVresult,AXMOVAH,4CHINT 21HcodeENDSENDstartD:MASMMASMassume;Microsoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp19

37、81,1988.Allrightsreserved.assume.ASM(8):MissingorunreachableCSassume.ASM(10):Cannotaddresswithsegmentregisterassume.ASM(11):Cannotaddresswithsegmentregisterassume.ASM(12):Cannotaddresswithsegmentregister49872+421341Bytessymbolspacefree0WarningErrors4SevereErrorsD:MASM程序中有程序中有ASSUME语句,经汇编,连接和装入内存后的情况

38、:语句,经汇编,连接和装入内存后的情况:dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;给给DS赋值赋值MOVDS,AXMOVAX,value;取数取数ADDAX,value+2;两数相加两数相加MOVresult,AX;保存结果保存结果MOVAH,4CH;返回返回DOSINT21HcodeENDSD:MASMDEBUGassume.exe- -R;查看程序执行前各寄存器查看程序执行前各寄存器AX=0000BX=0000CX=0023DX=0000SP=

39、0000BP=0000SI=0000DI=0000DS=1295ES=1295SS=12A5CS=12A6IP=0000NVUPEIPLNZNAPONC12A6:0000B8A512MOVAX,12A5- -U;查看在内存的程序查看在内存的程序12A6:0000B8A512MOVAX,12A512A6:00038ED8MOVDS,AX12A6:0005A10000MOVAX,000012A6:000803060200ADDAX,000212A6:000CA30400MOV0004,AX12A6:000FB44CMOVAH,4C12A6:0011CD21INT21、-注意:注意: 程序装入内存后

40、,执行程序前,程序装入内存后,执行程序前,当前的当前的DS值并非程序定义的值并非程序定义的data段值,段值,1295不等于不等于12A5思考:思考:如果上例中没有如果上例中没有MOVDS,AX程序执行的结果会怎样?程序执行的结果会怎样?D:MASMDEBUGassume.exe- -R; ;查看程序执行前各寄存器查看程序执行前各寄存器AX=0000BX=0000CX=0023DX=0000SP=0000BP=0000SI=0000DI=0000DS=1295ES=1295SS=12A5CS=12A6IP=0000NVUPEIPLNZNAPONC12A6:0000B8A512MOVAX,12A

41、5- -U; ;查看在内存的程序查看在内存的程序12A6:0000B8A512MOVAX,12A512A6:0003A10000MOVAX,000012A6:000603060200ADDAX,000212A6:000AA30400MOV0004,AX12A6:000DB44CMOVAH,4C12A6:000FCD21INT21、dataSEGMENTvalueDW1234H,5678HresultDW?dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;给给DS赋值赋值;MOVDS,AXMOVAX,value;取数取数ADDAX,

42、value+2;两数相加两数相加MOVresult,AX;保存结果保存结果MOVAH,4CH;返回返回DOSINT21HcodeENDS结论:结论:1.ASSUME语句只起指示作用语句只起指示作用,没有赋值作用没有赋值作用2.程序中用到内存操作数时,程序中用到内存操作数时,应按操作数的寻址方式应按操作数的寻址方式,给相应的段寄存器赋值给相应的段寄存器赋值。第三节第三节指示性语句指示性语句/第四节第四节汇编语言程序举例汇编语言程序举例一、一、程序开始和结束程序开始和结束二、二、段定义段定义三、三、变量定义变量定义四、四、ASSUME语句语句汇编语言程序汇编语言程序举例一举例一了解了解DOS的返回

43、,装入功能的返回,装入功能五、五、表达式及表达式中的操作符表达式及表达式中的操作符汇编语言程序例二汇编语言程序例二六、六、过程定义过程定义(第五节程序设计介绍第五节程序设计介绍)七、七、等值定义等值定义(第五节程序设计介绍第五节程序设计介绍)汇编语言程序例三汇编语言程序例三(第五节程序设计介绍第五节程序设计介绍)汇编语言程序汇编语言程序举例一举例一例例将将BL寄存器的内容按二进制形式显示出来寄存器的内容按二进制形式显示出来10100110(BL)MOVCX,8;显示字符个数为显示字符个数为8next:SHLBL,1;将显示位移至将显示位移至CF中中JCone;CF=1?MOVDL,30H;CF

44、=0,将将0的的ASCII放在放在DL中中JMPexitone:MOVDL,31H;CF=1,将将1的的ASCII放在放在DL中中exit:MOVAH,2INT21H;调用调用DOS功能显示功能显示DECCX;循环次数减循环次数减1JNZnext;判断是否结束判断是否结束 、3130313030313130codeSEGMENTASSUMECS:codestart:.codeENDSENDstartMOVCX,8;显示字符个数为显示字符个数为8next:SHLBL,1;将显示位移至将显示位移至CF中中JCone;CF=1?MOVDL,30H;CF=0,将将0的的ASCII放在放在DL中中JMP

45、exitone:MOVDL,31H;CF=1,将将1的的ASCII放在放在DL中中exit:MOVAH,2INT21H;调用调用DOS功能显示功能显示DECCX;循环次数减循环次数减1JNZnext;判断是否结束判断是否结束D:MASMSBL; 汇编成汇编成ShowBL.objMicrosoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.48912+447243Bytessymbolspacefree0WarningErrors0SevereErrorsD:LINKSBL; 连

46、接成连接成ShowBL.exeMicrosoft(R)OverlayLinkerVersion3.61Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.LINK:warningL4021:nostacksegmentD:SBL 装载并执行装载并执行ShowBL.exe请猜想执行的结果?请猜想执行的结果?D:DEBUGSBL.exe ;用用DEBUG装入程序装入程序-U 0B5E:0000B90800MOVCX,00080B5E:0003D0E3SHLBL,10B5E:00057205JB000C0B5E:0007B230MOVDL,300

47、B5E:0009EB03JMP000E0B5E:000B90NOP0B5E:000CB231MOVDL,310B5E:000EB402MOVAH,020B5E:0010CD21INT210B5E:001249DECCX0B5E:001375EEJNZ00030B5E:001509E8ORAX,BP0B5E:001796XCHGSI,AX0B5E:001800F8ADDAL,BH0B5E:001AB262MOVDL,620B5E:001CFFFF ? DIFFFF ? DI0B5E:001DEB0AJMP0029-hello.exe用户程序用户程序与用户程序相连的与用户程序相连的内存内容被看作内

48、存内容被看作程序时程序时死机死机复习复习DOS系统的启动过程系统的启动过程执行用户程序后,执行用户程序后,若要返回若要返回DOS状态,状态,即在屏幕上出现即在屏幕上出现DOS提示符,提示符,等待输入新的命令,等待输入新的命令,应在用户程序的最后安排应在用户程序的最后安排完成此功能的程序段。完成此功能的程序段。F FF FF FF F: :0 00 00 00 0H H1243?ROM系系统统检检测测程程序序IO.SYS模模块块COMMAND.COMMSDOS.SYS模模块块用用户户程程序序空空 间间引引导导程程序序1KB 中中断断向向量量表表RAM内内 存存ROM BIOSDOSIO.SYSC

49、OMMAND.COMMSDOS.SYS引引导导程程序序磁磁 盘盘EDIT.EXEMASM.EXELINK.EXEDEBUG.exe应应用用程程序序其其他他系系统统程程序序h he el ll lo o. .a as sm mh he el ll lo o. .o ob bj jh he el ll lo o. .e ex xe e通常采用调用通常采用调用DOS系统功能完成系统功能完成。调用调用DOS系统的系统的4CH功能功能,返回返回DOS方法:方法:在要返回在要返回DOS处,安排指令:处,安排指令:MOVAH,4CHINT21H执行完执行完4CH的功能调用,即返回的功能调用,即返回DOS。例

50、例codeSEGMENTASSUMECS:codestart:、;程序主体部分程序主体部分、MOVAH,4CH;返回返回DOSINT21HcodeENDSENDstartcodeSEGMENTASSUMECS:codestart:.MOVAH,4CH;返回返回DOSINT21HcodeENDSENDstartMOVCX,8;显示字符个数为显示字符个数为8next:SHLBL,1;将显示位移至将显示位移至CF中中JCone;CF=1?MOVDL,30H;CF=0,将将0的的ASCII放在放在DL中中JMPexitone:MOVDL,31H;CF=1,将将1的的ASCII放在放在DL中中exit:

51、MOVAH,2INT21H;调用调用DOS功能显示功能显示DECCX;循环次数减循环次数减1JNZnext;判断是否结束判断是否结束MOVBL,53H;设置一个测试设置一个测试53hD:MASMShowBL;汇编成汇编成ShowBL.objMicrosoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.48912+447243Bytessymbolspacefree0WarningErrors0SevereErrorsD:LINKShowBL;连接成连接成ShowBL.exeMi

52、crosoft(R)OverlayLinkerVersion3.61Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.LINK:warningL4021:nostacksegmentD:ShowBL装载并执行装载并执行ShowBL.exe01010011D:masmD:DEBUGShowBL.exe ;用用DEBUG装入程序装入程序-U 0B5E:0000B90800MOVCX,00080B5E:0003D0E3SHLBL,10B5E:00057205JB000C0B5E:0007B230MOVDL,300B5E:0009EB03JMP0

53、00E0B5E:000B90NOP0B5E:000CB231MOVDL,310B5E:000EB402MOVAH,020B5E:0010CD21INT210B5E:001249DECCX0B5E:001375EEJNZ00030B5F:0015B44CMOVAH,4C0B5F:0017CD21INT21-codeSEGMENTASSUMECS:codestart:;程序主体部分程序主体部分.MOVAH,4CH;返回返回DOSINT21HcodeENDSENDstart一个完整汇编程序的基本框架一个完整汇编程序的基本框架:DOS的装入功能的装入功能(又称又称EXEC系统功能系统功能)l可执行文件

54、可执行文件.exe,应装入内存方能执行。应装入内存方能执行。由由DOS的装入功能完成。的装入功能完成。l在在DOS的提示符后输入可执行文件的文件名,的提示符后输入可执行文件的文件名,按回车键,按回车键,DOS系统即调用装入功能系统即调用装入功能,将可执行程序装入内存。将可执行程序装入内存。内内 存存256KB ROM0000:0000H0040:0000H A000:0000H C800:0000H FE00:0000HFE00:1FFFH H640KB RAM 基基本本内内存存显显示示器器显显示示缓缓存存区区ROM BIOS系系统统检检测测程程序序IO.SYS 模模块块COMMAND.COM

55、常常驻驻模模块块MSDOS.SYS 模模块块用用户户程程序序空空间间COMMAND.COM暂暂驻驻模模块块DOS 工工作作区区BIOS 工工作作区区1KB 中中断断向向量量表表128KB RAM 保保留留区区DOS其其他他系系统统程程序序磁磁 盘盘应应用用程程序序IO.SYSCOMMAND.COMMSDOS.SYS引引导导程程序序EDIT.EXEMASM.EXELINK.EXEDEBUG.exehello.asmhello.objhello.exescans.asmscans.objscans.exe完成以下操作:完成以下操作:确定内存可用部分确定内存可用部分,以便存放要执行的以便存放要执行的

56、.exe文件。文件。建立程序段前缀建立程序段前缀PSP(ProgramSegmentPrefix) 程序段前缀大小程序段前缀大小100H,即即256个字节。个字节。存放进程间的控制信息。存放进程间的控制信息。PSP最开始的两个字节最开始的两个字节CD20,是一条是一条INT20H指令。指令。装入可执行程序装入可执行程序.exe0000:0000H可可用用内内存存空空间间内内 存存FFFF:0000HROM BIOS系系统统检检测测程程序序 COMMAND.COMDOS 系系统统1KB 中中断断向向量量表表 CD20 、 、 、 、 、 、 、 、 、 hello.exexxxx:0000Hxx

57、xx:00FFH程程序序段段前前缀缀用用户户程程序序DOS的装入功能的装入功能修改以下寄存器的值修改以下寄存器的值DS、ES设置为设置为程序段前缀所在内存的段值;程序段前缀所在内存的段值;(DS)=xxxxH(ES)=xxxxHSS、SP设置为设置为由连接程序传过来的值;由连接程序传过来的值;CS、IP设置为设置为程序的入口地址,程序的入口地址,即伪操作即伪操作END后跟的后跟的符号名对应的物理地址;符号名对应的物理地址;此时此时CS:IP指向用户程序,指向用户程序,开始执行用户程序。开始执行用户程序。0000:0000H可可用用内内存存空空间间内内 存存FFFF:0000HROM BIOS系

58、系统统检检测测程程序序 COMMAND.COMDOS 系系统统1KB 中中断断向向量量表表 CD20 、 、 、 、 、 、 、 、 、 hello.exexxxx:0000Hxxxx:00FFH程程序序段段前前缀缀CS:IPD:DEBUGShowBL.exe-R ; ;查看当前寄存器内容查看当前寄存器内容AX=0000BX=0000CX=001BDX=0000SP=0000BP=0000SI=0000DI=0000DS=0B51ES=0B51SS=0B61CS=0B61IP=0000NVUPEIPLNZNAPONC0B61:0000B353MOVBL,53-U ; ;查看程序代码查看程序代码

59、0B61:0000B353MOVBL,530B61:0002B90800MOVCX,0008.0B61:0017B44CMOVAH,4C0B61:0019CD21INT21-DDS:0L20 ; ;查看此时数据段内容查看此时数据段内容( (程序段前缀程序段前缀) )0B51:0000CD20FF9F009AF0FE-1DF04F035A058A030B51:00105A0517035A054905-0101010002FFFFFF-UDS:0L5 ; ;反汇编当前数据段内容反汇编当前数据段内容( (程序段前缀程序段前缀) )0B51:0000CD20INT200B51:0002FF9F009A

60、CALLFARBX+9A00-在在DEBUG下查看下查看ShowBL.exe的装入情况的装入情况: :-R ; ;查看当前寄存器内容查看当前寄存器内容AX=0000BX=0000CX=001BDX=0000SP=0000BP=0000SI=0000DI=0000DS=0B51ES=0B51SS=0B61CS=0B61IP=0000NVUPEIPLNZNAPONCB353MOVBL,53 - UCS:0 ; ;查看程序查看程序 0B61:0000B353MOVBL,530B61:0002B90800MOVCX,00080B61:0005D0E3SHLBL,10B61:00077205JB000E

温馨提示

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

评论

0/150

提交评论