《汇编语言设计》PPT课件

上传人:xt****7 文档编号:188792350 上传时间:2023-02-20 格式:PPT 页数:205 大小:1.27MB
收藏 版权申诉 举报 下载
《汇编语言设计》PPT课件_第1页
第1页 / 共205页
《汇编语言设计》PPT课件_第2页
第2页 / 共205页
《汇编语言设计》PPT课件_第3页
第3页 / 共205页
资源描述:

《《汇编语言设计》PPT课件》由会员分享,可在线阅读,更多相关《《汇编语言设计》PPT课件(205页珍藏版)》请在装配图网上搜索。

1、1微型计算机技术第第4 4章章 8086/80888086/8088汇编语言设计汇编语言设计2第一节第一节 汇编语言上机过程汇编语言上机过程第二节第二节 汇编语言程序结构汇编语言程序结构第三节第三节 指示性语句指示性语句第四节第四节 汇编语言程序举例汇编语言程序举例第五节第五节 BIOS和和DOS功能调用功能调用第六节第六节 汇编语言程序设计汇编语言程序设计3上机环境上机环境硬件硬件系统软件系统软件 应用软件应用软件 操作系统:操作系统:DOS系统系统编辑器编辑器:EDIT.exe汇 编 编 译 程 序汇 编 编 译 程 序:MASM.exe连接程序连接程序:LINK.exe调试程序:调试程序

2、:DEBUG.exe用户开发的程序:用户开发的程序:ABC.exe等等CPU、存储器、存储器(ROM、RAM)、I/O接口、输入、输出接口、输入、输出设备设备4第一节第一节 汇编语言上机过程汇编语言上机过程D:EDITD:MASM ABC;有语法错,回有语法错,回EDIT下改该程序下改该程序D:LINK ABC;有错,回在有错,回在EDIT下改程序下改程序D:ABC 运行结果错,回运行结果错,回EDIT下改程序下改程序 或在或在DEBUG下调试,找原因。下调试,找原因。D:DEBUG编辑源程序编辑源程序 EDIT ABC.ASM汇编源程序汇编源程序 MASM ABC.ASM形成目标程序形成目标

3、程序 ABC.OBJ连接目标程序连接目标程序 LINK ABC.OBJ有连接错误信息有连接错误信息?形成可执行程序形成可执行程序 ABC.EXE装入可执行程序到内存装入可执行程序到内存,并执行并执行D:subABC下一程序下一程序用用DEBUG 调试可执行程序调试可执行程序D:sub DEBUG ABC.EXE找到原因找到原因YNYNNYN有汇编错误信息有汇编错误信息?Y运行结果正确运行结果正确?用用DEBUG调试程序查错调试程序查错?5第二节第二节 汇编语言程序结构汇编语言程序结构一、程序结构一、程序结构二、语句结构二、语句结构6一、程序结构一、程序结构l 程序由数条语句构成,每条语句占一行

4、。程序由数条语句构成,每条语句占一行。指令性语句指令性语句(指令语句指令语句)指示性语句指示性语句(伪指令语句伪指令语句)l 分段结构分段结构 程序按段编写程序按段编写,与与8088内存分段编址相对应。内存分段编址相对应。每段由伪操作每段由伪操作SEGMENT开始、由开始、由ENDS结束。结束。l 程序最后为程序最后为END结束语句,后跟一启动地址。结束语句,后跟一启动地址。启动地址指示程序开始执行的第一条语句。启动地址指示程序开始执行的第一条语句。l 程序中设有返回程序中设有返回DOS的功能。的功能。使程序执行完后返回使程序执行完后返回DOS系统的命令接受状态。系统的命令接受状态。l 程序中

5、用到内存操作数时程序中用到内存操作数时,应按操作数的寻址方式应按操作数的寻址方式,给相应的段寄存器赋值给相应的段寄存器赋值;汇编语言程序结构例一汇编语言程序结构例一;实现数据传送功能实现数据传送功能aa SEGMENT ;数据段数据段1str1 DB Hello!aa ENDSbb SEGMENT ;数据段数据段2str2 DB 6 dup(?)bb ENDScc SEGMENT ;代码段代码段 ASSUME CS:cc,DS:aa,ES:bb start:CLD MOV AX,aa MOV DS,AX LEA SI,str1 MOV AX,SEG str2 MOV ES,AX MOV DI,

6、OFFSET str2 MOV CX,6 REP MOVSB MOV AH,4CH INT 21H ;返回返回DOScc ENDS END start ;指示程序结束指示程序结束7程序可由多个段构成,至少有一个代码段程序可由多个段构成,至少有一个代码段;汇编语言程序结构例二(子程结构)汇编语言程序结构例二(子程结构)scans.asm ;用二进制显示中断向量表中(用二进制显示中断向量表中(0:00:3FFH)数据)数据D0H的个数的个数key EQU 0D0H ;用符号表示常量用符号表示常量(关键字关键字)code SEGMENT ;代码段开始代码段开始 ASSUME CS:code begi

7、n:MOV AX,0000H MOV DS,AX MOV SI,0000H MOV CX,0400H MOV BX,0 MOV AL,key next:CMP SI ,AL JNZ point INC BX point:INC SI LOOP next CALL display ;调用显示子程调用显示子程 MOV AH,4CH ;返回返回DOS INT 21H;用二进制显示用二进制显示BX内容子程序内容子程序display PROC MOV CX,16 rotate:ROL BX,1 MOV DL,BL AND DL,01H ADD DL,30H MOV AH,2H INT 21H LOOP

8、rotate RET ;子程返回子程返回display ENDP code ENDS ;代码段结束代码段结束 END begin ;指示程序结束和指示程序结束和 ;程序入口程序入口8二、语句结构二、语句结构 名名字字:助助记记符符 操操作作数数,;注注释释名名字字项项 助助记记符符项项 操操作作数数项项 注注释释项项data SEGMENT ;数据段数据段var DB?data ENDScode SEGMENT ;代码段代码段 ASSUME CS:code,DS:datastart:MOV AX,data MOV DS,AX MOV var,CL MOV AH,4CH INT 21H ;返回返

9、回DOScode ENDS END start例:例:9名名字字:助助记记符符 操操作作数数,;注注释释名名字字项项 助助记记符符项项 操操作作数数项项 注注释释项项1.名字项名字项 l 据语句功能的不同,据语句功能的不同,名字项可用来表示段名、变量名、名字项可用来表示段名、变量名、标号、过程名以及常量名等。标号、过程名以及常量名等。data SEGMENT ;数据段数据段var DB?data ENDScode SEGMENT ;代码段代码段 ASSUME CS:code,DS:datastart:MOV AX,data MOV DS,AX MOV var,CL MOV AH,4CH INT

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

11、项项11名名字字:助助记记符符 操操作作数数,;注注释释名名字字项项 助助记记符符项项 操操作作数数项项 注注释释项项2.助记符项助记符项 助记符可以是指令、伪操作中的助记符。助记符可以是指令、伪操作中的助记符。对于指令对于指令,汇编程序将其翻译成机器语言指令。,汇编程序将其翻译成机器语言指令。MOV AX,100 B8 00 01对于伪操作对于伪操作,汇编程序根据其要求的功能进行处理。,汇编程序根据其要求的功能进行处理。data SEGMENT data与一段值对应与一段值对应 string DB Tsinghua string与一内存地址对应与一内存地址对应123操作数项操作数项l 操作数

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

13、进制数。表示二进制数。如如 1010B 数字后加数字后加H表示十六进制数。表示十六进制数。如如 1234H 字符常量,用单引号表示。字符常量,用单引号表示。如如 1234 汇编时,用字符对应的汇编时,用字符对应的ASCII表示。表示。如如 31H,32H,33H,34H例例 data1 DB 12,34,56 ;十进制;十进制 data2 DB 12H,34H,56H ;十六进制;十六进制 MOV AL,G ;字符;字符 string DB 1234 ;字符串;字符串14l A、B、C、D、E、F开头的十六进制数前面加开头的十六进制数前面加0,与与H结尾的标识符区别。结尾的标识符区别。如如 寄

14、存器名寄存器名AH、BH、CH、DH 变量名变量名 abcdH 等等例例 mov AL,0AH mov AL,AH mov BX,0abcdH154注释项注释项l由分号引出,用来说明语句或程序的功能。由分号引出,用来说明语句或程序的功能。汇编程序对分号后的内容不做处理。汇编程序对分号后的内容不做处理。l作用:作用:注释程序,增强程序可读性。注释程序,增强程序可读性。可放在语句最前,暂时注释某语句,调试程序用。可放在语句最前,暂时注释某语句,调试程序用。例例 、;MOV AH,2 ;显示提示信息显示提示信息 ;MOV DL,A ;INT 21H 、名名字字:助助记记符符 操操作作数数,;注注释释

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

16、(第五节程序设计介绍第五节程序设计介绍)17指示性语句与指令性语句:指示性语句与指令性语句:l指令性语句指令性语句是用指令系统中的指令构成的语句。是用指令系统中的指令构成的语句。例例 MOV AX,BXl指示性语句指示性语句是指示汇编程序进行汇编的操作。是指示汇编程序进行汇编的操作。例例 MOV AX,4+8 中的中的+code SEGMENT 中的中的SEGMENT MOV BX,OFFSET string 中的中的OFFSET18l指示性语句与指令性语句区别指示性语句与指令性语句区别一个程序经汇编,连接和装入内存后,在执行程序之前:一个程序经汇编,连接和装入内存后,在执行程序之前:指示性语

17、句的功能已经完成,故又称伪操作。指示性语句的功能已经完成,故又称伪操作。而指令性语句的功能尚未完成,需控制而指令性语句的功能尚未完成,需控制CPU去执行,才能完成。去执行,才能完成。19aa SEGMENT ;数据段数据段1 str1 DB Hello!aa ENDSbb SEGMENT ;数据段数据段2 str2 DB 6 dup(?)bb ENDScc SEGMENT ;代码段代码段 ASSUME CS:ccASSUME DS:aa,ES:bb start:CLD MOV AX,aa MOV DS,AX LEA SI,str1 MOV AX,bb MOV ES,AX LEA DI,str2

18、 MOV CX,6 REP MOVSB MOV AH,4CH INT 21H cc ENDS END start D:masmDEBUG hello2.exe-U :查看代码段查看代码段12A0:0000 FC CLD12A0:0001 B89E12 MOV AX,129E12A0:0004 8ED8 MOV DS,AX12A0:0006 8D360000 LEA SI,000012A0:000A B89F12 MOV AX,129F12A0:000D 8EC0 MOV ES,AX12A0:000F 8D3E0000 LEA DI,000012A0:0013 B90600 MOV CX,000

19、612A0:0016 F3 REPZ12A0:0017 A4 MOVSB12A0:0018 B44C MOV AH,4C12A0:001A CD21 INT 21、-D 129E:0 L10 ;查看数据段查看数据段1的内容的内容129E:0000 48 65 6C 6C 6F 21 00 00-00 00 00 00 00 00 00 00 Hello!.-D 129F:0 L10 ;查看数据段查看数据段2的内容的内容129F:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .-数据传送源程序数据传送源程序hello2.asm 程序经汇

20、编、连接后,装入内存的情况如下:程序经汇编、连接后,装入内存的情况如下:20常用伪操作介绍常用伪操作介绍一、一、程序开始和结束程序开始和结束二、二、段定义段定义三、三、变量定义变量定义四、四、ASSUME语句语句五、五、表达式中的操作符表达式中的操作符六、六、过程定义过程定义七、七、等值定义等值定义21一一、模块定义和程序结束伪操作模块定义和程序结束伪操作1.NAME 和和 TITLE 伪操作伪操作 格式格式 NAME 模块名模块名 格式格式 TITLE 模块名模块名 在源程序开始可用在源程序开始可用 NAME 或或 TITLE 为模块命名为模块命名,模块名的作用是指示给连接程序进行连接用。模

21、块名的作用是指示给连接程序进行连接用。源程序中可无模块定义,此时源文件名作为模块名。源程序中可无模块定义,此时源文件名作为模块名。222.END伪操作伪操作 格式格式 END 启动地址启动地址 作用是指示源程序到此结束。作用是指示源程序到此结束。汇编程序对汇编程序对 END 之后的语句不进行处理。之后的语句不进行处理。程序中所有有效语句应放在程序中所有有效语句应放在 END 语句之前。语句之前。源程序中必须有源程序中必须有 END 结束语句。结束语句。汇编程序对无汇编程序对无 END 语句的源程序不进行处理语句的源程序不进行处理,只给出无只给出无 END 语句错误信息。语句错误信息。23假设假

22、设 TEST.asm 是一个无是一个无 END 语句的汇编语言源程序。语句的汇编语言源程序。其汇编结果如下其汇编结果如下:D:MASM TEST;Copyright(C)Microsoft Corp 1981,1988.All rights reserved.End of file encountered on input file End of file encountered on input file 49968+421181 Bytes symbol space free 0 Warning Errors 0 Severe ErrorsD:由于没有由于没有END语句,汇编程序根本没对源

23、程序进行汇编,语句,汇编程序根本没对源程序进行汇编,此时显示警告性错误总数为此时显示警告性错误总数为 0,严重性错误总数为,严重性错误总数为 0,用户不要被此值误导用户不要被此值误导。24启动地址可是一个标号或过程名启动地址可是一个标号或过程名,指示程序的入口。指示程序的入口。程序装入内存后,系统跳转到入口处程序装入内存后,系统跳转到入口处,开始执行程序。开始执行程序。aa SEGMENT ;数据段数据段1 str1 DB Hello!aa ENDSbb SEGMENT ;数据段数据段2 str2 DB 6 dup(?)bb ENDScc SEGMENT ;代码段代码段 ASSUME CS:c

24、c ASSUME DS:aa,ES:bb start:CLD MOV AX,aa MOV DS,AX LEA SI,str1 MOV AX,SEG str2 MOV ES,AX MOV DI,OFFSET str2 MOV CX,6 REP MOVSB MOV AH,4CH INT 21H cc ENDS END start D:masmDEBUG hello.exe-U :查看代码段查看代码段129F:0000 FC CLD129F:0001 B89D12 MOV AX,129D129F:0004 8ED8 MOV DS,AX129F:0006 8D360000 LEA SI,0000129

25、F:000A B89E12 MOV AX,129E129F:000D 8EC0 MOV ES,AX129F:000F BF0000 MOV DI,0000129F:0012 B90600 MOV CX,0006129F:0015 F3 REPZ129F:0016 A4 MOVSB129F:0017 B44C MOV AH,4C129F:0019 CD21 INT 21、-D 129d:0 l10 ;查看数据段查看数据段1的内容的内容129D:0000 48 65 6C 6C 6F 21 00 00-00 00 00 00 00 00 00 00 Hello!.-D 129e:0 l10 ;查看

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

27、示存放在该段内存的变量、指令或其他伪操作对该段内存的处理 程序中可以定义多个段。程序中可以定义多个段。程序经汇编、连接及装入内存后,段名为一具体的段值。程序经汇编、连接及装入内存后,段名为一具体的段值。26aa SEGMENT ;数据段数据段1 str1 DB Hello!aa ENDSbb SEGMENT ;数据段数据段2 str2 DB 6 dup(?)bb ENDScc SEGMENT ;代码段代码段 ASSUME CS:ccASSUME DS:aa,ES:bb start:CLD MOV AX,aa MOV DS,AX LEA SI,str1 MOV AX,bb MOV ES,AX L

28、EA DI,str2 MOV CX,6 REP MOVSB MOV AH,4CH INT 21H cc ENDS END start D:masmDEBUG hello2.exe-U :查看代码段查看代码段12A0:0000 FC CLD12A0:0001 B89E12 MOV AX,129E12A0:0004 8ED8 MOV DS,AX12A0:0006 8D360000 LEA SI,000012A0:000A B89F12 MOV AX,129F12A0:000D 8EC0 MOV ES,AX12A0:000F 8D3E0000 LEA DI,000012A0:0013 B90600

29、MOV CX,000612A0:0016 F3 REPZ12A0:0017 A4 MOVSB12A0:0018 B44C MOV AH,4C12A0:001A CD21 INT 21、-D 129E:0 L10 ;查看数据段查看数据段1的内容的内容129E:0000 48 65 6C 6C 6F 21 00 00-00 00 00 00 00 00 00 00 Hello!.-D 129F:0 L10 ;查看数据段查看数据段2的内容的内容129F:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .-数据传送源程序:数据传送源程序:程序经

30、汇编、连接后,装入内存的情况如下:程序经汇编、连接后,装入内存的情况如下:27三、变量定义伪操作三、变量定义伪操作 格式格式 变量名变量名 类型助记符类型助记符 操作数操作数 ,操作数操作数,.用来定义程序中所用的内存操作数。用来定义程序中所用的内存操作数。其中其中 变量名变量名指示内存操作数的地址(符号地址)指示内存操作数的地址(符号地址)类型助记符类型助记符指示内存操作数的类型指示内存操作数的类型(字节、字、双字等字节、字、双字等)操作数操作数指示内存操作数的内容指示内存操作数的内容 汇编程序将定义的操作数,按其类型分配内存单元数汇编程序将定义的操作数,按其类型分配内存单元数,顺序存入变量

31、名指向的内存单元中。顺序存入变量名指向的内存单元中。常用的类型助记符有:常用的类型助记符有:DB 指示其后的操作数为字节类型指示其后的操作数为字节类型DW 指示其后的操作数为字类型指示其后的操作数为字类型DD 指示其后的操作数为双字类型指示其后的操作数为双字类型28例例1:定义赋初值的变量定义赋初值的变量 data SEGMENT xx DB 1,-1,0fcH yy DW 1,-1,0fcH zz DD 1,-1,0fcH data ENDSxxyyzz01FFFC0100FFFFFC0001000000FFFFFFFFFC000000 1-1FC 1-1FC 1-1FC29例例2:定义字符

32、串变量定义字符串变量(只能用只能用DB定义定义)data SEGMENT str1 DB TsingHua str2 DB INPUT:,0dH,0aH,$data ENDS注意注意:3个及其以上的字符,个及其以上的字符,只能用只能用DB定义定义str1 DW abcdstr2 DD abcdstr1str25473696e67487561494e5055543a0d0a24TsingHuaINPUT:0dH0aH$30操作数可以是用操作数可以是用常量、表达式和常量、表达式和?表示。表示。常量和表达式常量和表达式表示内存操作数的初始值表示内存操作数的初始值,其值应在其定义的类型范围内,否则汇编

33、出错。其值应在其定义的类型范围内,否则汇编出错。例例 aa DB 270 bb DW 80000 用用?表示不置初始值的内存操作数。表示不置初始值的内存操作数。例例 cc DB?可用可用 DUP 复制操作符复制操作符定义相同的操作数,其格式为定义相同的操作数,其格式为 重复次数重复次数 DUP(操作数操作数)例例 ee DB 3 DUP(4)等价于等价于 ee DB 4,4,431data SEGMENTxx DB 1,-1,0FCHyy DW 1,-1,0FCHzz DD 1,-1,0FCHstr DB TsingHuabuf DB 4,?,4 DUP(?)DB dataenddata EN

34、DScode SEGMENT ASSUME CS:code ASSUME DS:datastart:MOV AX,data MOV DS,AX LEA BX,xx LEA SI,yy LEA DI,zz MOV AH,4CH INT 21Hcode ENDS END start D:MASMDEBUG varible.exe-U12A1:0000 B89E12 MOV AX,129E12A1:0003 8ED8 MOV DS,AX12A1:0005 8D1E0000 LEA BX,000012A1:0009 8D360300 LEA SI,000312A1:000D 8D3E0900 LEA

35、DI,000912A1:0011 8D1E1500 LEA BX,001512A1:0015 8D361D00 LEA SI,001D12A1:0019 B44C MOV AH,4C12A1:001B CD21 INT 2112A1:001D FF36243E PUSH 3E24-D 129E:0 L30129E:0000 01 FF FC 01 00 FF FF FC-00 01 00 00 00 FF FF FF.129E:0010 FF FC 00 00 00 54 73 69-6E 67 48 75 61 04 00 00.TsingHua.129E:0020 00 00 00 64

36、61 74 61 65-6E 64 00 00 00 00 00 00.dataend.129E:0030 B8 9E 12 8E D8 8D 1E 00-00 8D 36 03 00 8D 3E 09.6.-xxyyzzstrbufd a t a e n d段段名名data 变变量量xx 变变量量yy 变变量量zz 变变量量str 变变量量buf例例4:在在DEBUG下查看变量存放情况。下查看变量存放情况。32四、四、ASSUME伪操作伪操作 格式格式 ASSUME 段寄存器:段名段寄存器:段名 ,段寄存器段寄存器:段名段名,其中其中 段寄存器段寄存器为为CS、DS、ES、SS中的一个中的一

37、个 段名段名为用伪操作为用伪操作SEGMENT定义过的段名定义过的段名例例 ASSUME CS:cc,DS:aa ASSUME 伪操作的作用伪操作的作用 指示汇编程序指令中用到的标号、过程及变量所在的段。指示汇编程序指令中用到的标号、过程及变量所在的段。其中其中 对标号、过程必须用对标号、过程必须用 CS 段寄存器指示段寄存器指示 对变量可用对变量可用 CS、DS、ES、SS 段寄存器指示段寄存器指示33 若未用若未用ASSUME语句指示指令中用到的标号、语句指示指令中用到的标号、过程和变量所在的段过程和变量所在的段,汇编程序将给出错误信息。汇编程序将给出错误信息。ASSUME语句只起指示作用

38、,并无实际的操作。语句只起指示作用,并无实际的操作。在程序中引用定义的变量做内存操作数时,在程序中引用定义的变量做内存操作数时,需按寻址方式用传送指令(如需按寻址方式用传送指令(如MOV)给相应的段寄存器赋值)给相应的段寄存器赋值。34例例 用程序实现用程序实现 1234H+5678Hvalueresult341278560000 data SEGMENT value DW 1234H,5678H result DW?data ENDS code SEGMENT ASSUME CS:code,DS:data start:MOV AX,data ;给给DS赋值赋值 MOV DS,AX MOV A

39、X,value ;取数取数 ADD AX,value+2 ;两数相加两数相加 MOV result,AX ;保存结果保存结果 MOV AH,4CH ;返回返回DOS INT 21H code ENDS END start35注释掉注释掉ASSUME语句,其汇编结果:语句,其汇编结果:data SEGMENT value DW 1234H,5678H result DW?data ENDS code SEGMENT;ASSUME CS:code,DS:data start:MOV AX,data MOV DS,AX MOV AX,value ADD AX,value+2 MOV result,A

40、X MOV AH,4CH INT 21H code ENDS END startD:MASMMASM assume;Microsoft(R)Macro Assembler Version 5.10Copyright(C)Microsoft Corp 1981,1988.All rights reserved.assume.ASM(8):Missing or unreachable CSassume.ASM(10):Cannot address with segment registerassume.ASM(11):Cannot address with segment registerassu

41、me.ASM(12):Cannot address with segment register 49872+421341 Bytes symbol space free 0 Warning Errors 4 Severe ErrorsD:MASM36程序中有程序中有ASSUME语句,经汇编,连接和装入内存后的情况:语句,经汇编,连接和装入内存后的情况:data SEGMENT value DW 1234H,5678H result DW?data ENDS code SEGMENT ASSUME CS:code,DS:data start:MOV AX,data ;给给DS赋值赋值 MOV D

42、S,AX MOV AX,value ;取数取数 ADD AX,value+2 ;两数相加两数相加 MOV result,AX ;保存结果保存结果 MOV AH,4CH ;返回返回DOS INT 21H code ENDSD:MASMDEBUG assume.exe-R ;查看程序执行前各寄存器查看程序执行前各寄存器AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1295 ES=1295 SS=12A5 CS=12A6 IP=0000 NV UP EI PL NZ NA PO NC12A6:0000 B8A512

43、 MOV AX,12A5-U ;查看在内存的程序查看在内存的程序12A6:0000 B8A512 MOV AX,12A512A6:0003 8ED8 MOV DS,AX12A6:0005 A10000 MOV AX,0000 12A6:0008 03060200 ADD AX,0002 12A6:000C A30400 MOV 0004,AX12A6:000F B44C MOV AH,4C12A6:0011 CD21 INT 21、-注意:注意:程序装入内存后,执行程序前,程序装入内存后,执行程序前,当前的当前的DS值并非程序定义的值并非程序定义的data段值,段值,1295 不等于不等于 1

44、2A537思考:思考:如果上例中没有如果上例中没有 MOV DS,AX 程序执行的结果会怎样?程序执行的结果会怎样?-R ;查看程序执行前各寄存器查看程序执行前各寄存器AX=0000 BX=0000 CX=0023 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=1295 ES=1295 SS=12A5 CS=12A6 IP=0000 NV UP EI PL NZ NA PO NC12A6:0000 B8A512 MOV AX,12A5-U ;查看在内存的程序查看在内存的程序12A6:0000 B8A512 MOV AX,12A512A6:0003 A100

45、00 MOV AX,0000 12A6:0006 03060200 ADD AX,0002 12A6:000A A30400 MOV 0004,AX12A6:000D B44C MOV AH,4C12A6:000F CD21 INT 21、data SEGMENT value DW 1234H,5678H result DW?data ENDS code SEGMENT ASSUME CS:code,DS:data start:MOV AX,data ;给给DS赋值赋值 ;MOV DS,AX MOV AX,value ;取数取数 ADD AX,value+2 ;两数相加两数相加 MOV res

46、ult,AX ;保存结果保存结果 MOV AH,4CH ;返回返回DOS INT 21H code ENDS38结论:结论:1.ASSUME语句只起指示作用语句只起指示作用,没有赋值作用没有赋值作用2.程序中用到内存操作数时,程序中用到内存操作数时,应按操作数的寻址方式应按操作数的寻址方式,给相应的段寄存器赋值给相应的段寄存器赋值。39第三节第三节 指示性语句指示性语句 /第四节第四节 汇编语言程序举例汇编语言程序举例一、一、程序开始和结束程序开始和结束 二、二、段定义段定义三、三、变量定义变量定义四、四、ASSUME语句语句 汇编语言程序汇编语言程序举例一举例一 了解了解DOS的返回,装入功

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

48、OV DL,30H ;CF=0,将将0的的ASCII放在放在DL中中 JMP exitone:MOV DL,31H ;CF=1,将将1的的ASCII放在放在DL中中exit:MOV AH,2 INT 21H ;调用调用DOS功能显示功能显示 DEC CX ;循环次数减循环次数减1 JNZ next ;判断是否结束判断是否结束 、31 30 31 30 30 31 31 3042code SEGMENT ASSUME CS:codestart:.code ENDS END start MOV CX,8 ;显示字符个数为显示字符个数为8next:SHL BL,1 ;将显示位移至将显示位移至CF中中

49、 JC one ;CF=1?MOV DL,30H ;CF=0,将将0的的ASCII放在放在DL中中 JMP exitone:MOV DL,31H ;CF=1,将将1的的ASCII放在放在DL中中exit:MOV AH,2 INT 21H ;调用调用DOS功能显示功能显示 DEC CX ;循环次数减循环次数减1 JNZ next ;判断是否结束判断是否结束43D:MASM SBL;汇编成汇编成Microsoft(R)Macro Assembler Version Copyright(C)Microsoft Corp 1981,1988.All rights reserved.48912+4472

50、43 Bytes symbol space free 0 Warning Errors 0 Severe ErrorsD:LINK SBL;连接成连接成ShowBL.exe Microsoft(R)Overlay Linker Copyright(C)Microsoft Corp 1983-1987.All rights reserved.LINK:warning L4021:no stack segmentD:SBL 装载并执行装载并执行请猜想执行的结果?请猜想执行的结果?44D:;用用DEBUG装入程序装入程序-U 0B5E:0000 B90800 MOV CX,00080B5E:0003

51、 D0E3 SHL BL,10B5E:0005 7205 JB 000C0B5E:0007 B230 MOV DL,300B5E:0009 EB03 JMP 000E0B5E:000B 90 NOP0B5E:000C B231 MOV DL,310B5E:000E B402 MOV AH,020B5E:0010 CD21 INT 210B5E:0012 49 DEC CX0B5E:0013 75EE JNZ 00030B5E:0015 09E8 OR AX,BP0B5E:0017 96 XCHG SI,AX0B5E:0018 00F8 ADD AL,BH0B5E:001A B262 MOV D

52、L,620B5E:001C FFFF?DIFFFF?DI 0B5E:001D EB0A JMP 0029-hello.exe用户程序用户程序与用户程序相连的与用户程序相连的内存内容被看作内存内容被看作程序时程序时死机死机45复习复习DOS系统的启动过程系统的启动过程执行用户程序后,执行用户程序后,若要返回若要返回 DOS状态,状态,即在屏幕上出现即在屏幕上出现 DOS提示符,提示符,等待输入新的命令,等待输入新的命令,应在用户程序的最后安排应在用户程序的最后安排完成此功能的程序段。完成此功能的程序段。F FF FF FF F:0 00 00 00 0H H1243?ROM系系统统检检测测程程序

53、序IO.SYS模模块块COMMAND.COMMSDOS.SYS模模块块用用户户程程序序空空 间间引引导导程程序序1KB 中中断断向向量量表表RAM内内 存存ROM BIOSDOSIO.SYSCOMMAND.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 系统功能完成系统功能完成。46调用调用DOS系统的系统

54、的4CH 功能功能,返回返回DOS方法:方法:在要返回在要返回DOS 处,安排指令:处,安排指令:MOV AH,4CH INT 21H 执行完执行完4CH的功能调用,即返回的功能调用,即返回DOS。例例 code SEGMENT ASSUME CS:codestart:、;程序主体部分程序主体部分 、MOV AH,4CH ;返回返回DOS INT 21Hcode ENDS END start47code SEGMENT ASSUME CS:codestart:.MOV AH,4CH ;返回返回DOS INT 21H code ENDS END start MOV CX,8 ;显示字符个数为显示

55、字符个数为8next:SHL BL,1 ;将显示位移至将显示位移至CF中中 JC one ;CF=1?MOV DL,30H ;CF=0,将将0的的ASCII放在放在DL中中 JMP exitone:MOV DL,31H ;CF=1,将将1的的ASCII放在放在DL中中exit:MOV AH,2 INT 21H ;调用调用DOS功能显示功能显示 DEC CX ;循环次数减循环次数减1 JNZ next ;判断是否结束判断是否结束MOV BL,53H ;设置一个测试设置一个测试53h48D:MASM ShowBL;汇编成汇编成Microsoft(R)Macro Assembler Version

56、Copyright(C)Microsoft Corp 1981,1988.All rights reserved.48912+447243 Bytes symbol space free 0 Warning Errors 0 Severe ErrorsD:LINK ShowBL;连接成连接成ShowBL.exe Microsoft(R)Overlay Linker Copyright(C)Microsoft Corp 1983-1987.All rights reserved.LINK:warning L4021:no stack segmentD:ShowBL 装载并执行装载并执行01010

57、011D:masm49D:;用用DEBUG装入程序装入程序-U 0B5E:0000 B90800 MOV CX,00080B5E:0003 D0E3 SHL BL,10B5E:0005 7205 JB 000C0B5E:0007 B230 MOV DL,300B5E:0009 EB03 JMP 000E0B5E:000B 90 NOP0B5E:000C B231 MOV DL,310B5E:000E B402 MOV AH,020B5E:0010 CD21 INT 210B5E:0012 49 DEC CX0B5E:0013 75EE JNZ 00030B5F:0015 B44C MOV AH

58、,4C0B5F:0017 CD21 INT 21-50code SEGMENT ASSUME CS:codestart:;程序主体部分程序主体部分 .MOV AH,4CH ;返回返回DOS INT 21Hcode ENDS END start一个完整汇编程序的基本框架一个完整汇编程序的基本框架:51DOS的装入功能的装入功能(又称又称EXEC系统功能系统功能)l 可执行文件可执行文件.exe,应装入内存方能执行。,应装入内存方能执行。由由DOS的装入功能完成。的装入功能完成。l 在在DOS的提示符后输入可执行文件的文件名,的提示符后输入可执行文件的文件名,按回车键,按回车键,DOS系统即调用装

59、入功能系统即调用装入功能,将可执行程序装入内存。将可执行程序装入内存。52内内 存存256KB ROM0000:0000H0040:0000H A000:0000H C800:0000H FE00:0000HFE00:1FFFH H640KB RAM 基基本本内内存存显显示示器器显显示示缓缓存存区区ROM BIOS系系统统检检测测程程序序IO.SYS 模模块块COMMAND.COM常常驻驻模模块块MSDOS.SYS 模模块块用用户户程程序序空空间间COMMAND.COM暂暂驻驻模模块块DOS 工工作作区区BIOS 工工作作区区1KB 中中断断向向量量表表128KB RAM 保保留留区区DOS其

60、其他他系系统统程程序序磁磁 盘盘应应用用程程序序IO.SYSCOMMAND.COMMSDOS.SYS引引导导程程序序EDIT.EXEMASM.EXELINK.EXEDEBUG.exehello.asmhello.objhello.exescans.asmscans.objscans.exe53完成以下操作:完成以下操作:确定内存可用部分确定内存可用部分,以便存放要执行的以便存放要执行的.exe 文件。文件。建立程序段前缀建立程序段前缀PSP (Program Segment Prefix)程序段前缀大小程序段前缀大小100H,即即256个字节。个字节。存放进程间的控制信息。存放进程间的控制信息

61、。PSP最开始的两个字节最开始的两个字节CD 20,是一条是一条 INT 20H指令。指令。装入可执行程序装入可执行程序.exe0000:0000H可可用用内内存存空空间间内内 存存FFFF:0000HROM BIOS系系统统检检测测程程序序 COMMAND.COMDOS 系系统统1KB 中中断断向向量量表表 CD 20 、hello.exexxxx:0000Hxxxx:00FFH程程序序段段前前缀缀用用户户程程序序DOS的装入功能的装入功能54 修改以下寄存器的值修改以下寄存器的值 DS、ES设置为设置为 程序段前缀所在内存的段值;程序段前缀所在内存的段值;(DS)=xxxxH (ES)=x

62、xxxH SS、SP 设置为设置为 由连接程序传过来的值;由连接程序传过来的值;CS、IP 设置为设置为 程序的入口地址,程序的入口地址,即伪操作即伪操作END后跟的后跟的 符号名对应的物理地址;符号名对应的物理地址;此时此时 CS:IP 指向用户程序,指向用户程序,开始执行用户程序。开始执行用户程序。0000:0000H可可用用内内存存空空间间内内 存存FFFF:0000HROM BIOS系系统统检检测测程程序序 COMMAND.COMDOS 系系统统1KB 中中断断向向量量表表 CD 20 、hello.exexxxx:0000Hxxxx:00FFH程程序序段段前前缀缀CS:IP55D:-

63、R ;查看当前寄存器内容查看当前寄存器内容AX=0000 BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0B51 ES=0B51 SS=0B61 CS=0B61 IP=0000 NV UP EI PL NZ NA PO NC0B61:0000 B353 MOV BL,53-U ;查看程序代码查看程序代码0B61:0000 B353 MOV BL,530B61:0002 B90800 MOV CX,0008.0B61:0017 B44C MOV AH,4C0B61:0019 CD21 INT 21-D DS:0 L20 ;查看

64、此时数据段内容查看此时数据段内容(程序段前缀程序段前缀)0B51:0000 CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 5A 05 8A 03 0B51:0010 5A 05 17 03 5A 05 49 05-01 01 01 00 02 FF FF FF -U DS:0 L5 ;反汇编当前数据段内容反汇编当前数据段内容(程序段前缀程序段前缀)0B51:0000 CD20 INT 200B51:0002 FF9F009A CALL FAR BX+9A00-在在DEBUG下查看的装入情况下查看的装入情况:56-R ;查看当前寄存器内容查看当前寄存器内容AX=0000

65、 BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0B51 ES=0B51 SS=0B61 CS=0B61 IP=0000 NV UP EI PL NZ NA PO NCB353 MOV BL,53-U CS:0 ;查看程序查看程序 0B61:0000 B353 MOV BL,530B61:0002 B90800 MOV CX,00080B61:0005 D0E3 SHL BL,10B61:0007 7205 JB 000E.0B61:0017 B44C MOV AH,4C0B61:0019 CD21 INT 21.-G ;执

66、行程序执行程序01010011Program terminated normally-57注意:注意:不能破坏程序段前缀内容,不能破坏程序段前缀内容,否则无法返回否则无法返回DOS,造成死机。造成死机。58第二种第二种DOS返回方法,返回方法,调用调用20H类型的中断程序类型的中断程序 20H 中断程序的功能:中断程序的功能:处理程序结束,返回系统。处理程序结束,返回系统。调用调用20H中断程序是有条件的:中断程序是有条件的:要求当前的要求当前的CS应为程序段前缀在内存的段值应为程序段前缀在内存的段值问题:问题:如何保证执行到如何保证执行到INT 20H时,时,当前当前CS的值为程序段前缀在内存的段值?的值为程序段前缀在内存的段值?xxxx:0000INT 2059采用下面的程序框架,采用下面的程序框架,可保证执行可保证执行INT 20H时,时,当前的当前的CS值为程序段前缀在内存的段值。值为程序段前缀在内存的段值。code SEGMENT ASSUME CS:codemain PROC FAR ;使使RET为远返回为远返回 start:PUSH DS ;入栈保存地址入栈保存地址 MO

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!