




已阅读5页,还剩56页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机学院本科专业汇编语言实验指导书实 验 须 知一、 预习要求1 实验前认真阅读实验教程中有关内容,明确实验目的和实验任务。2 每次实验前应有预习报告,未预习者不允许参加实验。3 预习报告中:要求画出程序流程图,编好上机程序。二、 实验要求1 实验是学习“汇编语言程序设计”课程的重要环节,实验课请勿迟到,缺席。2 爱护设备,保持清洁,不随意更换设备。3 认真完成实验任务,实验结果经教师检查,教师对实验内容提问,对完成者做记录。4 实验完毕,请整理实验设备,再离开实验室。三、 报告要求每次实验后,应递交一份实验报告,报告中应包括下列内容:1 实验名称、实验人姓名、学号、班级、所用的设备号。2 实验目的、任务。3 各任务程序流程图、程序清单(应加适量注释)。4 记录和分析实验结果。5 据实验目的认真做小结。目录实验一 DEBUG命令的使用3实验二 汇编语言指令系统练习12实验三 汇编语言程序的调试与运行15实验四 顺序程序设计23实验五 分支程序设计26实验六 循环程序设计29实验七 子程序设计33实验八 DOS和BIOS中断功能调用40实验九 I/O程序实验43附录I 汇编程序示例54附录II 8086/8088汇编指令表60附录III 常用ASCII表62实验一 DEBUG命令的使用一、实验目的1 练习简单的DOS命令(DIR, CD,MD ,CLS)2学习使用DEBUG程序的常用命令。(R,D,E, A,U,T, G,Q)3了解8086内存地址空间分配 二、预备知识1DOS常用命令练习在Windows 98、Windows2000、Windows XP 中启动DOS,单击“开始”菜单中的“运行”命令,打开“运行”对话框,在文本框中输入“command”后,单击“确定”按钮。进入DOS方式后,如果显示为窗口方式,可以按下Alt+Enter 键将窗口变换为全屏幕方式。(1)要更换当前目录到硬盘的其它分区,应该输入盘符然后回车。比如要到D盘,那么就输入D:。(2)cd命令,改变缺省目录或显示当前目录。更换当前目录到硬盘的其它分区回到上一级目录回到根目录(3)dir命令,查看电脑中的文件。目录名文件名其中凡后缀为exe、com或bat的文件都是可以直接执行的。这些以exe为后缀的文件叫可执行文件;以com为后缀的文件叫命令文件;以bat为后缀的文件叫批处理文件。如果我们要执行这些文件,只需在提示符下敲入文件基本名然后回车即可,不需输入文件后缀。(4) del命令,删除文件。要删除当前目录中的某个文件,输入del空格再加上文件名就可以了。如:要删除当前目录中的a.asm 文件。(5)copy命令,复制文件。复制就是原来的文件并没有任何改变,重新产生了一个内容和原来文件没有任何差别的文件。copy命令的格式: copy 源文件名 目的文件名无论源文件还是目的文件 如果不指明驱动器名,即为当前驱动器; 如果不指明目录,即为当前目录; 如果不指明文件名,则为相同文件名。2掌握DEBUG程序的常用命令。DEBUG是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。(1)进入DEBUGDEBUG是在DOS方式下使用的程序。在进入DEBUG之前,应先进入到DOS方式。这个程序在Windows98中通常在C:WINDOWSCOMMAND下,在Windows2000或WindowsXP中通常在D:WINDOWSsystem32下。由于系统指定了搜索路径,所以在任何一个路径中都可以运行。CDEBUG D: PATH FILENAME.EXT PARM1 PARM2其中,文件名是被调试文件的名字(可以省略)。D:指定驱动器,PATH为路径,FILENAME.EXT为文件名,PARM1为命令参数(2)用?命令查看DEBUG中能使用那些命令以及命令的格式下面将讲述与汇编语言学习密切相关的几个命令:用R(寄存器)命令查看、改变CPU寄存器的内容格式:R register l 如果在没有参数的情况下使用,则 r 命令显示所有寄存器的内容以及寄存器存储区域中的标志。 l 如果指定了寄存器名称,将显示以十六进制标记表示的寄存器的 16 位值,并将冒号显示为提示符。如果要更改包含在寄存器中的值,除非键入新值并按 ENTER 键;否则,请按 ENTER 键返回 Debug 提示符。 l 如果键入 f 字符代替寄存器名,Debug 将每个标记的当前设置显示为两字母代码,然后显示 Debug 提示符。要更改标志的设置,请从下表中键入适当的两字母代码: 标志名溢出OF方向DF中断IF负号SF零ZF辅助进位AF奇偶PF进位CF设置ovdn(减)ei(启用)ng(负)zracpe(偶校验)cy清除nvup(增)di(禁用)pl(正)nznapo(奇校验)nc可以按任何顺序键入新的标志值。不需要在这些值之间留出空格。要停止 r 命令,请按 ENTER 键。任何没有指定新值的标志保持不变。Debug 的默认设置 在启动 Debug 时,会将段寄存器设置到空闲内存的低端,指令指针IP设置为 0100h,清除所有标志,并且将其余寄存器设置为零,除了被设置为 FFEEh 的SP之外。在所有寄存器的下方,Debug还列出了CS:IP所指向的内存单元处缩放的机器码,并将它翻译为汇编指令。可以看到上图中CS:IP所指向的内存单元为0C15:0100,此处存放的机器码为98,对应的汇编指令为CBW。用D(转储)命令查看内存中的内容格式:D range 指定要显示其内容的内存区域的起始和结束地址,或起始地址和长度。如果不指定 range,Debug 程序将从以前 d 命令中所指定的地址范围的末尾开始显示 128 个字节的内容。 当使用 d 命令时,Debug 以两个部分显示内存内容:十六进制部分(每个字节的值都用十六进制格式表示)和 ASCII 码部分(每个字节的值都用 ASCII 码字符表示)。每个非打印字符在显示的 ASCII 部分由句号 (.) 表示。每个显示行显示 16 字节的内容,第 8 字节和第 9 字节之间有一个连字符。每个显示行从 16 字节的边界上开始。 用E(键入)命令改写内存中的内容可以按十六进制或 ASCII 格式键入数据。以前存储在指定位置的任何数据全部丢失。 格式:E address list l 如果在没有指定可选的 list 参数的值情况下指定 address 的值,Debug 将显示地址和内容,在下一行重复地址,并等待您的输入。此时,可以执行下列操作之一: 替换字节值。为此,请在当前值后键入新值。如果您键入的值不是有效的十六进制值,或该值包含两个以上的数字,则 Debug 不会回显无效或额外的字符。 进入下一个字节。为此,请按 SPACEBAR(空格键)。要更改该字节中的值,请在当前值后键入新值。如果按 SPACEBAR(空格键)时,移动超过了 8 位界限,Debug 程序将显示新的一行并在行首显示新地址。 返回到前一个字节。为此,请按 HYPHEN 键 (-)。可以反复按 HYPHEN 键 (-) 向后移动超过多个字节。在按 HYPHEN 时,Debug 开始新行并显示当前地址和字节值。 停止执行 e 命令。为此,请按 ENTER 键。在任何字节位置都可以按 ENTER。 l 如果指定 list 参数的值,随后的 e 命令将使用列表中的值替换现有的字节值。如果发生错误,将不更改任何字节值。 List 值可以是十六进制字节或字符串。使用空格、逗号或制表符来分隔值。必须将字符串包括在单或双引号中。 用A(汇编)命令以汇编指令的形式在内存中写入机器指令该命令从汇编语言语句创建可执行的机器码。所有数值都是十六进制格式,必须按一到四个字符输入这些数值。在引用的操作代码(操作码)前指定前缀记忆码。 格式:A address 指定键入汇编语言指令的位置。对 address 使用十六进制值,并键入不以“h”字符结尾的每个值。如果不指定地址,a 将在它上次停止处开始汇编。可以使用段的替代记忆码cs:、ds:、es: 和 ss:。 用U(反汇编)命令查看内存中机器码的含义反汇编字节并显示相应的原语句,其中包括地址和字节值。反汇编代码看起来象已汇编文件的列表。 格式:U range range 指定要反汇编代码的起始地址和结束地址,或起始地址和长度。如果在没有参数的情况下使用,则 u 命令分解 20h 字节(默认值),从前面 u 命令所显示地址后的第一个地址开始。 用T(跟踪)命令执行内存中的机器码格式:T =address value使用Debug的T命令可以执行一条或多条命令。l 简单地使用T命令,可以执行CS:IP指向的指令。l 可以用 =address 指定当前在内存中要开始执行的程序地址,用value指明执行的几条指令。用G(转向)命令运行当前在内存中的程序格式:G =address breakpoints =address 指定当前在内存中要开始执行的程序地址。如果不指定将从 CS:IP 寄存器中的当前地址开始执行程序。 breakpoints 指定可以设置为 g 命令的部分的 1 到 10 个临时断点。 用Q(退出)停止 Debug 会话,不保存当前测试的文件当键入 q 以后,控制返回到 DOS 的命令提示符。 三、实验任务1. 用DIR命令查看当前工作目录的文件。2. 用命令 CD进入下一级子目录,用命令 MD建立子目录。3. 用命令 CLS清屏。4. 用R命令查看8086/8088 CPU在开机后执行的第一条指令。(8086/8088 CPU在开机后执行的第一条指令在内存FFFF:0H开始处。)5. 用命令D查看DS:20022F和F000:20022F两内存块内容,用命令E将字符“A”分别填入这两个内存块,比较填入前后结果,了解可读写内存RAM和只读内存ROM的区别。6. PC机主板上的ROM中写有一个生产日期,在内存FFF00HFFFFFH的某个单元中,请找到这个生产日期并试图改变它。7. 向内存从B8100H开始的单元中填写数据,如:-e B810:0000 01 01 02 02 03 03 04 04填写不同的数据观察产生的现象;改变填写的地址,观察产生的现象提示:在8086PC机内存地址空间分配: 00000-9FFFF是RAM随机存储器地址空间;A0000-BFFFF 是显存地址空间;C0000-FFFFF是ROM只读存储器地址空间。四、实验报告1 记录CPU在开机后执行的第一条指令。2 说明可读写内存RAM和只读内存ROM的区别。3 记录任务5、6、7的产生的现象,说明原因。4 针对实验目的认真做小结。实验二 汇编语言指令系统练习一、实验目的1利用DEBUG学习汇编语言源程序的调试过程。2了解指令不同的寻址方式。3熟悉汇编中传送、逻辑等指令。二、实验任务1用DEBUG命令R、E修改寄存器或内存的内容,(DS)=2000H,(BX)=0100H, (SI)=0002H, (20100)=12H, (20101)=34H, (20102)=56H, (20103)=78H, (21200)=2AH, (21201)=4CH, (21202)=B7H, (21203)=65H,试说明下列各条指令执行完后AX寄存器的内容。 (1)MOV AX, 1200H(2)MOV AX, BX(3)MOV AX, 1200H(4)MOV AX, BX(5)MOV AX, 1100BX(6)MOV AX, BXSI(7)MOV AX, 1100BXSI2用DEBUG命令A汇编下列指令,判断指令正误并说明原因。(1) ROR AX,8(2) LEA DI,AX(3) MOV DS,2010(4) MOV AX,IP(5) SHL AX,5(6) MOV AX,DX(7) MOV SI,DI(8) CMP 100,AX3如果TABLE为数据段中0032单元的符号名,其中存放的内容为1234H,试问以下两条指令执行完后,AX寄存器的内容是什么?(1) MOV AX, TABLE(2) LEA AX, TABLE4假设(AX)=2FD4H,在DEBUG命令A汇编下列指令,用命令T执行,确定下列各条指令执行的结果。(1)AND AX,5555H(2)OR AX,5555H(3)XOR AX,5555H(4)NOT AX(5)TEST AX,5555H5在DEBUG命令A汇编下列指令,用命令T单步执行,记录下列程序段中每条指令执行结束后,AX寄存器及状态标志的值分别是什么?三、实验说明1用DEBUG命令R可以修改寄存器的内容,用命令E可以修改内存的内容,用命令A汇编指令,要注意CS、IP中的内容。例如:MOV CX,BX执行后,将以DS为段地址,BX内容为有效地址的子单元中的内容传送到CX中。假设(DS)=2000H,(BX)=0100H,用命令R修改寄存器的内容。假设(20100)=12H,用命令E修改内存的内容用命令A汇编指令MOV CX,BX,用命令T单步执行。2在命令A下汇编各条指令,对于错误的指令,DEBUG指令出其错误位置,对于正确的指令,将其汇编到相应内存,据此可判断指令正误,而具体原因需自己分析。3任务六可以用MOV、ADD、JMP指令实现。四、实验报告1说明任务一的源操作数和目标操作数的寻址方式,并记录目标操作数的值。2判断任务二中指令的正误并说明原因。3记录任务三执行结果的区别并说明原因。4记录任务四中各条指令执行的结果和状态标志的值并说明这五种逻辑运算指令的区别。5记录任务五中每条指令执行结束后,AX寄存器及状态标志的值。6 针对实验目的认真做小结。实验三 汇编语言程序的调试与运行一、实验目的1掌握汇编语言程序上机过程。 2了解汇编程序、连接程序、DOS系统装入和返回功能。 3掌握用DEBUG调试汇编语言程序的方法。 4掌握汇编语言程序结构。5学习汇编语言的伪操作。二、预备知识1、汇编语言程序的上机过程(1)编辑源程序可使用任何一个文本编辑器(如E、记事本等)编辑源文件,源文件的扩展名通常取为.asm。在我们的课程中,使用DOS下的Edit。l 进入DOS方式,运行Edit。l 在Edit中编辑程序。l 将程序保存为扩展名是.asm的文件后,退出Edit,结束对源程序的编辑。这里我们将示例程序取名为1.asm。(2)编译完成对源程序的编辑后,我们得到一个源程序文件D:masm501.asm。我们可以对其进行编译,生成包含机器代码的目标文件。在本课程中我们采用微软的MASM汇编编译器进行编译。文件名为:masm.exe。l 进入DOS方式,进入masm.exe所在的目录,首先会显示版本信息和版权信息。要求输入目标文件的名字,默认名为1.OBJ,如果采用默认目标文件名则直接按回车键。l 输入列表文件的名称,这个文件是编译器将源程序编译为目标文件的过程中产生的中间结果,可以让编译器不生成这个文件,直接按回车键即可。l 输入交叉引用文件的名称,也是编译器将源程序编译为目标文件的过程中产生的中间结果,可以让编译器不生成这个文件,直接按回车键即可。l 对源程序的编译结束,编译器输出的最后两行告诉我们这个源程序没有警告错误和必须要改正的错误。 若文件有语法错误,据错误提示,返回(1),修改源文件。(3)连接在对源程序进行编译得到目标文件后,我们需要对目标文件进行连接,从而形成可执行文件。通过对D:masm501.asm进行编译得到D:masm501.obj,现再将它用连接程序(采用微软的Overlay Linker,文件名为:link.exe)连接生成可执行文件。l 进入DOS方式,进入link.exe所在的目录,首先会显示版本信息和版权信息。要求输入生成的可执行文件的名字,默认名为1.EXE,如果采用默认目标文件名则直接按回车键。l 输入映像文件的名称,这个文件是连接程序将目标文件连接为可执行文件的过程中产生的中间结果,可以让连接程序不生成这个文件,直接按回车键即可。l 输入库文件的名称。库文件里包含一些可以调用的子程序,如果在程序中调用了某个库文件中的子程序,就需要在连接的时候将库文件和目标文件连接在一起,生成可执行文件。这个程序中没有调用任何子程序,所以忽略库文件名的输入,直接按回车键。l 对目标文件的连接结束,连接程序的最后以行告诉我们,这个程序中有一个警告错误:“没有栈段”,这里我们不理会这个错误。(4)已简化的方式进行编译和连接l 在编译的命令行结尾加上分号,按回车键后,编译器就对1.asm进行编译,在当前路径下生成目标文件1.obj,并在编译过程中自动忽略中间文件的生成。l 在连接的命令行结尾加上分号,按回车键后,连接程序就对1.obj进行处理,在当前路径下生成可执行文件1.EXE,并在过程中自动忽略中间文件的生成。(5)执行DOS下直接键入可执行文件名,即可执行该程序。程序运行后没有任何结果,是因为这个程序没有向显示器输出任何信息。该示例只是将数据送入寄存器和加法操作,这些是不能在屏幕上看出来的。程序执行完后,返回,屏幕再次出现提示符。2用DEBUG调试汇编语言程序当示例程序运行结果不对,需调试程序,查找原因。简单的错误我们可以返回重新编辑源程序,查看源文件,查找错误,修改文件。但若无法通过查看源文件找出错误,可在DEBUG下调试.EXE文件,找出错误之处,再返回重新编辑源程序。另外通过使用DEBUG来跟踪一个程序的运行,可以查看程序执行过程的中间运行结果,对于没有向显示器输出结果信息的程序,也可以利用DEBUG来查看最终结果。DEBUG可以将程序加载入内存,设置CS:IP指向程序的入口,CX中存放的是程序的长度。1.EXE中程序的机器码共有35个字节。所以1.EXE加载后,CX中的内容为0023H。可以用U命令查看已经加载的程序的指令。下面就可以用T命令单步执行程序中的每一条指令,并观察每条指令的执行结果,到了int 21,我们要用P命令执行。使用Q命令退出DEBUG,将返回到command中。3利用DEBUG学习伪操作在DEBUG下查看源程序时,发现.asm源文件指令中用符号表示的变量、标号、过程名等符号地址以及一些由汇编提供的操作符(如SEG,OFFSET等)均被一些确定的数值代替,从而说明,这些用符号表示的地址,经过汇编、连接及装入内存后,都有了具体的选择地址与之对应,其它的一些伪操作也都在程序执行前已经完成,通过对在DEBUG下查看源程序,对比.asm源文件,可以掌握伪操作的功能。例:有如下程序段,程序源文件名设为a.asm:经汇编、连接后,形成a.exe,在DEBUG下装入此文件,用U查看程序。;原为MOV AX,data;原为MOV SI,OFFSET string;原为MOV BL,string;以下是与程序部分无关的显示对照源程序a.asm,可知:(1) 定义的data段,在内存的段值为0C6CH;(2) 伪操作OFFSET的作用是取变量string的偏移地址,从汇编后操作数OFFSET string由string的偏移值0000代替可知;(3) 变量string是一个直接寻址的操作数,从程序中操作数string被操作数0000代替可知。(4) 用命令D查看0C6CH段的内容看到存放在内存的字符串How are you doing?,其后存放数值1234H,5678H,存放规则为低地址的内存单元放低字节数据,高地址的内存单元放高字节数据。(5) 用命令R查看当前各寄存器值当前DS的值为0C5CH,并不等于data对应的值0C6CH,此时DS的值为程序段前缀所在段值,故程序中若不给DS赋值,使 DS的值等于0C6CH,则指令MOV BL,0000中的操作数0000将不为0C6CH:0000H指向的值H,而是0C5CH:0H指向的值CDH。(6)对伪操作功能不清楚的地方,均可通过编写汇编语言程序,经汇编、连接后在DEBUG下对照查看来掌握。三、实验任务将下面的程序保存为t1.asm文件,将其生成可执行文件t1.exe,用DEBUG跟踪t1.exe的执行过程,写出各相关寄存器的内容。DATAS SEGMENT source_buffer db 40 dup(a) DATAS ENDSEXTRA SEGMENT dest_buffer db 40 dup(?)EXTRA ENDSCODES SEGMENTmain proc far ASSUME CS:CODES,DS:DATAS,ES:EXTRASTART: MOV AX,DATAS MOV DS,AX MOV AX,EXTRA MOV ES,AX lea si,source_buffer lea di,dest_buffer cld mov cx,40 rep movsb MOV AH,4CH INT 21Hmain endpCODES ENDS END START四、实验报告1跟踪t1.exe的执行过程,写出每一步执行后,各相关寄存器的内容。2针对实验目的做小结。实验四 顺序程序设计一、实验目的1、熟练掌握编写汇编语言源程序的基本方法和基本框架。2、学会编写顺序结构的汇编语言程序。3、掌握BCDASCII编码的转换的方法。二、实验任务1、设x、y、z为无符号字节变量,编写程序计算表达式r=(x+10)*y/(x+z)的值。2、编程将存储单元BCD中的压缩型BCD码拆成两个非压缩型BCD码,分别存入BCD1和BCD2中,并将其对应的ASCII码分别存入ASC1和ASC2单元中。三、实验说明1、在计算一个代数式(或表达式)的过程中,一般的解题方法是根据运算符的优先级顺序进行计算。在该表达式中:第一步 应计算x+10。在作加法运算时,其相加的结果可能不产生进位,也可能产生进位。因此当结果产生进位而不作处理时,可能会使运算的结果出错,所以在将两个字节相加以后,要将其进位位加到高8位上形成16位的相加结果。第二步 应将16位的相加结果与8位的y值相乘,而在乘法的运算指令中,两个运算数据的类型必须一致,所以应将y扩展成字,然后才能进行乘法运算实现(x+10)*y的计算。第三步 应计算x+z,第四步应实现(x+10)*y/(x+z)的计算。根据该设计思想,程序流程图如下图所示开始x+10ax(ax)*ydx:axx+zbxdx:ax/bxr结束 编写的程序清单如下:data segmentx db ?y db ?z db ?r dw 2 dup(0)data endscode segment assume cs:code,ds:data,ss:stackstart: push ds mov ax,0push axmov ax,stackmov ss,axmov ax,datamov ds,axmov al,xmov ah,0add ax,10mov bl,ymov bh,0mul bxmov cl,xmov ch,0add cl,zadc ch,0div cxmov r,axmov r+2,dxmov ax,4c00hint 21hcode endsend start2、计算机内部数据都是以二进制数形式表示。但是实际生活中习惯用十进制数。这样就产生了用四位二进制数表示一位十进制数的方法,这种用于表示十进制数的二进制代码称为二十进制代码(Binary Coded Decimal),简称为BCD码。它具有二进制数的形式,又具有十进制的特点(只有十种有效状态)。8086/8088指令系统把BCD码分为两种格式:压缩型和非压缩型。压缩型:一个字节表示两个BCD码,即两位十进制数:76543211BCD码(高位)BCD码(低位)非压缩型:一个字节的低四位表示一个BCD码,高四位通常为“0000”,它对这字节所表示的十进制数无影响,非压缩型的BCD码与对应的ASCII码刚好相差30H。76543211BCD码十进制数的BCD码与ASCII码的对照表:十进制数BCD码ASCII码0000030H1000131H2001032H3001133H4010034H5010135H6011036H7011137H8100038H9100139H四、实验报告1、对于任务一,用DEBUG调试可执行程序,记录r中的内容。 xyzr126863291158731212、任务二要求:(1)分析题目,画出流程图。(2)编写完整的汇编语言程序, 加上适量注释。(3)对程序结果进行分析,用DEBUG调试可执行程序。3、针对实验目的做小结实验五 分支程序设计一、实验目的1、掌握利用间接转移指令JMP BX实现多岔分枝的方法2、掌握十六进制数转换成ASCII码的方法。3、熟练掌握分支程序的设计方法。二、实验任务1、输出字母A、B、C、D、E、F、G、H的八个小程序的起始地址分别为L0、L1、L2、L3、L4、L5,L6,L7。编写程序实现如下功能:通过屏幕输入07之间的一个数,输入0时输出字母A 输入1时输出字母B 输入2时输出字母C 输入3时输出字母D输入4时输出字母E 输入5时输出字母F输入6时输出字母G输入7时输出字母H2、编程将DL中的一位十六进制数转换成ASCII码,并存入DH中。三、实验说明1、任务一是通过方式字实现多分支转移,通过键盘输入方式字(此处用到dos功能调用的1号功能调用),方式字的范围是07,方式字不同所转向的执行的程序段就不同。在此实验中除了方式字外,程序的数据段中还存放着一个转移地址表,其内容L1、L2L7是与方式字07对应的要处理程序的入口地址,L是这个地址表的首地址,程序从键盘输入方式字,并将这个值乘以2,然后与L相加形成转移操作的间接地址放入bx中,最后通过段内间接转移操作,转到相应的程序段。参考程序段如下:data segmentbuffer dbplease input number,it range is 07: $L dw L0,L1,L2,L3,L4,L5,L6,L7data endsstack segmentdb 100 dup (?)stack endscode segment assume cs:code,ds:data,es:data,ss:stackstart: push ds mov ax,0 push ax mov ax,data mov ds,ax mov ax,stack mov ss,ax mov bx,offset L mov dx,offset buffer mov ah,9 int 21h mov ah,1 int 21h and al,07h mov ah,0 add ax,ax add bx,ax jmp word ptrbxL0: mov dl,20h mov ah,2 int 21h mov dl,A mov ah,2 int 21h jmp eeddL1: L2: L3: L4: l5: L6: L7: eedd: mov ax,4c00h int 21hcode endsend start2、我们编制源程序时,常用十六进制数,如果从键盘输入数据,它又是ASCII码的形式。所以经常需要用程序将十六进制数和ASCII码相互转换。数字09,它的ASCII码的低四位与十六进制数相同,也正好是对应的二进制数。对于这一范围的数值(09)进行转换时只是对ASCII的高四位进行处理(去掉或加上)。而AF的ASCII码与十六进制数AF所表示的1015刚好相差37H(与af相差57H)。所以在处理十六进制数的AF的ASCII码时要适当校正。十六进制数的ASCII码与二进制数对照:十六进制数ASCII码二进制数030H0000131H0001232H0010333H0011434H0100535H0101636H0110737H0111838H1000939H1001A41 H1010B42 H1011C43H1100D44 H1101E45 H1110F46 H1111a61 H1010b62 H1011c63 H1100d64 H1101e65 H1110f66 H1111四、实验报告1、画出程序的流程图。2、补充完成任务一源程序, 加上适量注释。3、针对任务二编写完整的汇编语言程序, 加上适量注释。4、针对实验目的做小结。实验六 循环程序设计一、实验目的 1 熟悉循环结构的基本结构形式及各组成部分的功能。2 熟练掌握单重循环和多重循环程序设计的方法和技巧。3 熟练掌握循环控制的方法和技巧。二、实验任务1、调试如下程序代码,并说明该程序完成的功能是什么?data segment org $+20hbuf dw 10 dup(abcdefghijklmnopqrst)buf1 dw buf+10str db 20 dup(0)num equ 5x db 100data endscode segment assume cs:code,ds:datastart: push ds mov ax,0 push ax mov ax,data mov ds,ax mov si,buf1 lea di,str mov cx,num cmp x,0 jge L2 add si,cx add di,cx dec diL1: mov al,si Mov di,al Dec si Dec di Loop L1 Jmp RetdosL2: mov al,si Mov di,al Inc si Inc di Loop L2Retdos: mov ah,4ch Int 21hcode ends end start2、已知自BUFF单元开始存放着10个字符,统计其中大写字母,小写字母、数字字符及其他字符的个数。3、函数调用:实验内容:某采集系统采集的12个参数值存于BUFFER起始的缓存区中,要求预处理对第1,2,5,7,10各参数值调用函数1(Y=2X)处理,对第3,4,6,8,9,11,12各参数值调用函数2(Y=4X)处理,预处理后的结果保存在BLOCK起始的缓存区中。程序流程图如下图所示:参考程序代码如下所示:DATAS SEGMENT ;此处输入数据段代码 buffer dw 11,22,33,44,55,66,77,88,99,10,20,30 block dw 12 dup(?) count equ 12 logrul equ 0011010110110000b DATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AX ;此处输入代码据段代码 mov dx,logrul mov cx,count lea bx,buffer lea si,blockagain:mov ax,bxrcl dx,1jc anothcall fun1next:mov si,axinc bxinc bxinc siinc siloop againjmp next1anoth:call fun2jmp nextfun1 procadd ax,axretfun1 endpfun2 procadd ax,axadd ax,axretfun2 endpnext1: MOV AH,4CH INT 21HCODES ENDSEND START4.冒泡法排序(参教材172页)三、实验说明1、调试实验任务1程序代码,仔细分析程序运行结果,并在DEBUG下调试该程序查看各寄存器的情况,说明该程序完成的功能是什么。2、参照任务1完成任务2,编程思路:要将BUFF单元中存放的10个数依次与A,Z,a,z,0,9比较。3、由于分支条件不规则,可建立一个与要求相对应的逻辑尺(位串)来作为扩展控制条件。逻辑尺设为0011010110110000四、实验报告1、画出各程序流程图,列出程序清单,加上适量注释。2、记录实验结果。3、回答问题思考。4、针对实验目的做小结。 实验七 子程序设计一、实验目的1 掌握子程序的概念,熟练子程序的编制方法。2 掌握子程序中入口参数和出口参数的设计方法。3 熟悉过程调用伪指令: PROC,ENDP,NEAR和FAR。4 熟悉8088指令: CALL,RET。二、实验任务 1、调试并掌握完整汇编语言程序:设有10个学生的成绩分别是76,69,84,90,73,88,99,63,100,80分。试编制一个子程序统计6069分,7079分,8089分,9099分和100分的人数,分别存放到S6,S7,S8,S9和S10单元中。2、试编写一个得分程序:在以BUFF为首地址的存储区中已存放着10个0100之间的整数分数,要求去掉一个最高分和一个最低分,求出余下的8个分数值的平均分(取整数部分),存入AVER单元中。3.根据递归定义设计计算N!(N0)的程序:0! = 1N! = N*(N-1)!问题分析:递归调用每次调用所使用的参数都不相同。递归子程序的设计必须保证每次调用都不破坏以前调用时所用的参数和中间结果,所以一般把每次调用的参数、寄存器内容以及所有的中间结果都存放在堆栈中。把一次调用所保存的信息称为一帧,每次调用把一帧信息存入堆栈。递归子程序中还必须包括基数的设置,当调用参数达到基数时还必须有一条条件转移指令实现嵌套退出,保证能按反向次序退出并返回主程序。程序流程图如下图所示: 4.数据传送:实验内容:将指定数据区的数据搬移到另一数据区,并将搬移的数据显示在屏幕上。问题分析:源数据块和目标数据块在存储器中的位置可能有3种情况,如图所示。对于两个数据块分离的情况,数据传送既可以从数据块的首地址开始,又可以从数据块的末地址开始。但对于有部分重叠的情况,要加以分析,否则重叠部分会因搬移而遭到破坏。当源数据块首地址目的数据块首地址时,从数据块的首地址开始传送;当源数据块首地址目的数据块首地址时,从数据块的末地址开始传送。程序流程图:三、实验说明1、任务1程序代码data segmentrec dw 76,69,84,90,73,88,99,63,73,80s6 dw 0s7 dw 0s8 dw 0s9 dw 0s10 dw 0data endscode segmentmain proc far assume cs:code,ds:data push ds mov ax,0 push ax mov ax,data mov ds,ax mov cx,10call count retmain endp;count proc near mov si,0next: mov ax,recsi mov bx,10 div bl mov bl,al cbw sub bx,6 sal bx,1 inc s6bx add si,2 loop next retcount endpcode ends end main1、 调试实验任务1程序代码,并在DEBUG下调试该程序查看各寄存器的情况。2、 参照任务1完成任务2。3、 任务3程序代码:.model small.stack.datan dw 5result dw ?.code.startupmov ax,n ;N通过寄存器ax传递到子程序call fact ;调用求N!的子程序mov ax,result.exit 0fact proc cmp ax,0 jne l1 mov result,1 ;0!=1 jmp exitl1: push ax dec ax call fact pop ax mul result ;计算N*(N-1)! mov result,axexit:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年福建省泉州市晋江市农业农村局公开招聘1人模拟试卷及答案详解一套
- 2025园林会计面试题目及答案
- 2025江苏泰州市泰兴市医疗卫生事业单位招聘43人模拟试卷及答案详解(有一套)
- 2025年整形外科整容手术风险评估考核模拟考试卷答案及解析
- 2025年胃肠病学心理健康疾病干预方法评估试卷答案及解析
- 2025年肠胃病学诊断技能评估答案及解析
- 2025年儿科感染性疾病诊断与治疗专项考试答案及解析
- 2025年卫生管理学医疗机构安全管理试卷答案及解析
- 2025年精神病学病因分析与干预方法试题答案及解析
- 2025年眼科常见眼疾诊疗技术模拟考试卷答案及解析
- 湖南安全员c3考试试题及答案
- 2025年中学生心理健康测试题及答案
- 四川省高等教育自学考试自考毕业生登记表001汇编
- (2024版)初级茶叶加工工理论知识考试题库(含答案)
- 北京市-实验动物上岗证培训考试题库
- 不锈钢加工及安装合同集合
- 妊娠期高血压用药
- 第十三章泌尿男性疾病
- 我不是完美小孩
- 【超星尔雅学习通】海上丝绸之路网课章节答案
- 轻钢龙骨隔断墙施工合同协议书
评论
0/150
提交评论