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

下载本文档

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

文档简介

汇编语言实验指导书实验环境:1.硬件:PC微机2.软件:DOS系统、EDIT.EXE、MASM.EXE、LINK.EXE、DEBUG.EXE注:DOS系统(WINDOWS下的虚拟8086方式)上机注意事项●进入”命令提示符(DOS空间)”有多种方法:1.通过附件进入:命令提示符↓2.“开始”→“运行”→敲入命令“cmd”;3.键盘wir+r→敲入命令“cmd”●dos命令窗口大小调整办法:在DOS窗口标题栏上点击右键,选择“属性”,在“布局”标签页中修改“窗口大小”设置。●常用DOS命令:回根目录命令:cd..↓cd\↓(一次退到根)转到D盘命令:D:↓看D盘目录命令:D:\>dir↓进入文件夹命令:cdxxx↓●用编辑软件输入完整的汇编语言源文件,在Windows系统下用记事本即可;在DOS系统下用EDIT软件编辑。要求编辑完成的文件扩展名一定是.asm实验一DEBUG命令实验一.实验目的:熟悉DEBUG程序和命令,并用它运行基本指令和察看运行结果。eq\o\ac(○,1)怎样调用Debug②如何显示和修改内存单元③如何显示和修改CPU的寄存器④各标志位的状态是如何表示的,怎样修改标志寄存器⑤怎样汇编与反汇编⑥怎样执行程序⑦怎样跟踪程序⑧怎样退出Debug二.实验内容:DEBUG是专门为汇编语言设计的一种调试工具,它通过步进,设置断点等方式为汇编语言程序员提供了非常有效的调试手段。1、DEBUG程序的启动DEBUG的命令格式:[drive:][path]DEBUG[d:][p][filename][.ext][param...]其中:drive:

是指定DEBUG文件的磁盘驱动器标识符,DEBUG是外部DOS命令,所以必须把它从磁盘读入内存。若未指定,DOS将使用当前默认磁盘驱动器。path:

是DOS查找DEBUG文件的一个子目录串表示的路径。若未指定,DOS将使用当前工作目录。d:

是DEBUG将要调试的文件所在的磁盘驱动器。p:

是查找DEBUG将要调试的文件所需的子目录路径,若未指定,DOS使用当前目录。filename[.ext]是DEBUG将要调试的文件名。param

是将被调试的程序(或文件)的命令行参数。例如:debug.exe就在C盘根目录下,在DOS提示符下,可键入命令:C:\>debug进入DEBUG控制状态,显示提示符'-'DEBUG所完成的初始化动作:段寄存器CS、DS、ES和SS置为DEBUG程序后的第一个段。指令指针寄存器IP置为100H(程序段前缀PSP后的第一个语句)。(256字节为PSP数据区,DOS利用SPS与被加载程序进行通信)堆栈指针SP置为段末或COMMAND.COM暂驻部分的结束地址(其中较小的那个地址)。其余通用寄存器均置为0,标志寄存器置为下述状态。NV

UP

EI

PL

NE

NA

PO

NC标志名置位复位溢出Overflow(是/否)OVNV方向Direction(减量/增量)DNUP中断Interrupt(允许/屏蔽)EIDI符号Sign(负/正)NGPL零Zero(是/否)ZRNZ辅助进位AuxiliaryCarry(是/否)ACNA奇偶Parity(偶/奇)PEPO进位Carry(是/否)CYNC注:nv(清除)ov(溢出)方向dn(减)up(增)中断ei(启用)di(禁用)正负ng(负)pl(正)零zr(0)nz(非0)辅助进位ac(进位)na(不进位)奇偶校验pe(偶校验)po(奇校验)进位cy(进位)nc(不进位))2、DEBUG的主要命令(注意:地址和数据的默认单位“16进制”,不用写“H”)汇编命令A,格式为:-A[地址]该命令从指定地址开始允许输入汇编语句,把它们汇编成机器代码相继存放在从指定地址开始的存储器中。如无“地址”选项,则从默认地址开始。例如:-a136B:0100movax,100136B:0103movbx,200136B:0106movcx,300

136B:0109movdx,400136B:010Caddax,bx136B:010Esubax,cx136B:0111-反汇编命令U,有两种格式:1)-U[地址]该命令从指定地址开始,反汇编32个字节,若地址省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。例如:-u13C9:00001EPUSH DS13C9:00012BC0SUB AX,AX13C9:000350PUSH AX13C9:0004B8C313MOV AX,13C313C9:00078ED8MOV DS,AX13C9:0009B8C613MOV AX,13C613C9:000C8EC0MOV ES,AX13C9:000E8D360000LEA SI,[0000]13C9:00128D3E0000LEA DI,[0000]13C9:0016FCCLD 13C9:0017B92800MOV CX,002813C9:001AF3REPZ 13C9:001BA4MOVSB 13C9:001CCBRETF 13C9:001D0000ADD [BX+SI],AL13C9:001F0000ADD [BX+SI],AL2)-U范围该命令对指定范围的内存单元进行反汇编,例如:-u13c9:000e001b13C9:000E8D360000LEA SI,[0000]13C9:00128D3E0000LEA DI,[0000]13C9:0016FCCLD 13C9:0017B92800MOV CX,002813C9:001AF3REPZ 13C9:001BA4MOVSB -运行命令G,格式为:-G[=地址1][地址2]其中地址1规定了运行起始地址,地址2为断点地址。没有“=地址1”则从默认地址0100H开始。即:-G[断点地址]程序从当前地址0100H开始连续运行到断点地址。追踪命令T,有两种格式:1)逐条指令追踪:-T[=地址]该命令从指定地址起执行一条指令后停下来,显示寄存器内容和状态值。无地址则从当前默认地址开始。-tAX=0000BX=0000CX=007DDX=0000SP=FFFEBP=0000SI=0000DI=0000DS=13B3ES=13B3SS=13C3CS=13C9IP=0001NVUPEIPLNZNAPONC13C9:00012BC0SUB AX,AX-2)多条指令追踪:-T[=地址][值]该命令从指定地址起执行n条命令后停下来,n由[值]确定。-t3AX=0000BX=0000CX=007DDX=0000SP=FFFEBP=0000SI=0000DI=0000DS=13B3ES=13B3SS=13C3CS=13C9IP=0001NVUPEIPLNZNAPONC13C9:00012BC0SUB AX,AXAX=0000BX=0000CX=007DDX=0000SP=FFFEBP=0000SI=0000DI=0000DS=13B3ES=13B3SS=13C3CS=13C9IP=0003NVUPEIPLZRNAPENC13C9:000350PUSH AXAX=0000BX=0000CX=007DDX=0000SP=FFFCBP=0000SI=0000DI=0000DS=13B3ES=13B3SS=13C3CS=13C9IP=0004NVUPEIPLZRNAPENC13C9:0004B8C313MOV AX,13C3显示内存单元内容的命令D,格式为:-D[地址]-d13c3:000013C3:00006161616161616161-6161616161616161aaaaaaaaaaaaaaaa13C3:00106161616161616161-6161616161616161aaaaaaaaaaaaaaaa13C3:00206161616161616161-0000000000000000aaaaaaaa13C3:00306161616161616161-6161616161616161aaaaaaaaaaaaaaaa13C3:00406161616161616161-6161616161616161aaaaaaaaaaaaaaaa13C3:00506161616161616161-0000000000000000aaaaaaaa13C3:00601E2BC050B8C3138E-D8B8C6138EC08D36.+.P613C3:007000008D3E0000FCB9-2800F3A4CB000000...>(-修改内存单元内容的命令E,它有两种格式:1)用给定的内容代替指定范围的单元内容: -E地址内容表 例如:-E2000:0100F3“XYZ”8D其中F3,“X”“Y”“Z”和8D各占一个字节,用这五个字节代替原内存单元2000:0100到0104的内容,“X”“Y”“Z”将分别按它们的ASCII码值代入。2)逐个单元相继地修改: -E地址 例如:-E100: 18E4:010089.78 此命令是将原100号单元的内容89改为78。78是程序员键入的。检查和修改寄存器内容的命令R,它有三种方式:1)显示CPU内部所有寄存器内容和标志位状态;格式为:-R R命令显示中标志位状态的含义如下表所示:标志名置位复位溢出Overflow(是/否)OVNV方向Direction(减量/增量)DNUP中断Interrupt(允许/屏蔽)EIDI符号Sign(负/正)NGPL零Zero(是/否)ZRNZ辅助进位AuxiliaryCarry(是/否)ACNA奇偶Parity(偶/奇)PEPO进位Carry(是/否)CYNC2)显示和修改某个指定寄存器内容,格式为: -R寄存器名 例如打入:-RAX 系统将响应如下: AXFIF4 : 表示AX当前内容为F1F4,此时若不对其作修改,可按ENTER键,否则,打入修改后内容,如: -RBX BX0369 :059F 则BX内容由0369改为059F3)显示和修改标志位状态,命令格式为: -RF 系统将给出响应,如 OVDNEINGZRACPECY- 这时若不作修改可按ENTER键,否则在“-”号之后键入修改值,键入顺序任意。如 OVDNEINGZRACPECY-PONZDINV(8)退出DEBUG命令Q,该命令格式为 -Q 它退出DEBUG程序,返回DOS。三.实验要求:反复练习熟悉DEBUG各种命令:A命令、U命令、G命令、T命令、R命令、Q命令等等。四.实验报告:写出在DEBUG状态下编写、运行程序的过程以及调试所中遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。实验二算术运算指令实验一、实验目的1、算术指令的格式、功能及用法。2、熟悉二进制数的四则运算指令,掌握各种运算指令的格式、用法、寻址方式和对标志位的影响,特别是对溢出标志位CF和OF的影响。二、实验内容1、用加减法指令计算下列各组十六进制数加减结果并和你的手算结果比较:(1)34H,22H (2)56H,78H (3)A5,79H (4)1284H,5678H (5)A758H,347FH用R命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内容。用R命令将AX,BX内容改写为1050H及23A8H。 2、加减法指令: 1)用A命令在内存100H(键入:A100,a与100之间有无空格都行)处键入下列内容: MOV AH,34 MOV AL,22 ADD AL,AH SUB AL,78 MOV CX,1284 MOV DX,5678 ADD CX,DX SUB CX,AX SUB CX,CX 2)用U命令检查键入的程序及对应的机器码。 3)用T命令逐条运行这些指令,检查并记录有关寄存器及ZF情况。3、带进位加减法: 1)用A命令在内存200H处键入下列内容,并用U命令检查: MOV AH,12 MOV AL,84 MOV CH,56 MOV CL,78 ADD AL,CL ADC AH,CH MOV DH,A7 MOV DL,58 SUB DL,7F SBB DH,342)用T命令逐条运行这些指令,检查并记录有寄存器及CF内容。 3)上面这段程序若改用16位操作指令达到同样结果,怎么改?试修改并运行之。4、BCD码加减法 1)内容: MOV AL,58 ADD AL,25 DAA 2)要求:用A命令键入,U命令检查,T命令逐条运行并记录有关寄存器及AF内容。5、自编程序用16位减法指令编一个32位(4字节)数减法程序,调试并做记录。三、实验报告要求:1、十六进制数加减法手算结果及实验结果2、8086常用指令练习部分的逐条运行记录,思考结果及自编程序运行记录(列出自编程序)。3、各项实验结果记录。4、自编程序原稿及调试后修正稿,写出原稿错在那里。实验三串处理指令实验一、实验目的熟悉串处理指令二、实验内容及步骤1、分析、理解、跟踪执行下列程序。 movsi,2000 movdi,3000 movcx,000a repmovsb hlt2、数据串搬家程序:1)用A命令键入下列程序:MOV SI,1000MOV DI,1500MOV CX,0FLOP:MOV AL,[SI]MOV [DI],ALINC SIINC DILOOP LOPINT 202)用A命令DB伪指令在1000H键入下列字符串:‘IBM_PCCOMPUTER'3)用G命令运行此程序,并用D命令检查目的地址处的字符与源串是否一致。4)若此程序中的目的地址改为1002H,再运行此程序,看能不能把1000H开始的字符串搬到1002H开始的地方去?修改程序以做到这点。3、段寄存器概念及字符串传送指令练习1)用A命令键入下列程序:MOV SI,0MOV DI,0MOV AX,1000MOV DS,AXMOV AX,1500MOV ES,AXMOV CX,0FCLDREP MOVSBINT 202)用A命令DB伪指令在1000:0000处键入字符串'IBM_PCCOMPUTER',并用D命令检查之。3)用D命令检查0F00:1000处内容,看是否一样,为什么?4)用G命令运行此程序,检查目的地址1500:0000处内容。并记下DS与ES值。5)修改此程序,使ES与DS为同一值,以减少一条指令,而源物理地址和目的物理地址(是多少?)仍和原来一样。三、实验报告要求1、各项实验记录和思考题。2、要求你修改的程序的清单(修改后)和调试记录。实验四汇编语言程序的上机前面三个实验都是DEBUG命令实验,即都是在DEBUG软件支持下完成的汇编语言指令的调试。一个完整的汇编语言程序上机实验应该是:一、建立汇编语言的工作环境为运行汇编语言程序至少要在磁盘上建立以下文件:编辑程序,如EDIT.EXE汇编程序,如MASM.EXE连接程序,如LINK.EXE调试程序,如DEBUG.COM必要时,还可建立如CREF.EXE,EXE2BIN.EXE等文件。二、在计算机上运行汇编语言的步骤用编辑程序建立ASM源文件,以ASM作为扩展名用汇编程序把ASM文件转换成OBJ文件用连接程序把OBJ文件转换成可执行文件在DOS提示符下直接键入可执行文件名即可执行该程序三、建立ASM文件 建立ASM文件的编辑程序可以是DOS自身带的编辑程序EDIT.EXE,在DOS提示符下键入EDIT命令即可出现EDIT界面,其操作如下:D:\>edit源程序输入完后,以ASM作为扩展名进行保存,假设所保存的文件名为:ex.asm。ASM源文件的格式1:;定义数据段,如果需要的话,其中segment和ends是一对伪操作,表示段的开始和结束datasegment ;数据段开始 ;定义数据段的主体,如定义变量dataends ;数据段结束;定义附加段,如果需要的话extrasegment ;附加段开始 ;定义附加段的主体,如定义变量extraends ;附加段结束;定义代码段,必须的codesegment ;代码段开始mainprocfar;程序的主体部分,proc和endp这一对伪操作表示一个程序模块的开始和结束 assumeds:data,es:extra,cs:code ;assume伪操作指定某个段分配给哪个段寄存器start: ;程序的入口地址 pushds ;保存原数据段 subax,ax ;ax寄存器清零,作为数据段0偏移地址 pushax ;数据段0偏移地址压入堆栈中 movax,data movds,ax ;把数据段地址装入数据段寄存器ds movax,extra moves,ax ;把附加段地址装入附加段寄存器es ;自己所要实现的功能源代码在此添加 ret ;程序结束后返回DOSmainendp ;程序的主体部分结束codeends ;代码段结束 endstart ;汇编程序的结束,程序在start处开始执行ASM源文件的格式2:;定义数据段,如果需要的话,其中segment和ends是一对伪操作,表示段的开始和结束datasegment ;数据段开始 ;定义数据段的主体,如定义变量dataends ;数据段结束;定义附加段,如果需要的话extrasegment ;附加段开始 ;定义附加段的主体,如定义变量extraends ;附加段结束;定义代码段,必须的codesegment ;代码段开始mainprocfar;程序的主体部分,proc和endp这一对伪操作表示一个程序模块的开始和结束 assumeds:data,es:extra,cs:code ;assume伪操作指定某个段分配给哪个段寄存器start: ;程序的入口地址 movax,data movds,ax ;把数据段地址装入数据段寄存器ds movax,extra moves,ax ;把附加段地址装入附加段寄存器es ;自己所要实现的功能源代码在此添加 movax,4c00h ;程序结束后返回DOS int21hmainendp ;程序的主体部分结束codeends ;代码段结束 endstart ;汇编程序的结束,程序在start处开始执行四、用MASM程序产生OBJ文件 源文件建立后,就要用汇编程序对源文件汇编,汇编后产生二进制目标文件(以OBJ作为扩展名),其操作如下:D:\>masmex.asm 汇编程序输入的是ASM文件,其输出文件可以是3个,第一个是OBJ文件,这是我们汇编的主要目的。第二个是LIST文件,称为列表文件,这个文件列出源程序和机器语言程序清单,并给出符号表,因而可使程序调试更加方便,这个文件可有可无,如果不需要,则可对[NUL.LST]直接按回车键。LST清单的最后部分为段名表和符号表,表中分别给出段名、段的大小及有关属性,以及用户定义的符号名、类型和属性。第三个是CRF文件,这个文件用来产生交叉引用表REF,对于一般程序不需要建立此文件。为了建立交叉引用表,必须调用CREF程序。至此,汇编过程已经完成了。但是,汇编程序还有另一个重要功能,可以给出源程序的出错信息(见后面的附件2)。警告信息(warningerrors)指出汇编程序所认为的一般性错误,严重警告错误(severeerrors)则指出汇编程序认为已使汇编程序无法进行正确汇编的错误。除给出错误的个数外,汇编程序还给出出错信息,包括出错的行和错误类型。当然汇编程序只能给出程序中的语法错误,至于程序的算法或编制程序中的其他错误则程序的调试时去解决。五、用LINK程序产生EXE文件 在DOS提示符下键入LINK命令即可,具体的操作如下:D:\>linkex.obj LINK程序有两个输入文件OBJ和LIB。OBJ是我们需要连接的目标文件,LIB则是程序中需要用到的库文件,如果程序中没有用到库文件,则直接按回车健。LINK程序有两个输出文件EXE和MAP文件,EXE文件就是可执行文件,MAP文件是连接程序的列表文件,又称为连接映像,它给出每个段在存储器中的分配情况。六、程序的执行 在DOS提示符下直接键入可执行的文件名即可,具体的操作如下:D:\>ex七、举例下面这个源代码的功能是在屏幕上显示一个字符串“ThisismyfirstASMprogram.”。datasegmentstringdb'ThisismyfirstASMprogram.',13,10,'$';字符串以’$’符号结尾,以单引号括起来dataendscodesegmentmainprocfar assumecs:code,ds:data ;assume伪操作指定某个段分配给哪个段寄存器,但它不能把;段地址装入段寄存器中start: ;程序的入口地址 pushds ;saveolddatasegment subax,ax ;ax寄存器清零,作为数据段0偏移地址 pushax ;零偏移地址入栈 movax,data movds,ax ;把数据段地址装入数据段寄存器ds leadx,string ;把字符串首地址装入dx寄存器,或写成movdx,offsetstring movah,9 ;DOS功能调用,在屏幕上显示字符串 int21h ;DOS中断 ret ;returntoDOSmainendpcodeends endstart ;汇编的结束,程序在此执行请利用DOS下自身带的编辑程序EDIT.EX,或利用Windows下的记事本,将上面的源代码编辑成ASM文件,存入相应文件夹中,注意文件的扩展名一定是.ASM,如:ex.asm。在计算机上运行汇编语言的步骤:用编辑程序建立ASM源文件,以ASM作为扩展名用汇编程序把ASM文件转换成OBJ文件用连接程序把OBJ文件转换成可执行文件在DOS提示符下直接键入可执行文件名即可执行该程序写出实验报告。实验五分支程序设计一、实验目的 1、熟练掌握逻辑运算和转移指令 1)

逻辑运算指令 2)

标号和无条件转移指令 3)

比较指令和条件转移指令 2、掌握分支程序设计的原理和方法,重点掌握各种分支程序中形成和判断条件而产生的程序段的设计方法和技巧.二、实验内容1、练习逻辑运算指令、比较指令和条件转移指令的功能、用法以及与标志位的关系和可用的寻址方式2、用地址表法,完成下面要求的多分支程序的设计。根据MODE单元中的模式字(0-7)分别转向L0-L7标号处执行。L0-L7处分别完成显示‘0’-‘7’字符。 当MODE=0时,转L0标号,完成显示‘0’ 当MODE=1时,转L1标号,完成显示‘1’ 当MODE=2时,转L2标号,完成显示‘2’ 当MODE=3时,转L3标号,完成显示‘3’ 当MODE=4时,转L4标号,完成显示‘4’ 当MODE=5时,转L5标号,完成显示‘5’ 当MODE=6时,转L6标号,完成显示‘6’ 当MODE=7时,转L7标号,完成显示‘7’3、编制程序实现如下操作:设有10个学生成绩,分别统计低于60分、60~69分、70~79分、80~89分、90~99分及100分的人数,并存放于S5、S6、S7、S8、S9、S10单元中。程序清单: ; 统计学生成绩 DATA SEGMENT GRADEDW95H,60H,75H,92H,71H,86H,54H,89H,83H,76H NEQU($—GRADE)/2 ORG30H S5 DW0 S6 DW0 S7 DW0 S8 DW0 S9 DW0 S10 DW0 DATA ENDS ; STACK SEGMENTSTACK STA DB20DUP(0)TOPEQU$—STA STACKENDS ; CODE SEGMENT MAIN PROCFAR ASSUMECS:CODE,DS:DATA,SS:STACK START:PUSHDS SUBAX,AXPUSHAX MOVAX,DATA MOVDS,AX MOVCX,N LEABX,GRADE;成绩表首地址 COMPARE: MOVAX,[BX] CMPAX,60H;<60? JCFIVE CMPAX,70H ;<70? JCSIX CMPAX,80H ;<80? JCSEVEN CMPAX,90H ;<90? JCEIGHT CMPAX,100H ;=100 JNENINE INCS10 JMPCHA NINE:INCS9 JMPCHA EIGHT:INCS8 JMPCHA SEVEN: INCS7 JMPCHA SIX: INCS6 JMPCHA FIVE: INCS5 JMPCHA CHA:ADDBX,2 ;循环学生人数 LOOPCOMPARE RET MAINENDP CODEENDS ENDSTART 执行程序后,将结果分别填入下列表中N(总人数)S5S6S7S8S9S10三、实验要求:1、在BLOCK开始的内存单元中有若干以字节为单位的正、负数,自编程序,试统计其中正数的个数存放于M_DATA单元中,负数的个数存放于P_DATA单元中。2、在BLOCK开始的内存单元中有若干以字节为单位的奇、偶数,自编程序,试统计其中偶数的个数存放于M_DATA单元中,奇数的个数存放于P_DATA单元中。部分程序清单BLOCKDB37,—90,—32,60,—7,—120 COUNTEQU$—BLOCK P_DATADBCOUNTDCP(0) M_DATADBCOUNTDCP(0) ……………LEASI,BLOOKLEADI,P_DATALEABX,M_DATAMOVCX,COUNT RETRY:MOV AL,[SI]CMP AL,0JGE PPMOV [BX],ALINC BXJMP LOOP1 PP:MOV[DI],ALINC DI LOOP1:INC SI LOOPRETRY……………要求: 1.分析问题,画出算法框图。写实验预习报告。 2.用汇编语言格式编写程序。 3.在DOS下编辑、汇编、连接程序。 4.用Debug调试程序。 5.在DOS下运行并分析结果。6.写实验报告,画出算法框图实验六子程序结构一、实验目的1、掌握程序设计方法,合理划分层次。2、掌握子程序的调用与返回的方法。3、了解子程序的嵌套与递归。二.实验内容与要求1、将主程序中BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。实验参考程序:code segmentmain procfar assumecs:codestart: pushds xorax,ax pushax movbx,1234hcallsub1 retmain endpsub1 procnear movch,4rotate: movcl,4 rolbx,cl moval,bl andal,0fh addal,30h cmpal,3ah jlprintit addal,7hprintit:movdl,al movah,2 int21h decch jnzrotate retsub1 endpcodeends end要求:分析问题,画出算法框图。写实验预习报告。用汇编语言格式编写程序。在上题的基础,将MEM中的4个字节内容输出到屏幕显示。在DOS下编辑、汇编、连接程序。在DOS下运行并分析结果。写实验报告,画出算法框图。2、编制一程序,要求键入一个班的学生成绩,并存放于50字的ERADE数组中,然后根据ERADE中的成绩,把学生名次填入50字的RANK数组中,再按学号顺序把名次从终端上显示出来。提示:程序MAIN功能:根据输入的学生成绩,计算并显示出学生名次。程序INPUT功能:接收一个班级学生的成绩,各成绩之间用空格隔开。程序RANKP功能:计算一个班级学生的名次。(可参照循环程序(一)中的程序段)程序OUTPUT功能:输出(显示)一个班级的学生名次程序DECIBIN功能:十进制转换二进制,存入BX程序BINDEC功能:十进制转换二进制,并在屏幕上显示。程序DEC_DIV功能:BX的内容除以CX的内容,并在屏幕上显示一位商。部分程序清单:1)键入学生成绩(成绩之间用空格间隔,回车结束输入) INPUT PROC MOV SI,0 MOV COUNT,0ENTER:CALL DECIBIN INC COUNTCMP DL,‘’JZ STORECMP DL,0DHJZ EXITJMP RET1STORE:MOV GRADE[SI],BX ADD SI,2 JMP ENTEREXIT:MOV GRADE[SI],BXRET1: RETINPUT ENDP2)十进制转换成二进制DECIBIN PROCMOV BX,0NEM: MOV AH,1INT 21HMOVDL,ALCMPAL,30HJL EXIT1CMP AL,39HJG EXITSUB AL,30HCBWXCHGAX,BXMOVCX,10MUL CLXCHGAX,BXADD BX,AXJMP NEWEXIT1:RETDECIBIN ENDP3)二进制转换成十进制BINIDECPROCPUSH BXPUSH CXPUSH SIPUSH DIMOV CX,100CALL DEC_DIVMOV CX,10CALL DEC_DIVMOV CX,1CALL DEC_DIVPOP DI POP SIPOP CXPOP BXRETBINIDEC ENDP4)十进制转换成ASCII码,并输出DEC_DIV PROCMOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV DL,ALADD DL,30HMOV AH,02HINT 21HRETDEC_DIV ENDP要求:1)自编程序 主程序MAIN,子程序OUTPUT和子程序RANKP。2)将上述程序与自编程序统调。3)输入本班级某门基础课成绩。思考题1)写出4位BCD码转二进制数的算法。2)写出AX中进二制数转BCD码的算法。3)将上述子程序结构改为模块化程序设计。实验七DOS功能调用一、实验目的:1、掌握DOS功能调用的使用方法。2、进一步熟悉子程序的应用。二、实验内容:1、从键盘输入数据并显示1)从键盘输入字符。2)删除指定的字符。3)将剩余字符在屏幕上显示。参考程序:datasegmentbufferdb80dup(?)flagdb?dataendscodesegmentmainprocfar assumecs:code,ds:datastart:pushds xorax,ax pushax movax,data movds,ax movbx,offsetbuffer movflag,0next:movah,01h int21h testflag,01h jnzfollow cmpal,20h jnzexit movflag,1 jmpnextfollow:cmpal,20h jzexit mov[bx],al incbx jmpnextexit:mov[bx],al movdi,offsetbuffer moval,'5' calldel movsi,offsetbuffer calldisp retmainendpdelprocnear cldloop1:movah,[di] cmpah,20h jzexit0 cmpal,[di] jzloop2 incdi jmploop1loop2:moval,[di+1] mov[di],al cmpal,20h jzexit0 incdi jmploop2exit0:retdelendpdispprocneardisp0:movdl,[si] movah,02h int21h incsi moval,[si] cmpal,20h jnzdisp0 retdispendpcodeendsendstart2、输入以空格开始以空格结束的一串字符,并在另一行显示。参考程序:datasegmentbufferdb80dup(?)flagdb?dataendscodesegmentmainprocfarassumecs:code,ds:datastart:pushdsxorax,axpushaxmovax,datamovds,axmovbx,offsetbuffermovflag,0next:movah,01hint21htestflag,01hjnzfollowcmpal,20hjnzexitmovflag,1jmpnextfollow:cmpal,20hjzexitmov[bx],alincbxjmpnextexit:retmainendpcodeendsendstart3、主程序调用三个子程序,子程序分别实现输入一串字符,删除特定字符,并显示剩余字符。参考程序:datasegmentbufferdb80dup(?)flagdb?dataendscodesegmentmainprocfarassumecs:code,ds:datastart:pushdsxorax,axpushaxmovax,datamovds,axmovbx,offsetbuffermovflag,0next:movah,01hint21htestflag,01hjnzfollowcmpal,20hjnzexitmovflag,1jmpnextfollow:cmpal,20hjzexitmov[bx],alincbxjmpnextexit:mov[bx],almovdi,offsetbuffermoval,'5'calldelmovsi,offsetbuffercalldispretmainendpdelprocnearcldloop1:movah,[di]cmpah,20hjzexit0cmpal,[di]jzloop2incdijmploop1loop2:moval,[di+1]mov[di],alcmpal,20hjzexit0incdijmploop2exit0:retdelendpdispprocneardisp0:movdl,[si]movah,02hint21hincsimoval,[si]cmpal,20hjnzdisp0retdispendpcodeendsendstart三、实验步骤和要求:1、分析问题,画出算法框图。2、在DOS下编辑、汇编、连接程序。3、用Debug调试程序。4、在DOS下运行并分析结果。实验八分支程序设计一、实验目的 1、熟练掌握逻辑运算和转移指令 1)

逻辑运算指令 2)

标号和无条件转移指令 3)

比较指令和条件转移指令 2、掌握分支程序设计的原理和方法,重点掌握各种分支程序中形成和判断条件而产生的程序段的设计方法和技巧.二、实验内容1、练习逻辑运算指令、比较指令和条件转移指令的功能、用法以及与标志位的关系和可用的寻址方式2、用地址表法,完成下面要求的多分支程序的设计。根据MODE单元中的模式字(0-7)分别转向L0-L7标号处执行。L0-L7处分别完成显示‘0’-‘7’字符。 当MODE=0时,转L0标号,完成显示‘0’ 当MODE=1时,转L1标号,完成显示‘1’ 当MODE=2时,转L2标号,完成显示‘2’ 当MODE=3时,转L3标号,完成显示‘3’ 当MODE=4时,转L4标号,完成显示‘4’ 当MODE=5时,转L5标号,完成显示‘5’ 当MODE=6时,转L6标号,完成显示‘6’ 当MODE=7时,转L7标号,完成显示‘7’3、编制程序实现如下操作:设有10个学生成绩,分别统计低于60分、60~69分、70~79分、80~89分、90~99分及100分的人数,并存放于S5、S6、S7、S8、S9、S10单元中。程序清单: ; 统计学生成绩 DATA SEGMENT GRADEDW95H,60H,75H,92H,71H,86H,54H,89H,83H,76H NEQU($—GRADE)/2 ORG30H S5 DW0 S6 DW0 S7 DW0 S8 DW0 S9 DW0 S10 DW0 DATA ENDS ; STACK SEGMENTSTACK STA DB20DUP(0)TOPEQU$—STA STACKENDS ; CODE SEGMENT MAIN PROCFAR ASSUMECS:CODE,DS:DATA,SS:STACK START:PUSHDS SUBAX,AXPUSHAX MOVAX,DATA MOVDS,AX MOVCX,N LEABX,GRADE;成绩表首地址 COMPARE: MOVAX,[BX] CMPAX,60H;<60? JLFIVE CMPAX,70H ;<70? JLSIX CMPAX,80H ;<80? JLSEVEN CMPAX,90H ;<90? JLEIGHT CMPAX,100H ;=100 JNENINE INCS10 JMPCHA NINE:INCS9 JMPCHA EIGHT:INCS8 JMPCHA SEVEN: INCS7 JMPCHA SIX: INCS6 JMPCHA FIVE: INCS5 JMPCHA CHA:ADDBX,2 ;循环学生人数 LOOPCOMPARE RET MAINENDP CODEENDS ENDSTART 执行程序后,将结果分别填入下列表中N(总人数)S5S6S7S8S9S10三、实验要求:1、在BLOCK开始的内存单元中有若干以字节为单位的正、负数,自编程序,试统计其中正数的个数存放于M_DATA单元中,负数的个数存放于P_DATA单元中。2、在BLOCK开始的内存单元中有若干以字节为单位的奇、偶数,自编程序,试统计其中偶数的个数存放于M_DATA单元中,奇数的个数存放于P_DATA单元中。部分程序清单BLOCKDB37,—90,—32,60,—7,—120 COUNTEQU$—BLOCK P_DATADBCOUNTDCP(0) M_DATADBCOUNTDCP(0) ……………LEASI,BLOOKLEADI,P_DATALEABX,M_DATAMOVCX,COUNT RETRY:MOV AL,[SI]CMP AL,0JGE PPMOV [BX],ALINC BXJMP LOOP1 PP:MOV[DI],ALINC DI LOOP1:INC SI LOOPRETRY……………要求: 1.分析问题,画出算法框图。写实验预习报告。 2.用汇编语言格式编写程序。 3.在DOS下编辑、汇编、连接程序。 4.用Debug调试程序。 5.在DOS下运行并分析结果。 6.写实验报告,画出算法框图。附录1ASCII码表编码字符编码字符编码字符编码字符00NUL20SPACE40@60`01SOH21!41A61a02STX22“42B62b03ETX23#43C63c04EOT24$44D64d05ENQ25%45E65e06ACK26&46F66f07BEL27‘47G67g08BS28(48H68h09HT29)49I69i0ALF2A*4AJ6Aj0BVT2B+4BK6Bk0CFF2C,4CL6Cl0DCR2D-4DM6Dm0ESO2E.4EN6En0FSI2F/4FO6Fo10DEL30050P70p11DC131151Q71q12DC232252R72r13DC333353S73s14DC434454T74t15NAK35555U75u16SYN36656V76v17ETB37757W77w18CAN38858X78x19EM39959Y79y1ASUB3A:5AZ7Az1BESC3B;5B[7B{1CFS3C<5C\7C|1DGS3D=5D]7D}1ERS3E>5E^7E~1FUS3F?5F_7FDEL

附录2汇编语言常用出错信息汇编程序在对源程序的汇编过程中,若检查出某语句有语法错误,随时在屏幕上给出出错信息。如操作人员指定的列表文件名(即.LST),汇编程序亦将在列表文件中出错的下面给出出错信息,以便操作人员即时查找错误,给予更正。MASM5.0出错信息格式如下:源程序文件行:WARNING/ERROR错误信息码:错误描述信息其中,错误描述信息码由五个字符组成。第一个是字母A,表示汇编语言程序出错;接着有一个数字指明出错类别:‘2’为严重错误,‘4’为严肃警告,‘5’为建议性警告,最后三位为错误编号。错误编号错误描述0Blocknestingerror嵌套出错。嵌套的过程、段、结构、宏指令或重复块等非正常结束。例如在嵌套语句中有外层的结束语句,而无内层的结束语局1Extracharactersonline一语句行有多余字符,可能是语句中给出的参数太多2Internalerror-Registeralreadydefined这是一个内部错误。如出现该错误,请记下发生错误的条件,并使用ProductAssistanceRequest表与Microsoft公司联系3Unkowntypespecifer未知的类型说明符。例如类型字符拼错,把BYTE写成BIT,NEAR写成NAER等4Redefinitionofsymbol符号重定义。同一标识符在两个位置上定义。在汇编第一遍扫描时,在这个标识符的第二个定义位置上给出这个错误5Symbolismultidefined符号多重定义。同一标识符在两个位置上定义。在汇编第二遍扫描时,每当遇到这个标识符都给出这个错误6Phaseerrorbetweenpasses两次扫描间的遍错。一个标号在二次扫描时得到不同的地址值,就会给出这种错误。若在启动MASM时使用/D任选项,产生第一遍扫描的列表文件,它可帮助你查找这种错误7AlreadyhadELSEclause已有ELSE语句。在一个条件块里使用多于一个的ELSE语句8Mustbeinconditionalblock没有在条件块里。通常是有ENDIF或ELSE语句,而无IF语句9Symbolnotdefined符号未定义,在程序中引用了未定义的标识符10Syntaxerror语法错误。不是汇编程序所能识别的一个语句11Typeillegalincontext指定非法类型。例如对一个过程指定BYTE类型,而不是NEAR或FAR12Groupnamemustbeunique组名应是唯一的。作为组名的符号作为其他符号使用13Mustbedeclaredduringpass1必须在第一遍扫描期间定义。在第一遍扫描期间,如一个符号在未定义前就引用,就会出现这种错误。14Illegalpublicdeclaration一个标识符被非法的指定为PUBLIC类型15Symbolalreadydefferentkind重新定义一个符号为不同种类符号。例如一个段名重新被当作变量名定义使用16Reservedwordusedassymbol把汇编语言规定的保留字作标识符使用17Forwardreferenceillegal非法的向前引用。在第一遍扫描期间,引用一个未定义符号。18Operandmustberegister操作数位置上应是寄存器,但出现了标识符19Wrongtypeofregister使用寄存器出错20Operandmustbesegmentorgroup应该给出一个段名或组名。例如ASSUME语句中应为某段寄存器和指定一个段名或组名,而不应是别的标号或变量名等21Symbolhasnosegment不知道标识符的段属性22Operandmustbetypespecifier操作数应给出类型说明,如NEAR、FAR、BYTE等23Symbolalreaddefinedlocally以被指定为内部的标识符,企图在EXTRN语句中又定义外部标识24Segmentparanetersarechanged段参数被改变。如同一标识符定义在不同段内25Improperalign/combintype段定义时的定位类型/组合类型使用出错26Referencetomultidefinedsymbol指令引用了多重定义的标识符27Operandexpected需要一个操作数,只有操作符28Operatorexpected需要一个操作符,但只有操作数29Divdsionby0oroverflow除以0或溢出30Negativeshiftcount\运算符SHL或SHR的移位表达式值为负数31Operandtypemustmatch操作数类型不匹配。双操作数指令的两个操作数长度不一致,一个是字节,一个是字32Illegaluseofexternal外部符号使用出错33Mustberecordfieldname应为记录字段名。在记录字段名位置上出现另外的符号34Mustberecordnameorfieldname应为记录名或记录字段名。在记录名或记录字段名位置上出现另外的符号35Operandmustbesize应指明操作数的长度(如BYTE、WORD等)。通常使用PTR运算即可改正36Mustbevariable,label,orconstant应该是变量名、标号、或常数的位置上出现了其他信息37Mustbestucturefieldname应该为结构字段名。在结构字段名位置上出现了另外的符号38Lefeoperandmustsegment操作数的左边应该是段的信息。如设DA1、DA2均是变量名,下列语句就是错误的:“MOVAX,DA1:DA2”。DA1位置上应使用某段寄存器名39Oneoperandmustconstant操作数必须是常数。40Operandmustbeinsamesegmentor

温馨提示

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

评论

0/150

提交评论