《汇编语言实验指导书(用).doc》由会员分享,可在线阅读,更多相关《汇编语言实验指导书(用).doc(37页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、汇编语言程序设计实验指导书汇编语言程序设计课程建设小组二五年九月内 容 简 介本书是为了配合IBM汇编语言程序设计课程而编写的实验指导书。配合微型计算机汇编语言程序设计的教学体系及方法,通过上机实验循序渐进地加深对8086/88汇编语言的认识与理解,进而掌握程序设计的一般方法和技巧,并通过对程序的调试和运行,熟悉DEBUG的使用。本书编排了9个单元实验:3个验证性实验,5个设计性实验,1个综合性实验(选做)。每个验证性实验包括实验目的,实验环境,实验内容,原理和步骤等,设计性实验给出了基本要求,启发学生的思考和动手的能力。本书可供各高校计算机专业、非计算机专业开设汇编语言程序设计课程用作实验教
2、材。前 言汇编语言是计算机能够提供给用户使用的最快而又最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的惟一语言。因而,对程序的存储空间和运行时间要求较高的一些实际任务,一般都使用汇编语言进行编程处理;至于很多实时性强、需要直接控制硬件的应用场合,则更是非用汇编语言不可了。汇编语言程序设计是高等院校计算机科学与技术专业“汇编语言程序设计”必修课,实践环节是帮助学生加深认识和理解理论教学知识的重要途径。学生应该通过大量的上机实验熟悉8086 CPU的指令功能、用途和使用技巧,进而通过循序渐进的程序设计练习,验证各类指令的功能和提高程序设计的能力。本实验指导书由9个单元实验组成:汇编语
3、言的调试和运行、堆栈指令和算术指令、逻辑指令和串处理指令、汇编语言程序格式、逻辑指令和程序设计、循环程序设计、子程序结构、DOS功能调用和综合实验。本书所给实验程序全部通过上机验证,各实验之间相互配合而又自成体系,易于为不同类型专业按其实验教学要求选做,所以本书具有较宽的适用面。目 录实验一 汇编语言的调试和运行1实验二 堆栈指令和算术指令2实验三 逻辑指令和串处理指令4实验四 汇编语言程序格式6实验五 分支程序设计5实验六 循环程序设计9实验七 子程序结构13实验八 DOS功能调用16实验九 综合实验20附 录 1 ASCII码表22附 录 2 汇编语言常用出错信息23附 录 3 DEBUG
4、命令27附 录 4 C语言调用汇编语言30实验一 汇编语言的调试和运行一、实验目的1、 熟悉DEBUG程序和命令,并用它运行基本指令和察看运行结果。 怎样调用Debug 如何显示和修改内存单元 如何显示和修改CPU的寄存器 各标志位的状态是如何表示的,怎样修改标志寄存器 怎样汇编与反汇编 怎样执行程序 怎样跟踪程序 怎样命名和读写文件 怎样退出Debug 2、 熟悉汇编中通用传送指令。3、 理解指令不同的寻址方式,注意规定或限制使用的寄存器如:双操作数指令中,源操作数和目的操作数的地址不能同时为存储器地址,段跨越前缀不能使用CS,操作对象是地址还是地址中的内容,指令隐含使用的寄存器。二、实验内
5、容1、 键入 DEBUG 进入 DEBUG 控制状态,显示提示符 - 。2、 用命令 F100 10F A 将A的ASCII码填入内存。3、 用命令 D100 10F 观察内存中的十六进制码及屏幕右边的ASCII字符。4、 用命令 F110 11F 41 重复上二项实验,观察结果并比较。5、 用命令 E100 30 31 32 3F将30H-3FH写入地址为100开始的内存单元中,再用D命令观察结果,看键入的十六进制数是什么字符的ASCII码?6、 用DEBUG调试和运行下列程序,记录所用的DEBUG命令和运行结果。MOV WORD PTR 1100,3445MOV WORD PTR 1102
6、,5678MOV WORD PTR 1106,6732MOV AX,1100SUB AX,1102ADD AX,1106MOV 1104,AXHLT其中粗斜体的数字可以修改。7、 内存操作数及各种寻址方式使用程序内容:MOVAX,1234 MOV1000,AXMOVBX,1002MOVBYTE PTRBX,20MOVDL,39INCBXMOVBX,DLDECDLMOVSI,3MOVBX+SI,DLMOVBX+SI+1,DLMOVWORD PTRBX+SI+2,2846操作步骤 1)用A命令键入上述程序,并用T命令逐条运行。2)每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内
7、容并注明是什么寻址方式。注意:D命令显示结果中右边的ASCII字符及双字节数存放法。思考:有关指令中BYTE PTR及WORD PTR伪操作不加行不行?试一试。实验二 堆栈指令和算术指令一、实验目的1、熟悉掌握堆栈操作指令、算术指令的格式、功能及用法。2、熟悉二进制数的四则运算指令,掌握各种运算指令的格式、用法、寻址方式和对标志位的影响,特别是对溢出标志位CF和OF的影响。二、实验内容1、写出书中习题3.13所用指令,用DEBUG运行并察看和验证运行结果,在实验报告中画出堆栈区和SP的内容变化过程示意图。2、用加减法指令计算下列各组十六进制数加减结果并和你的手算结果比较:(1)34H,22H(
8、2)56H,78H(3)A5,79H(4)1284H,5678H(5)A758H,347FH1) 用R命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内容。2) 用R命令将AX,BX内容改写为1050H及23A8H。3、加减法指令:1) 用A命令在内存100H处键入下列内容:MOVAH,34MOVAL,22ADDAL,AHSUBAL,78MOVCX,1284MOVDX,5678ADDCX,DXSUBCX,AXSUBCX,CX2) 用U命令检查键入的程序及对应的机器码。3) 用T命令逐条运行这些指令,检查并记录有关寄存器及ZF情况。思考:这次运行还是键入T,
9、行不行?怎么办?用R命令检查一下IP的内容。注意T命令与IP的关系。4、带进位加减法:1) 用A命令在内存200H处键入下列内容,并用U命令检查:MOVAH,12MOVAL,84MOVCH,56MOVCL,78ADDAL,CLADCAH,CHMOVDH,A7MOVDL,58SUBDL,7FSBBDH,342) 用T命令逐条运行这些指令,检查并记录有寄存器及CF内容。3) 上面这段程序若改用16位操作指令达到同样结果,怎么改?试修改并运行之。5、BCD码加减法1)内容:MOVAL,58ADDAL,25DAA2)要求:用A 命令键入,U命令检查,T命令逐条运行并记录有关寄存器及AF内容。 6、自编
10、程序用16位减法指令编一个32位(4字节)数减法程序,两个源数及结果存放地址同上题。调试并做记录。三、实验报告要求:1、十六进制数加减法手算结果及实验结果2、8088常用指令练习部分的逐条运行记录,思考结果及自编程序运行记录(列出自编程序)。3、各项实验结果记录。4、自编程序原稿及调试后修正稿,写出原稿错在那里。实验三 逻辑指令和串处理指令一、实验目的熟悉逻辑运算指令和串处理指令二、实验内容及步骤1、 编写程序实现AL中数乘10。2、 作业内容上机验证(分析结果 编写程序 上机验证)3、分析、理解、跟踪执行下列程序。 mov si,2000 mov di,3000 mov cx,000a re
11、p movsb hlt4、数据串搬家程序:1)用A命令键入下列程序:MOVSI,1000MOVDI,1500MOVCX,0FLOP: MOVAL,SIMOVDI,ALINCSIINCDILOOPLOPINT202)用A命令DB伪指令在1000H键入下列字符串:IBM_PC COMPUTER3)用G命令运行此程序,并用D命令检查目的地址处的字符与源串是否一致。4)若此程序中的目的地址改为1002H,再运行此程序,看能不能把1000H开始的字符串搬到1002H开始的地方去?修改程序以做到这点。5、段寄存器概念及字符串传送指令练习1)用A命令键入下列程序:MOVSI,0MOVDI,0MOVAX,10
12、00MOVDS,AXMOVAX,1500MOVES,AXMOVCX,0FCLDREPMOVSBINT202)用A命令DB伪指令在1000:0000处键入字符串IBM_PC COMPUTER,并用D命令检查之。3)用D命令检查0F00:1000处内容,看是否一样,为什么?4)用G命令运行此程序,检查目的地址1500:0000处内容。并记下DS与ES值。5)修改此程序,使ES与DS为同一值,以减少一条指令,而源物理地址和目的物理地址(是多少?)仍和原来一样。三、实验报告要求1、各项实验记录和思考题。2、要求你修改的程序的清单(修改后)和调试记录。实验四 汇编语言程序格式一、实验目的1、熟悉掌握编译
13、和连接程序的使用。2、熟悉掌握汇编源程序的书写格式。3、熟悉伪指令的用法,可以编写简单的源程序。1)掌握常用工具软件EDIT,MASM和LINK的使用。2)伪指令:SEGMENT,ENDS,ASSUME,END,OFFSET,DUP。3)利用INT 21H的1号功能实现键盘输入的方法。4)了解.EXE文件和.COM文件的区别及用INT 21H 4C号功能返回系统的方法。5)利用DOS功能调用INT 21H的2号和9号功能进行屏幕显示的方法。二、实验要求1、程序要结构化:简明、易读和易调试。2、执行速度较快。3、占用存储空间较少。三、实验内容1、编一段程序,在内存中自SQTAB(0200H)地址
14、开始的连续10个单元中存放0-9的平方值。要求利用简单的查表法NUM(0210)单元中指定数(0-9)的平方值,并将所求平方值存入RESULT(0211)单元。2、通过编辑、编译和连接、调试书中119、146页的例题熟悉掌握编译和连接程序的使用。3、作书中作业4.5 4.8 4.9 4.10 4.13 4.14 ,并编写小程序验证。4、编写 4.17 程序,并上机运行。实验五 分支程序设计一、实验目的1、熟练掌握逻辑运算和转移指令1)逻辑运算指令2)标号和无条件转移指令3)比较指令和条件转移指令2、掌握分支程序设计的原理和方法,重点掌握各种分支程序中形成和判断条件而产生的程序段的设计方法和技巧
15、.二、实验内容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标号,完成显示73、编制程序实现如下操作
16、:设有10个学生成绩,分别统计低于60分、6069分、7079分、8089分、9099分及100分的人数,并存放于S5、S6、S7、S8、S9、S10单元中。程序清单:; 统计学生成绩DATA SEGMENTGRADE DW 95H,60H,75H,92H,71H,86H,54H,89H,83H,76HN EQU ($GRADE)/2ORG 30HS5 DW0S6 DW0S7DW0S8DW0S9DW0S10DW0DATAENDS;STACK SEGMENT STACKSTA DB 20 DUP (0) TOP EQU $STASTACK ENDS;CODESEGMENTMAINPROC FAR
17、ASSUME CS:CODE, DS:DATA, SS:STACKSTART: PUSH DSSUB AX,AX PUSH AXMOV AX,DATAMOV DS,AXMOV CX,NLEA BX,GRADE ;成绩表首地址COMPARE:MOV AX,BX CMP AX,60H ;60?JL FIVECMP AX,70H ;70?JL SIXCMP AX,80H ;80?JL SEVENCMP AX,90H ;90?JL EIGHTCMP AX,100H ;=100JNE NINEINC S10JMP CHANINE: INC S9JMP CHAEIGHT: INC S8JMP CHASEV
18、EN:INC S7JMP CHASIX:INC S6JMP CHAFIVE: INC S5 JMP CHACHA: ADD BX,2 ;循环学生人数LOOP COMPARERETMAIN ENDPCODE ENDS END START执行程序后,将结果分别填入下列表中N(总人数)S5S6S7S8S9S10三、实验要求: 1、在BLOCK开始的内存单元中有若干以字节为单位的正、负数,自编程序,试统计其中正数的个数存放于M_DATA单元中,负数的个数存放于P_DATA单元中。2、在BLOCK开始的内存单元中有若干以字节为单位的奇、偶数,自编程序,试统计其中偶数的个数存放于M_DATA单元中,奇数的
19、个数存放于P_DATA单元中。部分程序清单 BLOCK DB 37,90,32,60,7,120COUNT EQU $BLOCKP_DATA DB COUNT DCP (0)M_DATA DB COUNT DCP (0) LEA SI,BLOOK LEA DI,P_DATA LEA BX,M_DATA MOV CX,COUNTRETRY: MOV AL,SI CMP AL,0 JGE PP MOV BX,AL INC BX JMP LOOP1PP: MOV DI,AL INC DILOOP1: INC SILOOP RETRY 要求:1 分析问题,画出算法框图。写实验预习报告。2 用汇编语言格
20、式编写程序。3 在DOS下编辑、汇编、连接程序。4 用Debug调试程序。5 在DOS下运行并分析结果。6 写实验报告,画出算法框图。实验六 循环程序设计一实验目的1 掌握循环程序设计的方法(两重性循环结构)2 掌握正确分配与使用寄存器。3 掌握控制循环的方法。二实验内容与要求1 请编写一程序,从附加段中一个未排序的字数组中,找出最大数和最小数分别存放在AX 和BX寄存器中。2 以GRADE为首地址的10个字的数组中保存有学生成绩。建立一个10个字的RNAK 数组,并根据GRADE中的学生成绩将学生名次填入RANK数组中(提示:一个学生的名次等于成绩高于等于该学生的人数加1)。 寄存器分配情况
21、说明如下: AX 存放当前被测学生的成绩 BX 存放当前被测学生的相对地址指针 CX 内循环计数值 DX 存放当前被测学生的名次计数值 SI 内循环测试时的地址指针 DI 外循环计数值部分程序清单 (将程序补充完整);建立学生成绩名次表DATA SEGMENTGRADEDW 88H,75H,95H,63H,98H,78H,87H,73H,90H,60HCOUNTEQU ($-GRADE) /2ORG 20HRANKDW 10 DUP(?)DATAENDS;STACKSEGMENT STACKSTA DB 20 DUP (20H)TOPEQU $STASTACK ENDS;CODESEGMENT
22、 ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV SP,TOPMOV DI, ;成绩的个数MOV BX,0 LOOP1:MOV AX,GRADEBX,1MOV CX,COUNT SI,GRADE ;成绩的存放地址 NEXT:CMP AX,SI NO_COUNTINC WORD PTR RANKBX;存放学生名次NO_COUNT:ADD SI,2 NEXTADD BX,2DEC DI LOOP1MOV AX,4C00HINT 21HCODEENDSENDSTART 3、 一个数组
23、DATAX,其中的数据排列规律是:头三项是0,0,1,以每项的值均是前三项之和。试将项值小于等于2000以前的各项数据填入数组DATAX中。 算法: n 4时: an=an-1+an-2+an-3 an=2an-1an-4 要求:按上述两种算法编程4、从DATA_BUF(1000H)开始存放50个字节数据,编写程序将这些数据由小到大排序,排序后的数据仍放在该区域中。要求原始数据在源程序中给出,排序前后的数据以每行10个的格式显示在屏幕上。实验提示: 参见教材第134页,例5.7所用的数据如下:stack segment para stack stack db 1024 dup (?)stack
24、 endsdata segment para data data_buf db 50,49,48,47,46,45,44,43,42,41 db 40,39,38,37,36,35,34,33,32,31 db 30,29,28,27,26,25,24,23,22,21 db 20,19,18,17,16,15,14,13,12,11 db 10, 9, 8, 7, 6, 5, 4, 3, 2, 1msg1 db Raw Data:, 0dh, 0ah, $msg2 db Sorted Data:, 0dh, 0ah, $ data ends5、测量一字符串长度,并用十六进制数显示之程序内容:
25、JMPSTARTDBThis is a program to measure the length of a string。DB0D,0ADBthe length of the string is: $START: MOVAH,9MOVDX,102INT21MOVBX,101MOVAL,24MOVDH,FFLOP: INCBXINCDHCMPAL,BXJNZLOPMOVCH,2MOVCL,4LOP1: ROLDH,CLMOVDL,DHANDDL,0FADDDL,30CMPDL,3AJCJADDDL,7J: MOVAH,2INT21DECCHJNZLOP1INT20键入此程序,存入DD.COM文
26、件中并在DOS命令状态下直接运行之,若未出现预期结果,用DEBUG检查有否错误?三、实验步骤和要求1、分析问题,画出算法框图。写实验预习报告。2、用汇编语言格式编写程序。3、在DOS下编辑、汇编、连接程序。4、用Debug调试程序。5、在DOS下运行并分析结果。6、写实验报告,画出算法框图。实验七 子程序结构一、实验目的1、掌握程序设计方法,合理划分层次。2、掌握子程序的调用与返回的方法。3、了解子程序的嵌套与递归。二实验内容与要求1、将主程序中BX寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。实验参考程序:code segmentmain proc farassume cs:code
27、start:push dsxor ax,axpush axmov bx,1234hcall sub1 retmain endpsub1proc nearmov ch,4rotate:mov cl,4rol bx, clmov al,bland al,0fhadd al,30hcmp al,3ahjl printitadd al,7hprintit: mov dl,almov ah,2int 21hdec chjnz rotateretsub1 endpcode ends end要求:1) 分析问题,画出算法框图。写实验预习报告。2) 用汇编语言格式编写程序。3) 在上题的基础,将MEM中的4个
28、字节内容输出到屏幕显示。4) 在DOS下编辑、汇编、连接程序。5) 在DOS下运行并分析结果。6) 写实验报告,画出算法框图。2、编制一程序,要求键入一个班的学生成绩,并存放于50字的ERADE数组中,然后根据ERADE中的成绩,把学生名次填入50字的RANK数组中,再按学号顺序把名次从终端上显示出来。提示:1) 程序MAIN 功能:根据输入的学生成绩,计算并显示出学生名次。2) 程序INPUT 功能:接收一个班级学生的成绩,各成绩之间用空格隔开。3) 程序RANKP 功能:计算一个班级学生的名次。(可参照循环程序(一)中的程序段)4) 程序OUTPUT 功能:输出(显示)一个班级的学生名次5
29、) 程序DECIBIN 功能:十进制转换二进制,存入BX6) 程序BINDEC 功能:十进制转换二进制,并在屏幕上显示。7) 程序DEC_DIV功能:BX的内容除以CX的内容,并在屏幕上显示一位商。部分程序清单: 1)键入学生成绩 (成绩之间用空格间隔,回车结束输入) INPUT PROC MOVSI, 0MOV COUNT, 0ENTER: CALL DECIBIN INCCOUNT CMPDL, JZSTORE CMPDL,0DH JZEXIT JMPRET1STORE: MOVGRADE SI,BX ADD SI,2 JMPENTEREXIT: MOV GRADE SI, BXRET1:
30、RETINPUTENDP 2)十进制转换成二进制DECIBIN PROC MOVBX, 0NEM: MOVAH, 1 INT 21H MOV DL, AL CMP AL, 30H JL EXIT1 CMP AL, 39H JG EXIT SUB AL, 30H CBW XCHG AX, BX MOV CX, 10 MUL CL XCHG AX, BX ADD BX, AX JMP NEW EXIT1: RET DECIBINENDP3)二进制转换成十进制BINIDEC PROC PUSH BX PUSH CX PUSH SI PUSH DI MOV CX,100 CALL DEC_DIV MO
31、V CX,10 CALL DEC_DIV MOV CX,1 CALL DEC_DIV POP DI POPSI POPCX POP BX RETBINIDEC ENDP4)十进制转换成ASCII码,并输出DEC_DIV PROC MOV AX, BX MOV DX, 0 DIV CX MOVBX, DX MOVDL, AL ADD DL, 30H MOV AH, 02H INT 21H RET DEC_DIV ENDP要求:1)自编程序主程序MAIN,子程序 OUTPUT和子程序 RANKP。2)将上述程序与自编程序统调。3)输入本班级某门基础课成绩。 思考题 1) 写出4位BCD码转二进制数
32、的算法。2) 写出AX中进二制数转BCD码的算法。3) 将上述子程序结构改为模块化程序设计。实验八 DOS功能调用一、实验目的:1、掌握DOS功能调用的使用方法。2、进一步熟悉子程序的应用。二、实验内容:1、从键盘输入数据并显示1) 从键盘输入字符。2) 删除指定的字符。3) 将剩余字符在屏幕上显示。参考程序:data segmentbuffer db 80 dup(?)flag db ?data endscode segmentmain proc far assume cs:code,ds:datastart: push ds xor ax,ax push ax mov ax,data mo
33、v ds,ax mov bx,offset buffer mov flag,0next: mov ah,01h int 21h test flag,01h jnz follow cmp al,20h jnz exit mov flag,1 jmp nextfollow: cmp al,20h jz exit mov bx,al inc bx jmp nextexit: mov bx,al mov di,offset buffer mov al,5 call del mov si,offset buffer call disp retmain endpdel proc near cldloop1
34、: mov ah,di cmp ah,20h jz exit0 cmp al,di jz loop2 inc di jmp loop1loop2: mov al,di+1 mov di,al cmp al,20h jz exit0 inc di jmp loop2exit0: retdel endpdisp proc neardisp0: mov dl,si mov ah,02h int 21h inc si mov al,si cmp al,20h jnz disp0 retdisp endpcode endsend start2、输入以空格开始以空格结束的一串字符,并在另一行显示。参考程序
35、:data segmentbuffer db 80 dup(?)flag db ?data endscode segmentmain proc far assume cs:code,ds:datastart: push ds xor ax,ax push ax mov ax,data mov ds,ax mov bx,offset buffer mov flag,0next: mov ah,01h int 21h test flag,01h jnz follow cmp al,20h jnz exit mov flag,1 jmp nextfollow: cmp al,20h jz exit mov bx,al inc bx jmp nextexit: retmain endpcode endsend start3、主程序调用三个子程序,子程序分别实现输入一串字符,删除特定字符,并显示剩余字符。参考程序:data segmentbuffer db 80 dup(?)flag db ?data endscode segmentmain proc far assume cs:code,ds:datastart: push ds