《汇编语言》实验指导书V_第1页
《汇编语言》实验指导书V_第2页
《汇编语言》实验指导书V_第3页
《汇编语言》实验指导书V_第4页
《汇编语言》实验指导书V_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1、汇编语言实验指导书教师:关玉蓉班级:学期:版本:黄冈师范学院计算机学院2014 年 9 月 15 日微机原理与汇编语言实验课的性质、目的及基本要求 微机原理与汇编语言是计算机科学与技术专业本科生学习其他课程(如接口技术、单片机等)的专业基础课程,因此是计算机类专业学生的必修课,该课程在学生的计算机专业知识结构中占有重要的地位。本实验课的目的是加强学生微机原理与汇编语言的实践,使学生熟悉如何使用 DEBUG 调试程序,掌握汇编语言程序设计的基本方法和技术,并能用汇编语言进行简单的软件开发。通过汇编语言程序的设计和调试,使学生从根本上认识、了解计算机的内部工作原理,深入体会、理解计算机如何实现各种

2、复杂的运算与操作,掌握运用汇编语言解决有关硬件问题、不同语言环境的接口问题以及充分利用系统资源优化代码的基本方法,打下较扎实的系统软件、应用软件的程序设计基础,培养软件研制的基本技能。目录实验一实验一 调试工具的使用方法调试工具的使用方法.1实验二实验二 汇编语言上机过程汇编语言上机过程.6实验三实验三 选择与循环程序设计选择与循环程序设计.13实验四实验四 子程序设计子程序设计.5实验五实验五 中断与中断与 I/O 程序设计程序设计.10实验六实验六 VC+与汇编语言的混合编程与汇编语言的混合编程 .14附录一附录一 8088 汇编速查手册汇编速查手册.18附录二附录二 常用的部分系统功能调

3、用和常用的部分系统功能调用和 BIOS 中断调用中断调用.21附录三附录三 汇编语言常用出错信息汇编语言常用出错信息.260实验一 调试工具的使用方法1实验目的掌握调试工具 DEBUG 的使用方法,理解汇编指令、存储单元和寄存器等有关概念,能够对简单的汇编语言程序进行调试。2实验内容(1)学习调试工具 DEBUG 的使用方法,熟悉 DEBUG 常用命令的功能和用法。(2)利用 DEBUG 调试简单的汇编语言程序,体会汇编指令的功能、寄存器的作用、存储单元地址与内容的概念和作用、以及程序的执行过程。3实验要求(1)掌握 DEBUG 的常用命令和基本的程序调试方法(2)熟悉和掌握指令系统常用指令的

4、功能和用法,能熟练运用 DEBUG 调试工具调试简单的程序,并初步掌握使用DOS 系统功能调用的方法。4重点与难点存储器和寄存器的概念、各寄存器的用途、常用指令的功能和用法、用 DEBUG 调试程序的方法。5实验结果验收熟练运用 DEBUG 调试工具完成本实验 6.2 节要求的程序设计和调试6实验指导6.16.1 调试工具调试工具 DEBUGDEBUG 简介简介DEBUG 是 DOS 操作系统为汇编语言程序设计者和系统管理员提供的一个通用调试工具,利用 DEBUG 可以读写、传送、比较、查找和显示存储器单元内容,设置程序起始执行地址或断点,执行程序或分段执行程序,跟踪程序执行,显示处理器状态,

5、汇编或反汇编程序等。用 DEBUG 编程简单、方便和直观,可以直接查看程序执行情况,便于熟悉和理解指令,掌握基本编程技巧。DEBUG 只使用十六进制表示数据(十六进制数后不加“H” ) ,屏幕的显示数据形式如下:1400:010024 65 6E 64 73 0D 0A 20-20 63 6F 64 65 20 20 24*ends.code *1400:011073 65 67 6D 65 6E 74 0D-0A 20 20 20 20 20 20 24segment. * 1400:017024 61 78 2c 30 0D 0A 09-20 20 20 20 70 75 73 68*ax

6、,0 push屏幕每行显示内容分为三部分,一行共显示十六个字节单元的内容。第一部分是本行所显示的 16 个字节数据在存储器中的起始存放地址;第二部分是以十六进制显示的 16 个字节数据;第三部分是将本行所显示字节数据看作 ASCII 码时显示的字符,若某字节数据对应不可显示的 ASCII 码,则显示一个“.”字符代替该字节数据的显示字符。DEBUG 只有十几条单字母命令,功能强且易掌握,常用 DEBUG 命令如下:1)DEBUG 的进入和退出进入 DEBUG 时,如果要同时装入某程序,键入下面的命令:H: DEBUG 其中文件名指定要装入的程序目标码文件,其扩展名可以是.COM 或.EXE。是

7、由被装入程序接收的参数。此外,也可以用下面的方式进入 DEBUG:H: DEBUG -“-”是 DEBUG 的命令提示符,表明已进入 DEBUG 状态。在“-”提示符之后,可以键入 DEBUG 命令。退出 DEBUG 时,键入如下命令从 DEBUG 状态返回 DOS:-Q 2)汇编与反汇编命令1汇编命令 A 和反汇编命令 U 是常使用的 DEBUG 命令。 汇编命令 A格式:A 功能:逐行汇编程序,主要用于小段程序的汇编。说明:使用 A 命令汇编程序,不允许程序中出现标号和伪指令,但 MS-DOS 的 DEBUG 允许使用 DB 和 DW 这两条伪指令。如果未给出起始地址,汇编后的程序代码从指

8、令指针寄存器 IP 的值指定的地址开始存放。按两次回车键可退出汇编命令 A 的状态。例例 1-11-1 汇编一段程序,该程序的功能是在屏幕上输出一个大写字母A。-A 1001141:0100 MOV DL,411141:0102 MOV AH,021141:0104 INT 211141:0106 INT 20 反汇编命令 U格式:U 功能:在指定的地址范围内,将二进制机器指令逐条翻译为汇编语言符号指令。例例 1-21-2 将例 1-1 中汇编的程序进行反汇编-U 100 1071141:0100 B241 MOV DL,411141:0102 B402 MOV AH,021141:0104

9、CD21 INT 211141:0106 CD20 INT 203)执行程序命令在 DEBUG 下,可以完整地执行程序、分段执行程序或单步执行程序。 执行程序命令 G格式:G = 功能:完整地或分段执行程序。说明:G 命令可以从头至尾完整地执行程序,如果 G 命令带有有断点参数,则执行到断点地址时暂停并显示当前各寄存器状态,断点最多允许设置 100 个。程序正常结束时显示“Program terminated normally” 。例例 1-31-3 执行例 1-1 中汇编的程序。-G =100 AProgram terminated normally 跟踪执行命令 P 和 T格式:P = T

10、 = 功能:跟踪命令 P 和 T 可以逐条跟踪指令的执行,以便调试程序。 说明:每条指令执行后都将显示各寄存器的当前值。P 命令与 T 命令的差别是,P 命令按程序书写的指令为单位,一次跟踪完一条书写指令(执行一组相关的指令) ,而 T 命令按存储单元中存放的指令为单位,一次跟踪一条指令的执行。例例 1-41-4 用 P 命令跟踪例 1-1 中的程序。设程序执行前的各寄存器初值如下,然后开始用 P 命令跟踪例 1-1 程序:AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=1141 ES=1141 SS=1141

11、 CS=1141 IP=0100 NV UP EI PL NZ NA PO NC1141:0100 B241 MOV DL,41-P =100AX=0000 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=00002DS=1141 ES=1141 SS=1141 CS=1141 IP=0102 NV UP EI PL NZ NA PO NC1141:0102 B402 MOV AH,02-PAX=0200 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000DS=1141 ES=11

12、41 SS=1141 CS=1141 IP=0104 NV UP EI PL NZ NA PO NC1141:0104 CD21 INT 21-PAAX=0241 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000DS=1141 ES=1141 SS=1141 CS=1141 IP=0106 NV UP EI PL NZ NA PO NC1141:0106 CD20 INT 20-PProgram terminated normally用 P 命令只需跟踪执行 4 次,程序就执行完毕。如果用 T 命令逐条指令跟踪执行,则将跟踪进入 D

13、OS 功能调用的软中断服务程序中。4)显示寄存器命令 R格式:R 功能:显示或修改寄存器内容。说明:当 R 命令后面不指定寄存器时,显示所有寄存器的内容。例例 1-51-5 显示所有寄存器内容-RAX=0100 XB=0000 CX=2000 DX=00000 SP=FFEE BP=0000 SI=0000 DI=0000DS=07E1 ES=07E1 SS=07E1 CS=07E1 IP=0114 NV UP DI PL NZ NA PO NC例例 1-61-6 修改寄存器内容要修改某寄存器内容,可在 R 命令后键入寄存器名,DEBUG 将显示出这个寄存器的值,然后键入新值就可修改该寄存器内

14、容。例如修改 AX 寄存器的内容:-R AX AX 4500:3000用 RF 命令可显示和修改标志寄存器 FR 中的标志位,无论修改哪一位标志位,只需要键入该标志位的表示符号(各标志位的符号表示如表 1.1 所示) ,并且标志位值的键入顺序可任意。例例 1-71-7 修改 FR 寄存器的零标志位和进位标志位。-RF NV UP EI PL ZR NA PE CY - NZ NC (修改零标志和进位标志)-RF NV UP EI PL NZ NA PE NC - (显示修改结果)表 1.1 标志寄存器各标志位符号及意义符号表示 标 志 位=1=0OF溢出(是/否)OVNVDF方向(减/增)DN

15、UPIF中断(开/关)EIDISF符号(负/正)NGPLZF零(是/否)ZRNZAF辅助进位(是/否)ACNAPF奇偶(偶/奇)PEPOCF进位(是/否)CYNC35)存储器单元访问命令 显示存储器单元命令 D格式:D 功能:显示指定地址范围内的存储区数据,包括十六进制数据形式及其对应的 ASCII 码字符显示。例例 1-81-8 显示 110H 到 116H 存储器单元的内容。-D 110 116 1540:011073 65 67 6D 65 6E 74segment 写存储器单元命令 E格式:E 功能:逐个修改指定单元内容或将字节串写入指定的一组连续单元。例例 1-91-9 将字节串st

16、ring写入以 142H 为起始地址的存储器区。-E 142 string 例例 1-101-10 逐个单元向彩显视频缓冲区写入 41H、42H、41H、42H,彩显视频缓冲区的段地址为 B800H,数据写入后立即显示出大写的 ABAB。-E B800:70B800:0070 30.41 07.00 30.42 07.00 30.41 07.f0 30.42 07.f0B800:0078 20.注意, “.”前为存储器单元原内容, “.”后为键入的数据,按空格键继续修改下一个存储器单元。例中前两个AB为正常显示,后两个AB为反相、闪烁显示。 填充命令 F格式:F 功能:在指定地址范围内写入数据

17、。例例 1-111-11 联用 R 命令和 F 命令在彩显视频缓冲区中写入一串小写字母a。-R DS (修改 DS,使 DS 指向彩显缓冲区 B8000H)DS 0000:B800 -F 0000 0050 61(在 0 到 50H 单元内填满a)6)其他命令除以上常用命令外,DEBUG 还提供了存储区数据比较命令 C、数据查找命令 S、数据移动命令 M 和十六进制数运算命令 H 等。表 1.2 列出了 DEBUG 的全部命令以便于查阅。表 1.2 DEBUG 命令表命令及其功能格 式A(Assemble)汇编源程序AU(Unassemble)对二进制指令代码进行反汇编UT(Trace)跟踪执

18、行程序并显示寄存器内容T=P(Proceed)跟踪执行一组相关的指令P=D(Dump)显示存储区数据D或 DE(Enter)修改存储区数据EF(Fill)将成组数据填入存储区FG(Go)运行程序G=R(Register)显示和修改寄存器内容RN(Name)定义文件名NL(Load)装入文件或磁盘扇区LW(Write)写文件或写磁盘扇区WM(Move)传送存储区数据块MI(Input)读/显示端口I4O(Output)输出数据到端口OH(Hexarithmetic)十六进制加减法运算HC(Compare)比较存储区数据CS(Search)检索字节或字符串SQ(Quit)退出 DEBUGQ6.26

19、.2 实验题实验题(1)下面的例子可用于调试程序的实验,并且作为几个常用 DOS 系统功能调用的示范。 将大写字母A转换为小写字母a-A 200 MOV DL,41 ;A-DL OR DL,20 ;A-a MOV AH,2 ;功能号- AH INT 21 ;调用 DOS 功能调用 2 号功能,显示一个字符 INT 20 ;退出程序执行,返回 DOS -G =200思考并尝试修改程序,实现如下功能:将大写字母B转换为小写字母b。 从键盘输入一个字符并回显 -A 220 MOV AH,1 ;功能号- AH INT 21 ;调用 DOS 功能调用 1 号功能,从键盘接收一个字符 MOV DL,AL

20、;将接收的字符送 DL,准备显示 MOV AH,2 ;功能号- AH INT 21 ;调用 DOS 功能调用 2 号功能,显示一个字符 INT 20 ;退出程序执行,返回 DOS -G =220 显示字符串-E 120 How do you do?$-A 100 MOV DX,120 ;待显示的字符串地址-DXMOV AH,9 ;功能号- AHINT 21 ;调用 DOS 功能调用 9 号功能,显示一个字符串INT 20 ;退出程序执行,返回 DOS -G =100 思考并尝试修改程序:如果将字符串存放在 300H 开始的存储区,应该怎样修改程序?(2)从 BX 所指的内存单元开始连续存放着两

21、个字数据(被减数和减数) ,按寄存器间接寻址方式写出指令序列,取得被减数和减数,求两数之差,并将差存放于减数之后。要求计算: 3580H-3000H 3-5提示:先用 DEBUG 的 E 命令将被减数和减数写入内存某一块存储区(例如以 200H 为起始地址的存储区) ,然后在 A命令状态下写程序,将数据存储区地址(200H)送入 BX 寄存器,利用寄存器间接寻址方式访问存储单元中的被减数和减数,再计算差和存放差。思考并动手尝试:如何查看程序执行结果?(3)要求使用串操作指令编写一程序段,先将以 400H 为起始地址的存储区(40 个字节单元)初始化为空格,然后将以500H 为起始地址的存储区中

22、的 15 个字符,传送到以 400H 为起始地址的存储区中。(4)利用 DEBUG 的调试功能,体会、熟悉和掌握指令系统常用指令的使用方法及功能。5实验二 汇编语言上机过程1实验目的综合应用指令与伪指令编写简单完整的宏汇编语言程序,掌握常用的运算符、伪指令及宏汇编语言程序的结构,理解内存分段管理的方法和原理,熟悉调试宏汇编语言程序的上机过程及方法,掌握基本的循环程序设计方法。2实验内容使用汇编程序 ML(或 MASM) 、连接程序 LINK 及 DEBUG 调试简单的宏汇编语言程序,综合应用指令完成基本的循环程序设计。3实验要求综合应用指令与伪指令编写简单完整的宏汇编语言程序,并熟悉汇编、连接

23、及调试的方法和过程,完成实现简单功能的循环程序。4重点掌握常用运算符和伪指令的功能与用法,能正确地编写分段结构的宏汇编语言程序。5实验结果验收(1)编写四段结构和二段结构的宏汇编语言程序并调试成功(2)编写具有一定实用功能的循环程序并输出程序执行结果6实验指导6.16.1 上机步骤上机步骤编辑、汇编、连接、运行汇编语言程序的步骤如下:1)编辑源程序文件用 EDIT 或者任何一种文本编辑工具(如 UltraEdit32 等)建立源程序文件,注意汇编语言程序源文件扩展名必须是“.ASM” 。例如,用 EDIT 建立源程序文件 FILE.ASM 的命令如下:H: EDIT FILE.ASM执行上述命

24、令将出现一个编辑窗口,在此窗口内进行源程序编辑。按“Alt”键可以下拉出菜单选择需要的操作功能。按热键“X” ,再按“Enter”键,将保存源文件并退出 EDIT 编辑窗口。2)汇编源程序 用 MASM 5.X 版汇编程序进行汇编H: MASM FILEMicrosoft(R) Macro Assembler Version 5. 01Copyright(C) Microsoft Corp 1981-1985, 1987. All right reserved.Object filename FILE.OBJ: Source Listing NUL.LST: cross reference N

25、UL.CRF: 0 Warning Errors0 Sever Errors 用 MASM 6.X 版汇编程序进行汇编H: ML /c FILE.ASM (只产生目标文件,不进行连接)或H: ML FILE (产生目标文件并自动进行连接,产生可执行文件)汇编无错后,可进行目标文件的连接。2) 连接H: LINK FILE6Microsoft(R) Overlay Linker Version 5.03Copyright(C) Microsoft Corp 1983-1987. All right reserved.Run File FILE.EXE: List File FILE.MAP: L

26、ibraries .LIB: Definitions FileNUL.DEF: 3)运行程序 H: FILE6.26.2 四段结构的宏汇编语言程序示例四段结构的宏汇编语言程序示例(1)完整的段定义例例 2-12-1 下面是一个简单的汇编语言源程序,该程序以完整的段定义格式定义了数据段、附加段、堆栈段和代码段,功能是完成字符串传送,将 40 个星号“*”从数据段传送到附加段。datasegment;定义数据段sbufferdb40 dup (*)dataends;数据段结束extrasegment;定义附加段dbufferdb40 dup (?)extraends;附加段结束stacksegme

27、nt para stack stack;定义堆栈段db100 dup(0)stackends;堆栈段结束code segment;定义代码段mainproc far;定义主过程开始assume cs:code,ds:data,es:extra,ss:stackstart:mov ax,data ;设置数据段地址,初始化 DS 段寄存器mov ds,axmov ax,extra;设置附加段地址,初始化 ES 段寄存器mov es,axlea si,sbuffer;源字符串存储区首址送 SI 寄存器lea di,dbuffer;目的存储区首址送 DI 寄存器cld;设置方向标志(DF=0)mov

28、cx,40;源字符串长度送 CX 寄存器rep movsb;字符串传送mov ax,4c00h;返回 DOSint 21hmainendp;主过程结束codeends;代码段结束end start;源程序结束(2)简化的段定义例例 2-22-2 下面是例 2-1 源程序的简化段定义格式。.model small;定义存储模式.data;定义数据段sbufferdb40 dup (*).data?;定义 data?数据段7dbufferdb40 dup (?).stack100;定义堆栈段(100 字节).code;定义代码段.startup;定义程序起始点mov ax,data ;设置附加段地

29、址,初始化 ES 段寄存器mov es,axlea si,sbuffer;源字符串存储区首址送 SI 寄存器lea di,dbuffer;目的存储区首址送 DI 寄存器cld;设置方向标志(DF=0)mov cx,40;源字符串长度送 CX 寄存器rep movsb;字符串传送.exit 0;返回 DOSend ;源程序结束(3)汇编(同时产生列表文件) 、连接并运行将上述简化段定义源程序建立为源文件 stars40.asm 后,汇编命令如下:H: ML /c /Fl /Sg stars40.asm上述命令将产生目标文件 stars40.obj 和列表文件 stars40.lst。其中选项/c

30、 要求只汇编不连接,选项/Fl 要求产生列表文件,选项/Sg 要求在列表文件中列出由汇编程序根据伪指令所产生的机器指令。对 stars40.obj 文件进行连接,产生可执行文件 stars40.exe,连接命令如下:H:LINK stars40运行可执行文件 stars40.exe,命令如下:H: stars40(4)用 DEBUG 调试和分析 stars40.asm 程序 进入 DEBUG 时装入 stars40.exe 程序,如图 2.1 所示,执行命令:debug stars40.exe。图 2.1 进入 DEBUG 并装入 stars40.exe 程序进入 DEBUG 后,用 r 命令

31、显示出装入 stars40.exe 程序时各寄存器的初值,可供分析代码段、数据段、附加段及堆栈段的存储区分配位置和大小。注意数据段地址为 DS=0B90,代码段地址为 CS=0BA0。 用 d 命令从 DS:0 地址开始显示存储区内容(图 2.2) ,前 256 个字节(存储区地址为 0B90H:00H0B90H:FFH)是程序段前缀(PSP) ,其中 00H-01H 字节存放的是 INT 20H 指令的代码(CD 20) ,用于结束程序执行,返回 DOS。8图 2.2 显示程序段前缀(PSP) 继续显示存储区内容(图 2.3) ,可以看到从 0B90H:0100H 单元开始是代码段存储区,该

32、地址为代码段第一条指令的地址,等价于 CS:IP 中的段地址和偏移地址 0BA0H:0000H。图 2.3 显示源数据区和目的存储区可以用 u 命令进行反汇编(如图 2.4 所示) ,验证代码段存储区中的指令。从 0BA0H:0H 单元(等价于 0B90H:0100H单元)开始存放着代码段二进制指令,反汇编后得到符号汇编指令(参考前边的列表文件) ,其中前 12 条指令是由.startup 伪指令展开的一组指令,主要完成初始化 DS 段寄存器、调整 SS 和 SP 寄存器的功能。9图 2.4 反汇编列出源代码 从 0B90H:0130H 单元开始是数据段(见图 2.3) ,数据段中定义了 40

33、(28H)个字节的源数据区 sbuffer,并初始化为 40 个“*” ,其 ASCII 码为 2AH。从 0B90H:0158H 单元开始定义了 40 个字节的目的存储区 dbuffer。在程序执行前,dbuffer 还没有从 sbuffer 传送来的 40 个“*” 。 用 g 命令从 0BA0H:0000H 地址开始执行程序 stars40.exe,再执行 d 命令显示存储区内容,如图 2.5 所示,从窗口中可以看出,程序执行后,在 0B90H:0158H 单元开始的目的存储区 dbuffer 中,已经存放了由 0B90H:0130H 单元开始的 sbuffer 传送来的 40 个“*”

34、 。图 2.5 执行程序并显示 dbuffer 中的执行结果 要进一步分析程序执行过程,可用 p 命令逐条跟踪程序的执行,如图 2.6 和 2.7 所示。10图 2.6 开始单步跟踪程序的执行图 2.7 继续跟踪程序的执行当各个段寄存器初始化完成后(即执行完 mov es,ax 指令后) ,DS=ES=0BA3H,SS:SP 调整为 0BA3H:00C4H。这是因为对于.small 存储模式,规定数据段、附加段、堆栈段共占一段(=64KB)存储区。0BA3H 是相对段内偏移地址为 0 的段地址,而 0B90H 是从程序段前缀(PSP)起点开始计数的段地址,二者的关系为 0B90H:0130H=

35、0BA3H:0000H,转换为物理地址时是相同的地址,代表相同的存储单元。此外,从程序的执行过程可以看到,源数据区 sbuffer(偏移地址为 0)和目的存储区 dbuffer(偏移地址为 28H)是接着连续分配单元的。当执行了串传送指令 repz movsb 后,dbuffer 存入 40 个“*” 。用 d 命令从 0BA3H:0000H 地址开始显示存储单元内容,出现 80 个“*” ,其中 sbuffer 和 dbuffer 各存有 40 个“*” ,如图 2.8 所示,该窗口中的显示结果与图 2.3(见该图从 0B90H:0130H 地址开始的存储单元内容)的显示结果相同。图 2.8

36、 显示目的存储区中的串传送指令执行结果由于 stars40.exe 程序没有输出操作,所以程序运行后在屏幕上没有执行结果显示。但是在 DEBUG 中执行该程序时,可以跟踪执行并查看内存单元数据,因此能看到程序的执行结果,由此也可以体会 DEBUG 的调试功能。6.36.3 实验题实验题(1)修改例 2-1 程序,输出传送到目的缓冲区 dbuffer 中的字符串。 修改提示: DS 应指向附加段 dbuffer 中的字符串应加字符串结束符$ 执行 DOS 功能调用的 9 号子功能输出 dbuffer 中的字符串 (2)写程序,输出演示系统的欢迎词,输出格式的最低要求如下: *11 * * * 英

37、文(中文)欢迎词 * * * * 提示:通过编写与调试该程序,掌握两段结构的程序设计、输出数据的格式编排(由 ASCII 码 0AH 和 0DH 控制换行和回车操作) 、DOS 功能调用,熟悉宏汇编程序调试的上机过程。(3)编程计算 3550H-2320H,按 16 进制输出计算所得的差 1230H。再输出 3550H-2321H 的差,检验程序的正确性。提示:考虑依次将 1230H(即 0001 0010 0011 0000B)从高位到低位,每 4 位二进制数一组分离出来,再将 4 位二进制数转换为 ASCII 码,利用 DOS 系统功能调用的 2 号子功能输出,就得到 16 进制数据的输出

38、效果。本题要求综合应用移位操作、逻辑操作等指令,并利用条件转移指令实现简单的循环程序,程序流程如图 2.9 所示。是开 始减法计算结 束否bx二进制数(差)ch循环次数 4(bx)循环左移 4 位(用 rol 指令)ch(ch)-1dl分离出(bx)的最低 4 位(用 and 指令)输出 dl 中的数字字符(利用 2 号 DOS 系统功能调用)dl将(dl)转换为 ASCII 码图 2.9 16 进制数据输出程序流程图(ch) = 0?12实验三 选择与循环程序设计1实验目的掌握汇编语言程序设计的基本方法,熟悉汇编语言分支程序设计、循环程序设计的特点及 DOS 系统功能调用的应用,了解多模块程

39、序设计基本方法。2实验内容分支程序设计、循环程序设计的应用。3实验要求全面掌握用汇编语言设计程序的方法,会设计多重循环程序,能利用跳转表实现多路程序分支,理解并会熟练应用DOS 系统功能调用,掌握 COM 格式的程序设计方法。4重点与难点条件转移指令、无条件转移指令及循环指令的使用;分支程序;利用堆栈传递子程序参数的方法5实验结果验收编写并调试一些完成典型算法或操作的程序,如子串搜索、菜单处理、数据排序、递归法求和等。6实验指导6.16.1 DOSDOS 系统功能调用步骤系统功能调用步骤DOS 系统功能调用为用户提供了有关基本输入输出管理、磁盘读写管理以及文件与内存管理的功能,可供在汇编语言中

40、直接调用,调用方法如下:(1)功能号送 AH 寄存器(2)入口参数送该功能指定的寄存器(3)执行 INT 21H 指令(4)如果该功能有返回参数,从指定的寄存器获取出口参数。附录中列出了部分较常用的 DOS 系统功能调用供查阅。6.26.2 子程序设计方法示例和模块化程序设计子程序设计方法示例和模块化程序设计例例 3-13-1:编制计算下面函数值的程序(x、y 的值均在-128-+127 之间) 1 x0,y0a= -1 x0,y0 0 x,y 异号输入数据为 x,y,输出数据为a。程序流程图:结束开始X0Y ML /c ring.asm(汇编) H: LINK ring(连接)H: EXE2

41、BIN ring (EXE 文件转换为 COM 文件)H: ring(执行)6.46.4 实验题实验题(1)编程完成在一个源字符串中搜索子字符串的功能(要求使用串比较指令 cmpsb 进行各次搜索) ,并输出搜索结果。提示:例如,源串为:How are you?子串为:are搜索方法如下: 源串中含有子串 are 时,搜索过程如图 3.1 所示。Howareyou?源串are第一次搜索are第二次搜索第二次搜索are搜索到子串,搜索结束图 3.1 源串中含有子串时的搜索过程 源串中不含子串 arr 时,搜索过程如图 3.2 所示。Howareyou?源串arr第一次搜索arr第二次搜索第二次搜

42、索arr最后一次搜索,搜索结束图 3.2 源串中不含子串时的搜索过程每一次搜索用 repz cmpsb 指令完成。第一次搜索时,寄存器 SI 指向源串,寄存器 DI 指向子串,每搜索一次,SI指向源串的下一个字符,DI 总是指向子串起点,然后进行两串比较,串比较的长度为子串长度。在整个搜索操作中,最多搜索的次数为:源串长度-子串长度+1。程序基本流程如图 3.3 所示。3(2)编程实现从键盘输入学生分数等级:、,统计每种分数等级的人数并求平均成绩(要求用跳转表实现程序分支) ,输出统计结果,要求输出信息意义清楚。提示:实现所要求功能的程序流程如图 3.4 所示,当键入 ESC 键时结束成绩输入

43、,ESC 键的 ASCII 码为 27(十六进制 1BH) 。图 3.4 统计成绩程序流程图br2否否是br0输入成绩ESC 键?AE?输出标题信息:A B C D E统计 A输出平均成绩结束开始显示输入错信息显示成绩统计结果是br1br3br4统计 B统计 C统计 D统计 E取跳转地址开 始第一次搜索前的初始化:SI 指向源串,DI 指向子串,并设置搜索次数搜索一次(repz cmpsb)搜索到子串?SI 指向源串下一个字符搜索次数-1搜索次数=0?输出未找到子串的信息结 束输出找到子串的信息是是否否图 3.3 串搜索流程图4实验四 子程序设计1实验目的掌握汇编语言程序设计的基本方法,熟悉汇

44、编语言子程序设计方法的特点,了解多模块程序设计基本方法。理解 CPU 如何实现子程序的调用和返回以及递归调用操作,深刻体会堆栈在计算机系统的基本操作中不可或缺的重要作用。2实验内容子程序设计的应用。3实验要求全面掌握用汇编语言设计程序的方法,熟悉子程序嵌套调用、递归调用和参数传递的方法,了解多模块程序设计方法。4重点与难点子程序设计;利用堆栈传递子程序参数的方法。5实验结果验收编写并调试一些完成典型算法或操作的程序,如子串搜索、菜单处理、数据排序、递归法求和等。6实验指导6.16.1 子程序设计方法子程序设计方法例例3-13-1 下面是一个求和计算例子,主程序getsum调用子程序sum计算1

45、00个自然数之和,然后再调子程序btod按十进制格式显示求和结果,子程序的参数采用寄存器传送。;主程序getsum.model small.stack.code.startupmovax,100;由ax给sum子程序传递的入口参数(100)callsum;调用sum子程序,由ax返回出口参数(求和结果)callbtod;调用btod子程序显示十进制求和结果.exit 0; 求和子程序sum; 入口参数:AX=N,表示求1到n的累加和; 出口参数:AX,传递累加和sumprocnearmovcx,axmovax,0again:addax,cxloopagainretsumendp; 十进制显示子

46、程序btod; 入口参数:AX=需要显示的数; 出口参数:无btodprocnear5pushsi;保护现场pushcxpushdxmovdx,0movsi,10next:divsi;除10取余数adddl,30h;将余数转换为ASCII码pushdx;各余数依次入栈保护,以便用堆栈反序出栈,实现倒取余数inccxmovdx,0;清除dx中已入栈保存的余数cmpax,0;商为0时结束除10取余计算jnznextmovah,2disp:popdx;余数反序出栈,实现倒取余数int21h;显示反序余数,实现十进制数的转换loopdisppopdx;恢复现场popcxpopsiretbtodendp

47、end6.26.2 多模块程序设计方法多模块程序设计方法例 3-1 是将所有子程序和主程序存放在同一文件中进行汇编和连接。下面的例 3-2 按多模块程序设计方法,将主程序、各子程序作为独立的源程序文件分别进行汇编,然后连接为一个可执行文件。例例 3-23-2 多模块程序设计方法示例。主程序和各子程序如下:;getsum.asm 文件(主程序).model small.stack.codeexternsum:near, btod:near.startupmovax,100;由ax传递sum子程序的入口参数(100)callsum;调用sum子程序,由ax返回出口参数(求和结果)movdx,0;由

48、(dx, ax)传递要显示的求和结果callbtod;调用btod子程序显示十进制求和结果.exit 0end; sum.asm文件(子程序1); 入口参数:AX=N,表示求1到n的累加和; 出口参数:AX,传递累加和.model small.codepublicsumsumprocnear;求和子程序movcx,ax6movax,0again:addax,cxloopagainretsumendpend;btod.asm文件(子程序2); 入口参数:DX.AX=需要显示的数; 出口参数:无.model small.codepublicbtodbtodprocnear;十进制显示子程序push

49、sipushcxmovsi,10next:divsiadddl,30hpushdxinccxmovdx,0cmpax,0jnznextmovah,2disp:popdxint21hloopdisppopcxpopsiretbtodendpend将上述 3 个源程序文件分别汇编后,连接,再运行,命令如下:H: ML /c getnum.asmH: ML /c sum.asmH: ML /c btod.asmH: LINK getnum+sum+btodH: getnum5050(输出十进制求和结果)6.36.3 子程序库命令的使用子程序库命令的使用可以将一些较成熟的子程序建立成一个子程序二进制目

50、标文件库,连接时只需要给出库文件名进行连接,便于子程序的共享。对子程序库进行创建、增添、删除等操作的命令为 LIB.EXE,执行下述命令可以显示出 LIB 命令的帮助信息:H: LIBMicrosoft (R) Library Manager Version 3.20.010Copyright (C) Microsoft Corp 1983-1992. All rights reserved.7Usage: LIB library options commands ,listfile ,newlibraryOptions: /?: display LIB options /HELP: disp

51、lay help on LIB /IGNORECASE : ignore case on names /NOEXTDICTIONARY: do not build extended dictionary /NOIGNORECASE: do not ignore case on names /NOLOGO: do not display signon banner /PAGESIZE:n : set library page size to nCommands: +name: add object file -name: delete object file -+name: replace ob

52、ject file *name: copy (extract) object file -*name: move (delete and extract) object file例例 3-33-3 建立子程序库 MYLIB.LIB,并将 sum.obj 和 btod.obj 文件加入该子程序目标文件库,然后在连接时指定库文件 MYLIB.LIB 来连接这两个子程序。 建立新库 MYLIB.LIBH: LIB MYLIB.LIBMicrosoft (R) Library Manager Version 3.20.010Copyright (C) Microsoft Corp 1983-1992.

53、 All rights reserved.Library does not exist. Create? (y/n) yOperations: (此处可选择操作选项)List file: MYLIB.lst (产生列表文件,该文件列出了库文件中的子程序信息) 将 sum.obj 和 btod.obj 文件加入新库H: LIB MYLIB.LIB + sum.obj +btod.objMicrosoft (R) Library Manager Version 3.20.010Copyright (C) Microsoft Corp 1983-1992. All rights reserved.L

54、ist file: LIST(若指定文件名,可产生列表文件)Output library: (若指定文件名,可产生新的库文件) 连接库文件H: LINK getsumMicrosoft (R) Segmented-Executable Linker Version 5.03Copyright (C) Microsoft Corp 1984-1989. All rights reserved.Run File GETSUM.EXE: List File NUL.MAP: Libraries .LIB: MYLIBDefinitions File NUL.DEF: 运行程序H: getsum 50

55、50此外,可以在 getsum.asm 文件中加上“includelib mylib.lib”库文件包含语句,就可以直接进行汇编、连接,连接时不再需要给出库文件。86.46.4 实验题实验题(1)编程实现一维数组的排序操作。要求:主程序准备待排序的数据,调用子程序进行排序。子程序接收 3 个参数:数组名、数组长度、排序标志(=1:从大到小排序;=2:从小到大排序) 。子程序根据主程序由寄存器传递的排序标志,对指定数组从大到小或从小到大排序。提示:程序流程如图 3.5 所示,排序方法可参考教材例 4-20。(2)编写一个递归子程序,完成自然数 1 到 100 的求和运算。编写主程序测试该递归子程

56、序,按 16 进制或 10 进制输出求和结果(提示:参考教材例 4-14) 。子程序排序标志=?=2从大到小排序从小到大排序=1返 回是输入排序标志排序标志=0?排序标志=1?主程序开始否否显示输入错信息是调用排序子程序输出排序后的数组结 束图 3.5 排序程序流程图9实验五 中断与 I/O 程序设计1实验目的理解有关中断系统的原理和概念,了解计算机处理外部事件和特殊事件的机制与方法,掌握程序直接控制的 I/O 程序设计和中断程序设计方法,了解中断程序设计的应用。2实验内容ROM BIOS 中断调用的运用;输入/输出指令(IN/OUT)的使用及程序直接控制的 I/O 程序设计;内存驻留方式的中

57、断程序设计。3实验要求理解中断源、中断类型号、中断向量、中断请求、中断服务等概念以及三种输入/输出数据传送方式的特点,掌握输入/输出指令及端口级的 I/O 程序设计,掌握中断向量表的设置方法和中断程序设计方法。4重点与难点理解中断向量表的的作用及中断传送方式的优点,掌握中断程序设计方法及应用。5实验结果验收完成一项综合使用几种数据传送方式的中断程序设计,并用 WORD 编写实验报告。6实验指导6.16.1 中断例程的安装中断例程的安装编写、安装中断 7ch 的中断例程,功能:求一 WORD 型数据的平方。参数:(AX)=要计算的数据返回值:DX:AX 中存放结果的高 16 位和低 16 位。应

58、用举例:CODES SEGMENT ASSUME CS:CODESSTART:mov ax,3456int 7chadd ax,axadc dx,dx MOV AH,4CH INT 21HCODES ENDS END START分析:本题主要做三部分工作:(1)编写实现平方功能的程序;(2)安装程序,我们将其安装在 0:200H 处;(3)设置中断向量表,将程序的入口地址保存在 7ch 表项中,使其成为中断 7ch 的中断例程。安装程序如下:CODE SEGMENT ASSUME CS:CODESTART: ;中断安装程序mov ax,csmov ds,ax10mov si,offset sq

59、rmov ax,0mov es,axmov di,200h;计算中断例程的长度mov cx,offset sqrend-offset sqr cldrep movsb;设置中断向量mov ax,0mov es,axmov word ptr es:7ch*4,200hmov word ptr es:7ch*4+2,0;中断调用mov ax,3456int 7chadd ax,axadc dx,dxmov ax,4c00hint 21h;中断处理程序sqr:mul ax iretsqrend:nopCODE ENDS END START调试方法:程序运行后,在 DEBUG 中查看 DX、AX 的值

60、,并采用 U 命令检验中断例是否安装到指定位置(0:200) 。6.26.2 中断程序设计示例中断程序设计示例以用户中断向量代替系统原 05H 类型的屏幕打印中断向量,只要按下屏幕打印键,将产生一个 05H 类型的外部中断请求,就可进入新设置的用户中断向量,完成相应的中断服务,即显示一行信息串。分析:(分析:(1 1)如果要使得用户的中断服务程序能让其他程序使用,就必须将用户中断服务程序驻留在系统主存中,这样就产生了驻留(TSR Terminate and Stay Resident)程序。本例简明地示范了驻留内存方式的中断程序设计方法及程序结构。在本例中,当发生中断请求后,实现中断服务,显示

温馨提示

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

评论

0/150

提交评论