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

下载本文档

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

文档简介

1、汇编语言实验指导书实验一Debug命令的使用 3实验二基本汇编指令的使用 7实验三汇编语言程序的调试与运行 10实验四系统功能调用程序的调试与运行 15实验五分支程序设计17实验六循环程序设计20实验七子程序设计23实验八高级汇编语言程序设计25实验九I/O程序设计30实验十中断程序设计 33实验十一综合程序设计38实验一 Debug 命令的使用知识点1、 DEBUG 简介DEBUG.EXE 是 DOS 提供的用于调试可执行程序的一个工具软件。在汇编语言程序调 试中很常用。DEBUG 的提示符是“ -”,所有 DEBUG 调试命令均在此提示符下输入。DEBUG 命令都是一个字母,后跟一个或多个

2、参数,也可使用默认参数。DEBUG 命令的使用注意问题:1)字母不分大小写2)只使用十六进制数,但没有带后缀字母“H”3)命令如果不符合 DEBUG 的规则,则将以“ error”提示,并以“人”指示出错位置。4)每个命令只有按下回车键后才有效,可以用Ctrl+Break 终止命令的执行。2、 Debug 的调入和退出以WIN2000环境为例,点击开始/运行”,在运行”对话框中输入命令: cmd,然 后点击“确定” ,进入 DOS 命令行状态:C:Documents and Settingslfy然后输入命令:Debug进入 Debug 调试状态, 出现 Debug 命令提示府“ -”,在此提

3、示符下可运行所需要的Debug命令了。退出 Debug 的命令: Q3、 Debug 常用命令(1)汇编命令 A ,格式为:- A 地址 功能:从指定地址开始允许输入汇编指令, 并将该指令汇编成机器指令代码从指定地址开始 存放。若不指定地址,则系统从默认的地址开始存放。按回车键退出汇编状态 应用:用于调试一条指令或几条指令组成的一个程序段。(2)显示和修改寄存器命令 R,格式为:- R 寄存器名 功能: 若指定寄存器, 则显示指定的寄存器的内容, 并可进行修改; 若不要修改, 则按 Enter 健。若未指定寄存器,则默认为显示所有寄存器的内容。应用:常用于通过寄存器的值查看指令的执行结果。(3

4、)内存单元内容的命令 E,格式为:- E 地址 内容表 功能: 若指定内容表,则用内容表中的内容代替指定地址开始的存储单元的值;否则,从指定地址开始逐个单元显示其内容, 并等待用户修改, 按空格键则继续显示下一单元的值, 按 回车键结束。例如:-E 100184E: 0100 89,78其中, 184E 时数据段的段地址, 0100 是要修改的单元的偏移地址, 89 为该单元的值, 78 为程序员键入的值。结果 0100 单元的值由 89H 改变为 78H 。 应用:常用于在调试程序的过程中改变变量的初始值。(4) 显示内存单元内容的命令 D,格式为:-D 地址或-D 范围 功能:前者为显示从

5、指定地址开始的一段存储单元的值; 后者为显示指定范围内的存储单元 的值。例如: - D 200;显示从 DS:200 单元开始的各单元的值- D 200 L10 ; 显示从 DS:200 单元开始的 10 个字节单元的值。 应用:常用于在调试过程中检查变量的值。( 5) 单步执行命令 T ,格式为:- T =地址 若未指定地址, 则执功能: 从指定地址执行一条指令后停下来,显示寄存器内容和状态值。 行当前指令的下一条指令。-U 地址 功能: 从制定地址开始, 编。若没有指定地址,则接着上一个6) 反汇编命令 U , 格式为:或 -U 范围反汇编 32 个字节, 或对指定范围内的主存内容进行反汇

6、U命令的最后一个单元开始;若还没有使用过U命令,则从当前 CS:IP 开始。例如:-U 100,1061343:0100 B803021343:0103 BB05401343:0106 01D8MOV AX,0203MOV BX,4005 ADD AX,BX其中,屏幕最左边是主存逻辑地址(段地址:偏移地址) ,中间是该指令的机器代码,右边 是对应指令的汇编语句格式。( 7)运行命令 G, 格式为:-G= 起始地址断点地址1,断点地址2,,断点地址 10功能:从等号后的起始地址开始运行,直到遇到断点或程序正常结束。例如:-G=100 106则程序执行从100开始的程序段,到断点 106停止。此时

7、指令 ADD AX,BX并未执行。实验目的及要求1、编语言调试环境 Debug的使用,重点掌握常用命令(A R D E T)的使用,其 他指令在以后的学习中逐步掌握。2、利用 Debug 命令,调试采用不同寻址方式的指令的执行结果,从实践中加深对寻址 方式和 MOV 指令的理解。三、实验内容1、Debug 程序的调入和退出2、Debug 常用调试命令的使用3、MOV 指令、 XCHG 指令、 XLAT 指令的调试四、实验步骤说明:首先输入以下程序段, 然后单步执行并查看结果; 改变寄存器AX的初始值后再运行, 并查 看结果。带下划线的部分为程序员输入的内容。在DEBUG环境下,所有的数据均以十

8、六进制输入和显示。-A137B:0100 mov ax,20137B:0103 mov bx,ax137B:0105 add ax,bx137B:0107 mov 2000,ax 137B:010A-T=0100AX=0020BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=137BES=137BSS=137BCS=137BIP=0103NV UP EI PL NZ NA PO NC137B:0103 89C3MOVBX,AX-T=0103AX=0020BX=0020CX=0000DX=0000SP=FFEEBP=0000SI=0000DI

9、=0000DS=137BES=137BSS=137BCS=137BIP=0105NV UP EI PL NZ NA PO NC137B:0105 01D8ADDAX,BX-TAX=0040BX=0020CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=137BES=137BSS=137BCS=137BIP=0107NV UP EI PL NZ NA PO NC137B:0107 A30020 MOV 2000,AXDS:2000=000-TAX=0040BX=0020CX=0000DX=0000 SP=FFEEBP=0000SI=0000DI=0000D

10、S=137BES=137BSS=137BCS=137BIP=010ANV UP EI PL NZ NA PO NC137B:010A 0000ADDBX+SI,ALDS:0020=FF-D 2000L2137B:200040 00;修改0100处的指令mov ax,20将AX的初始值改为10,并重新运行-A 0100137B:0100 mov ax, 10137B:0103;最后一条指令执行的结果如下:AX=0020BX=0010CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=137BES=137BSS=137BCS=137BIP=010ANV UP

11、EI PL NZ NA PO NC137B:010A 0000ADD;查看2000单元的值为 0020HBX+SI,ALDS:0010=DF-D 2000 12137B:200020 00;修改2000单元的值,由20h改为30h并重新显示-E 2000137B:200020.30-D 2000 12137B:200030 00五、拓展题MOV、XCHG、XLAT 指令的调试。要求:用汇编命令 A输入以下源程序段,用 T命令单步执行,查看执行结果:寄存器或存 储单元的值。提示:在DEBUG环境下输入程序段时要省掉立即数后面的字符“H”1、MOV指令的调试程序段:MOV AL, 55HMOV A

12、H, ALMOV BX, 1000HMOV BYTE PTRBX, 66HMOV WORD PTRBX+2, 77HMOV BX+4, AX2、 XCHG指令的调试程序段:MOV AX, 0203HMOV BX, 0405HXCHG AX, BXXCHG BL, BH3、 XLAT指令的调试 用E命令从 DS:200地址开始输入数据 10H、20H、30H、40H、50H(2)用A命令输入以下程序段:MOV BX, 200;将数据的首地址送给 BXMOV AL, 4用MOV ;将要查找的数据的偏移地址送给ALXLAT;查看结果寄存器 AL中的值,以及从 DS:200开始的存储单元的值。六、实验

13、报告写出在DEBUG状态下编写、运行程序段的过程以及调试所中遇到的问题是如何解决的, 对调试过程中的问题进行分析,对执行结果进行分析。实验二 基本汇编指令的使用一、知识点1、 最常用的传送指令 MOV可以将立即数 / 内存单元的值 /寄存器的值送给寄存器,或将立即数/寄存器的值送给内存单元,但不允许两个内存单元之间直接传送。2、 常用算术运算指令 ADD/ADC/INC 、 SUB/SBB/DEC/CMP/NEG 两个单字节 /单字之间的加法用 ADD 指令、减法用 SUB 指令; 多字节 /多字之间的加 /减,除最低字节 /最低字用 ADD/SUB 指令外,其余字节 /字之间的 加/ 减都要

14、用包含进位 /借位的 ADC/SBB 指令。INC 和 DEC 指令常用于修改计数器或修改指针,常用与循环处理一批数据。CMP 指令常用于比较两个数的关系, 为下一步的条件转移做准备 (后跟条件转移指令) 。3、 常用逻辑运算指令 AND/OR/NOT/XOR/TESTAND 指令常用于给一个数据的某几位清零;OR 指令常用于给一个数据的某几位置1;XOR 指令常用于将一个数据某几位翻转;NOT 指令常用于将一个数据所有位取反;TEST 指令常用于测试一各数据的某一位或某几位的值,后跟条件转移指令。4、常用移位指令 SHL/SHR/SAR/ROL/ROR/RCL/RCRSHL 和 SAL 功能

15、相同,都是将操作数左移一位或几位,移出的空位补0;SHR 和 SAR 功能不同,虽都是将操作数右移一位或几位,但左边移出的空位分别补 0 和 1( SHR 要补 0,SAR 补 1)。二、实验目的及要求1、继续熟悉汇编语言调试环境 Debug 的使用,掌握常用调试命令。2、用基本指令编写的程序段,并在 Debug 环境中调试,从实践中加深对基本汇编语言 指令的执行过程的理解。3、实验前要做好充分准备,包括汇编程序段清单、调试步骤、调试方法,以及对程序 结果的分析等。三、实验内容1、单步调试以下程序段,给出每条指令执行后AL 的值,以及 CF、ZF、SF、OF 的状态。MOV AL, 89HAD

16、D AL, ALADD AL, 9DHCMP AL, 0BCHSUB AL,ALDEC ALINC AL2、编写程序段,分别完成11223344H与55667788H的加/减计算,并调试、观察结果。3、单步调试以下程序段,给出每条指令执行后AL的值,以及CF、ZF、SF、OF的状态。MOVAX, 1470HMOVBX, 3060HANDAX, BXORAX, BXXORAX, AXNOTAXTESTAX,0F0F0H4、设(AX)=1234H,写出执行下列每条指令后AX寄存器的内容,并观察CF的变化。SHLAX, 1MOVCL, 2SHLAX, CLSHRAX, 1ROLAX, 1MOV CL

17、, 3ROL AX, CLRCR AX,1MOV CL, 2RCR AX, CL四、实验步骤1、利用DEBUG的A命令输入待调试的程序段。2、利用单步执行命令 T逐条执行指令,观察寄存器及相关状态位的值。 以实验内容2中的加法为例,实现加法运算:注:下划线部分为程序员输入的内容。(1)-A1373:0100 MOV AX, 3344;DX.AXDX.AX1373:0109 ADC DX, 55661373:010D-T=100AX=3344BX=0000CX=0000DX=0000 SP=FFEE BP=0000SI=0000DI=0000DS=1373ES=1373SS=1373 CS=13

18、73IP=0103 NV UP EI PL NZ NA PO NC1373:0103 BA2211MOV DX,1122-TAX=3344BX=OOOOcx=ooooDX=1122SP=FFEE BP=0000SI=0000DI=OOOODS=1373ES=1373SS=1373 CS=1373IP=0106NV UP EI PL NZ NA PO NC1373:0106 058877ADDAX,7788-TAX=AACCBX=0000CX=0000DX=1122SP=FFEE BP=0000SI=0000DI=0000DS=1373ES=1373SS=1373 CS=1373IP=0109O

19、V UP EI NG NZ NA PE NC1373:0109 81D26655ADCDX,5566-TAX=AACCBX=0000CX=0000DX=6688SP=FFEE BP=0000SI=0000DI=0000DS=1373ES=1373SS=1373 CS=1373IP=010DNV UP EI PL NZ NA PE NC1373:010D 0000ADDBX+SI,ALDS:;结果:DX.AX=6688AACCH五、拓展题:1、编写程序段:将2、编写程序段:将其余位不变。设3、设 AX=2AHDX.AX中的双字右移一位。3位清0,第7、& 9位取反,,并将结果送BX.CX。AX寄

20、存器的最低4位置1,最高AX中原来的值为 0AAH。BX=30H,编写程序段计算:AX/BX六、实验报告:1、写出源程序段清单、程序说明、执行结果。2、 调试说明。包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的, 并对调试过程中的问题进行分析,对执行结果进行分析。实验三 汇编语言程序的调试与运行知识点1、汇编语言源程序的格式完整的汇编语言源程序由段组成,即代码段、数据段、附加段和堆栈段。其中,需要独 立运行的程序必须包含一个代码段, 并指示程序执行的起始点, 一个程序只有一个起始点。例如,输出一个字符串的源程序;定义程序的存储模式(小型程序一般采用小模式);定义堆栈段;定义数据

21、段.IIIUUUIbllldll.stack.datastringdb An example. ,0ah,0dh,$ ;在数据段中定义要显示的字符串.code;定义代码段.startup;程序的起始点lea dx, string;将字符串的起始地址送dx,即设置入口参数mov ah, 09h;设置输出字符串的功能调用号int 21h; 功能调用:显示.exit 0; 程序结束点,返回 dosend; 汇编结束注:这是简化段定义的程序格式2、汇编语言程序的开发过程 一般步骤:编辑、编译、连接、调试运行( 1) 源程序的编辑 源程序文件可以利用任一文本编辑器进行编辑,通常我们用“记事本” 源程序文

22、件保存时,一般以 .asm 为文件的后缀名。 具体实现:如图masm?J x|另存为我的文档保存在也:我的电脑网丄&居K ELTB豐mleampl t. asm保存氓)取涓AHL;Z在win2000环境下,在另存为”界面中输入文件全名(example.asm),并且将保存类型“选择为“所有文件”。也可以使用.txt后缀名,不过在汇编时要写源文件的全名,否则系统默认的为.asm。(2)源程序的汇编、连接汇编是将源程序翻译成由机器代码组成的目标模块文件的过程。连接程序将一个或多个目标文件和库文件合成一个可执行文件。MASM6.X提供的 ML.EXE可以实现:先汇编,若没有错误则自动调用LINK.E

23、XE 连接程序进行编译;若有错,则提示错误信息,可利用列表文件查看错误所在位置,并改正错误,重新汇编和连接。例如,设上面的例题程序文件为EXAMPLE.ASM,并且该文件与 ML.EXE等文件都在同一目录(设该目录为当前目录)下,则汇编、连接的命令为:ML EXAMPLE.ASM运行结果见实验步骤 2。产生:EXAMPLE.OBJ 和 EXAMPLE.EXE 文件特别说明:ML允许汇编和连接多个程序形成一个可执行文件,而且还可以带参数,格式:ML /参数选项文件列表常用参数选项有:/c 只汇编源程序,不进行自动连接(注意用小写字母c)/Fl文件名一一创建一个汇编列表文件(扩展名LST),用于查

24、找错误。Sg 在省城的列表文件中,列出由汇编程序产生的指令例如:若将字符串的引号改为中文的“后重新用下面命令汇编连接,则结果见实验步骤3。ML /Fl EXAMPLE.ASM(3)可执行程序的调试在操作系统提示符下直接输入柯执行文件名即可运行:EXAMPLE当出现运行错误时,通常用DEBUG进行调试:DEBUG EXAMPLE.EXE然后采用 U 命令进行反汇编,用 T 或 G 命令运行并观察,找出错误所在。二实验目的及要求1掌握数据定义、段定义的方法2熟悉在 PC 机上编辑、汇编、连接、调试和运行汇编语言程序的过程。3、熟悉常见 Jcc 指令、 loop 指令的使用。三实验内容编程实现:1、

25、求数组 array 中的 20 个字元素的和, 并存入变量 total 中。其中, 数组元素在定义数 组时以初值的形式给出。2、给DX送一个初值,然后判断:若DX的高4位全为0,则使AX=0 ;否则使AX=-1。3、 定义一个字符串string,包含若干字符并且以结尾,用程序统计字符的个数。四、实验步骤以实验内容 1 为例,介绍实验步骤:1 、 编辑源程序:在记事本中输入如下程序,并存在 E:MASM6BINEXAM1.ASM 中。2、汇编、编译:情况 1:没有错误ml example.asmObject Modules .obj: example.objRun File example.ex

26、e: example.exeList File nul.map: NULLibraries .lib:Definitions File nul.def:产生: EXAMPLE.OBJ 和 EXAMPLE.EXE 文件情况 2:源程序中有错误,比如将字符串的引号改为中文的“ ”后重新用下面命令汇 编连接。ML /Fl EXAMPLE.ASMMicrosoft (R) Macro Assembler Version 6.11Copyright (C) Microsoft Corp 1981-1993. All rights reserved.Assembling: example.asmexamp

27、le.asm(5): error A2044: invalid character in fileexample.asm(8): error A2006: undefined symbol : string则给出 2 条错误信息提示,并产生错误列表文件 EXAMPLE.LST 在记事本中打开该文件,内容如下:;输出一个字符串的源程序:.model small.stack.datastring db An example.,0ah,0dh,$example.asm(5): error A2044: invalid character in file.code;定义代码段.startup; 程序的

28、起始点lea dx, stringexample.asm(8): error A2006: undefined symbol : stringmov ah, 09hint 21h ; 功能调用:显示.exit 0;程序结束点, 返回 dosend; 汇编结束特别提示:两处错误明显的标在源程序中。实际上, 只有一处错误, 后面的错误是由于前面的错误引起的, 所以改正错误时要从前 往后逐个修改,并且每改完一处就重新存盘、汇编,以提高调试效率。3、调试:C:masmdebug example.exe-u;反汇编1395:0000 BA9713MOVDX,13971395:0003 8EDAMOVDS

29、,DX1395:0005 8CD3MOVBX,SS1395:0007 2BDASUBBX,DX1395:0009 D1E3SHLBX,11395:000B D1E3SHLBX,11395:000D D1E3SHLBX,11395:000F D1E3SHLBX,11395:0011 FACLI1395:0012 8ED2MOVSS,DX1395:0014 03E3ADDSP,BX1395:0016 FBSTI1395:0017 8D160400LEADX,0004;源程序中的第一条指令1395:001B B409MOVAH,091395:001D CD21INT211395:001F B8004

30、CMOVAX,4C00;对应 .exit 0 指令-u1395:0022 CD21INT21此时可用 debug 命令调试该程序了。4、 关于变量名对应的偏移地址 源程序的第一条指令是: lea dx, string 汇编后对应的指令是: LEA DX,0004 因此,可看出变量 string 所对应的偏移地址是: 0004h 如果要查看从 string 开始的字符串的内容,可用如下命令:-D 04 Lc即查看从 04H 开始的 12 个单元的内容。五、拓展题1、有两个 64 位数值,按“小端方式“存放在两个缓冲区 buffer1 和 buffer2 种,计算 buffer1-buffer2

31、,并将结果存放到变量 result 中。2、将 DX.AX 中的双字右移 4 位。六、实验报告1、写出源程序清单、程序说明、执行结果。2、调试说明。包括上机调试的情况、 上机调试步骤、调试所遇到的问题是如何解决的, 并对调试过程中的问题进行分析,对执行结果进行分析。实验四 系统功能调用程序的调试与运行一、知识点1、常用字符 /字符串输入 /出系统功能调用MOV AH, 02H;设置功能调用号 AH-02HMOV DL,;设置入口参数 DL- 待显示的字符的 ASCII 码INT 21H ;DOS 功能调用:显示(2) 输入一个字符:DOS功能调用INT 21H的02号功能调用使用格式:MOV

32、AH, 01H; 设置功能调用号 AH-01H1 ) 输出一个字符:DOS功能调用INT 21H的02号功能调用使用格式:INT 21H;DOS 功能调用:显示出口参数: AL= 字符的 ASCII 码说明:执行此功能时,等待用户按键,然后读取按键值。3) 输出一个字符串:DOS 功能调用 INT 21H 的 09号功能调用使用格式:MOVAH, 09H;设置功能调用号AH-09HLEADX, STRING;设置入口参数DX- 待显示的字符串的首地址INT21H;DOS 功能调用:显示说明:字符串必须以$结束;入口参数 DS:DX= 待显示的字符串的首地址(段地址:偏移地址)(4)输入一个字符

33、串:DOS功能调用INT 21H的0A号功能调用,将键盘输入的字符串送入指定的缓冲区。入口参数 DS:DX= 待显示的字符串的首地址(段地址:偏移地址) 使用该功能前,首先要定义接受字符串的缓冲区,格式:BUFFER DB81;定义缓冲区,以及可能输入的最大字符数DB0;该字节用于存放实际输入的字符的个数DB81 DUP(0) ; 该区域用于存放输入的字符串,初值设为使用格式:MOVAH, 0AH; 设置功能调用号 AH0 、 AX0 、 AX=0 三种情况,分别确定一个数据(假设 AX 分别取 5、 -2、 0 三个数据)。其中, 0 就是一个介于条件成立与不成立之间的边界 数据。具体操作:

34、在 DEBUG 环境下,用 R 命令改变 AX 的值,调试,分析程序流程和结果。 ( 2)多分支结构的测试:比如,实验内容第3 题的多分支结构的测试:则至少要对每一种情况设计一个测试用例, 即19中的一个数、 az中的一个字符、 AZ中的一个字符、回车符、其他字符, 然后设计边界测试用例1、9、A、Z、a、z,共11个测试数据。具体操作:当测试数据需要从键盘输入时,可在在 MS -DO环境下逐个使用测试数据运 行;当测试数据是程序中某个变量或寄存器的值时,可在 DEBU环境下,利用R或E命令 用测试数据修改寄存器或变量的值,然后运行。二、实验目的及要求1、掌握分支程序的结构。2、掌握分支程序的

35、设计、调试方法。3、实验前要做好充分准备,包括流程图、汇编程序清单、调试步骤、调试方法,以及 对程序结果的分析等。4、编程时先画流程图,培养结构化程序设计的思想;调试前根据程序结构设计测试用 例,逐步掌握程序测试方法。三、实验内容1、编写一个程序,显示 AL寄存器中的两位十六进制数。2、 编写一个程序,把变量bufX和bufY中较大者存入bufZ ;若两者相等,则把其中之 一存入 bufZ 中。假设变量中存放的是 8 位无符号数。3、编写一个程序, 判别键盘上输入的字符; 若是 1-9 字符,则显示之; 若为 A-Z 或 a-z 字符,均显示“ c”;若是回车字符其ASCII码为0DH),则结

36、束程序,若为其 它字符则不显示,继续等待新的字符输入。四、实验步骤1 、用记事本编写 .ASM 源程序。2、对源程序进行汇编及连接,产生 .EXE 文件、 .LST 文件。3、在DEBU环境下调试:(1)用DEBU命令 U反汇编,用T单步执行,查看程序的流程及每一步的执行结果。(2)用R命令修改AL寄存器的内容,重新运行第一题的程序,分析结果。(3)用E命令修改变量bufX和bufY的值,重新单步执行第二题的程序,分析程序的流 程及运行结果。(4) 反复调试运行第三题的程序,分别输入:19中的一个数、az中的一个字符、A Z中的一个字符、回车符、其他字符,分析并记录每次的输入数据与执行结果。4

37、、在MS-DO下直接运行.EXE文件a. 对第1题、第2题的程序直接在dos提示符下直接运行,查看结果。b. 对第3题,分别输入不同的字符,分别记录结果。5、调试技巧:(1) 对于需要从键盘输入数据的情况,可直接在 MS -DO下调试,当每个测试用例都测试完成后并且没有错误,则程序调试完毕;若有错误,则进入DEBUS步调试。(2) 对于需要在程序中设定变量的值的程序,在 DEBU下直接改变变量的值再调试, 效率比较高,省去了在源程序中改变变量的值后要重新编译、连接的过程。(3) 在DEBU下如果要查看程序的运行结果,必须执行以下到指令处停止:MOV AX, 4C00HINT 21这是源程序中伪

38、指令“ .EXIT 0 ”汇编后的对应指令。此时程序的功能已经执行完毕,但还未结束并返回 MS -DO状态。当程序结束并返回MS- DO状态后,原来程序中的变量等对应的空间已经不存在了。五、编程提示1、显示AL寄存器中的两位十六进制数:(1) 首先显示高 4 位对应的十六进制数,然后显示第 4位对应的十六进制数。(2) 分离高 4位和低 4位,分别用 AL 和 BL 保存:MOV BL, ALAND AL, 0F0HMOV CL, 4SHR AL, CLAND BL, 0FH(3) AL 中数字到字符的转换:若为 09 的数字,则加 0或 48即可;否则 为AF的数字,需要加 55,比如数字

39、A对应的字符的ASCII码为65。CMP AL, 9JA CHADD AL, 0JMP DISPCH:ADD AL, 55DISP: MOV AH, 02H;显示MOV DL, ALINT 21H说明:因为AL中的数据已经在 0F之间,所以判断是否为数字 09时只要与9比较即 可。实验六 循环程序设计一、知识点1、常用循环结构的汇编语言实现(1) 对于确定循环次数的循环结构,一般使用LOOP指令构成循环,LOOP旨令中的标号位循环体的起始位置。但在循环之前要将循环次数送CX。(2) 对于循环次数不定的循环结构,一般用 Jcc 指令与标号一起构成循环。(3) 循环结构的汇编语言程序一般包含三部分

40、,即循环初始部分循环之前准备相应的条件,如循环次数、相关变量/ 寄存器赋初值等; 循环体重复执行的程序代码,其中包含改变与循环条件有关的值; 循环控制部分判断循环条件,决定是否继续循环。2、循环程序的测试技巧单步调试与分段调试结合: 即对循环体内部的程序段的测试用单步执行的方法,执行12 遍循环体,观察并分析每一步的结果及程序流程;对于整个循环体程序段的测试,一般用G命令分段调试,通过结果判断循环体的正确程度。(祥见后面的实验步骤)二、实验目的及要求(1) 掌握循环程序的设计方法(2) 进一步熟悉利用 DEBUGS序修改参数的方法,并检查和验证结果的正确性。(3) 学会针对不同的问题,选用不同

41、的循环结构的方法。( 4)编程前画出流程图,培养结构化程序设计思想。三、实验内容1、 编程实现把键入的一个字符,用二进制形式(0/1 )显示它的 ASCII 代码值。2、编写程序,将一个包含有 20 个有符号数据的数组 ARRAYM 分成两个数组:正数数组 ARRAYP 和负数数组 ARRAYN 。设数据均为 8 位。3、在程序中定义两个字符串 STRINGA 和 STRINGB ,比较两个字符串是否相等。若 相等,输出 0,否则输出字符 1 。四、实验步骤1、用记事本编写 .ASM 源程序。2、对源程序进行汇编及连接,产生 .EXE 文件、 .LST 文件。3、在DEBU环境下调试:(1)

42、用DEBU命令 U反汇编,用T单步执行2边循环体,查看程序的流程及每一步的执行 结果。(2) 用G命令分段执行,将循环体作为一个段一次执行完,查看分段执行的结果并分 析。(3) 用U命令反汇编时,查看各个变量对应的偏移地址并记录,以便在调试过程中显 示变量所对应的存储单元的值。(4) 运行前,用D命令查看三个数组中的数据存放情况。运行至指令: MOV AX, 4C00H 处,再查看程序执行后三个数组的存放情况。假设数组ARRAYM的首地址为300H,则查看该数组的命令为:-D 300 L14(4) 对第 1题、第 3题的程序直接在 MS-DOS 提示符下直接运行,查看结果。 对第 1题,分别输

43、入不同的字符,分别记录结果。五、编程提示1、 键入一个字符:MOV AH, 01HINT 21H显示该字符的 ASCII 码:用循环实现,每循环一次,将 AL 循环左移一位,根据标 志位 CF 的值( 0/1) ,确定输出字符 0/1。MOV CX, 8NEXT:ROL AL, 1JC OUT1 MOV DL, 0 JMP DISPOUT1:MOV DL, 1DISP:MOV AH, 02HINT 21H LOOP NEXT2、循环处理数组 ARRAYM 中的每一个数据:取出该数据,测试其正负,若为正数,则存入 ARRAYP 中,否则存入ARRAYN 中。主要程序段:LEA SI, ARRAY

44、M LEA DI, ARRAYP LEA BX, ARRAYNMOV CX, 20CLDGO_ON:LODSB;取出一个数据送 ALCMP AL, 0;与 0 比较,判断正负JL MINUS;是负数,转 MINUS ,将其存入 ARRAYN 中JE AGAIN;是 0 ,不作处理STOSB;是正数,存入 ARRAYP 中JMP AGAINMINUS:MOV BX, ALINC BXAGAIN:LOOP GO_ON3、 比较两个字符串是否相等,可用加重复前缀的串操作指令实现:REPZ CMPSB 当循环结束时,根据标志位 ZF 即可判断量字符串是否相等(若ZF=1 ,则相等;否则不相等)。六、拓

45、展题1、 从键盘任意输入两个字符串 STRA 和 STRB ,比较两个字符串,若 STRASTRB , 则输出字符 1;若相等,则输出字符 0;否则输出字符 -1。2、先提示输入数字“ Input Number :09 ”,然后在下一行显示输出该数字,结束;如果输入的不是 09 的数字,就提示错误“ Error !”,继续等待输入数字。实验七 子程序设计一、知识点1、 子程序: 功能相对独立的程序段, 可以单独编写和调试, 可以作为一个相对独立的模块其他程序 调用。使用子程序的目的是实现源程序的模块化, 简化员程序结构, 提高模块的复用程度, 从 而提高编程效率。2、 子程序的定义:过程名 P

46、ROC NEAR/FAR过程体过程名 END提示 1:在过程设计中,要特别注意寄存器的保护与恢复。一般的,在过程体开始之前, 将过程中要用到的寄存器(参数寄存器除外)压栈保存;在过程体最后要返回调用程序前, 要将前面压栈的寄存器逆序弹出。提示 2: 在设计子程序时,首先要根据子程序的功能确定子程序的入口参数和出口参数。3、子程序的调用与返回 过程调用指令: CALL 子程序名 提示:在调用之前要线准备好子程序的入口参数 过程返回指令: RET二、实验目的及要求1掌握子程序设计的方法 2掌握子程序的调用与返回的方法 3掌握子程序调用过程中参数的传递方法 4要求:实验之前准备好程序流程图、程序清单

47、、测试用例,实验后将测试过程整理 成实验报告。三、实验内容1、编写子程序 DTOB :把用 ASCII 码表示的两位十进制数转换成对应的二进制数。 入口参数: DH= 十位数的 ASCII 码, DL= 个位数的 ASCII 码 出口参数: AL= 对应的二进制数2、 编写子程序 DISPB :以二进制形式显示 AL 中的数据。 参照实验六第 1题 3、编写主程序:从键盘输入两位十进制数,调用子程序DTOB 进行转换,然后调用子程序 DISPB 显示转换后的结果。四、实验步骤1、 编写源程序,子程序与主程序在一个文件内,程序结构如下:.MODEL SMALL.STACK.DATA.CODE.S

48、TARTUP;输入两个十进制数字符,分别将其ASCII 码存入 DH 、DLCALL DTOBCALL DISPB.EXIT 0;子程序 DTOB 的定义;子程序 DISPB 的定义END2、编译、连接、运行。若结果有错,则用DEBUG 进行分段和单步调试。3、编程提示:(1)子程序均采用最常用的参数传递方法:用寄存器传递参数(2)输入两位十进制字符: 比如 24,通过系统功能调用 INT 21H 的 1 号功能调 用实现,将读取的两个字符的 ASCII 码分别存入 DH 和 DL 。(3)子程序 DTOB 中数据转换方法: AL= (DH- 0)*10+(DL- 0)五、拓展题1、编写子程序: 将一个 16 位二进制数用十六进制形式在屏幕上显示出来。用 AX 寄存器作为入口参数。编写主程序,分别读取数组 ARRAY 中的 10 个数据 (16 位 ),并以十六进制的形式显示 在屏幕上。2、编写以下子程序: 根据入口参

温馨提示

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

评论

0/150

提交评论