《汇编语言》实验讲义_第1页
《汇编语言》实验讲义_第2页
《汇编语言》实验讲义_第3页
《汇编语言》实验讲义_第4页
《汇编语言》实验讲义_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、 汇编语言程序设计实验指导书汇编语言程序设计实验指导书计算机系 宋勤 2013-5汇编语言实验学时分配表序号实验项目名称实验学时实验报告或作业课内课外1汇编语言程序上机过程以及调试2212顺序程序设计2213循环程序设计2214分支程序设计2215子程序设计2216I/O程序设计2217实验七 综合程序设计程序设计221合计14147实验一汇编语言程序上机过程以及调试一、预习内容1.工具软件MASM、LINK的使用2.常用DEBUG命令的使用: G,D,R,T,U,Q3.完整程序设计方法的格式。二、目的要求1.掌握常用工具软件MASM、LINK的使用2.掌握常用DEBUG命令: G,D,R,T

2、,U,Q 能灵活使用这些命令调试程序3.掌握完整程序设计方法的格式,能正确书写数据段,代码段等。三、实验内容用两种方法把字符串mess1复制到mess2串中去;(1) 从左到右的方向复制(2) 从右到左的方向复制data segment mess1 db my name is songqin $data endsEXTRA segment mess2 db 17 dup(?)EXTRA ends;*code segment assume cs:code, DS:DATA, ES:EXTRA start: mov ax,DATA MOV ds,ax mov ax,EXTRA MOV es,ax

3、leA si,mess1 leA di,mess2 mov cx,017 CLD rep movsB ret code ends end start 实验步骤:1)用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在D:masm50下,注意保存时将文件扩展名改为.asm(如P77.asm)。2)打开桌面的“命令提示符” 程序进入dos命令操作,先用cd masm50 命令改变路经,接着用 ”masm + 文件名” (如 masm P77,这里文件名可以不带扩展名) 对源文件进行汇编,产生.obj文件和.LST文件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。3)用 ”

4、link + 文件名” (如 link P77;) 将.obj文件连接成可执行的.exe文件(P77.exe)。4)用debug调试程序,熟悉debug命令的使用:(1)打 debug P77.exe 进入debug 控制,显示提示符 - 。(2)用命令g执行程序,可得与步骤4相同的结果,也可用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况,并注意标志位有无变化。(3)用命令u检查键入的程序并记录,特别注意左边的机器码和指令地址。如果一条u命令没有显示完全,可以再次输入u命令,该命令会紧接着上一个命令的输出继续显示。(4)用命令g+地址设置断点,如g06,表示将断点设置

5、在代码段的偏移地址为06h的指令前,并执行到该断点前。其中,命令中的地址项可以从上条命令u的运行结果获得。(5)用命令r查看各寄存器的情况。(6)用命令d0查看数据段的情况,0表示从偏移地址0开始,也可以指定其他偏移地址值。(7)用命令 e+地址的方式修改数据区的字符串,其中地址指需要修改的数据段内存单元偏移地址,可根据上条d0命令获得。如e 09 表示从偏移地址09h开始修改数据。(8)再次用命令g执行程序,查看执行结果。(9)用命令q退出debug,如果在上述步骤中碰到异常,可以先用q命令退出后再进入调试。四、实验报告或作业1分析程序,画出程序流程图2汇编,连接及调试时产生的错误,其原因及

6、解决办法。3思考:1) 上述实验中用e修改数据段的内容,是否改变原文件P77.asm的内容?2) 用单步执行命令t运行程序, 运行到mov ax, 4c00h, int 21h指令后,cs和ip寄存器内容前后有何变化,产生变化的原因是什么?附:DEBUG 使用:1打 DEBUG 进入 DEBUG,显示提示符 - 。2退出DEBUG命令:Q3显示内存命令:D 起始地址 结束地址4修改内存命令:E 起始地址,连续修改打空格键。打回车键退出E命令。5检查寄存器命令:R标志位显示10CFCYNCZFZRNZSFNGPLAFACNAOFOVNVPFPEPODFDNUPIFEIDI6修改寄存器命令:R 寄

7、存器名7小汇编命令:A 起始地址,不输入指令打回车键退出A命令。8反汇编命令:U 起始地址 结束地址9文件命名命令:N 盘号:文件名10读文件命令:L 内存地址11写文件命令:W 内存地址10读扇区命令:L 内存地址 盘号(0-A:,1-B:) 扇区号 扇区数11写扇区命令:W 内存地址 盘号 扇区号 扇区数12运行命令:G=起始地址 结束(断点)地址13单步命令:T=起始地址 运行指令数,进入子程序内部。14单步命令:P=起始地址 运行指令数,不进入子程序内部。15内存搬家命令:M 起始地址 结束地址 目的地址标志位显示10CFCYNCZFZRNZSFNGPLAFACNAOFOVNVPFPE

8、PODFDNUPIFEIDI6修改寄存器命令:R 寄存器名7小汇编命令:A 起始地址,不输入指令打回车键退出A命令。8反汇编命令:U 起始地址 结束地址9文件命名命令:N 盘号:文件名10读文件命令:L 内存地址11写文件命令:W 内存地址10读扇区命令:L 内存地址 盘号(0-A:,1-B:) 扇区号 扇区数11写扇区命令:W 内存地址 盘号 扇区号 扇区数12运行命令:G=起始地址 结束(断点)地址13单步命令:T=起始地址 运行指令数,进入子程序内部。14单步命令:P=起始地址 运行指令数,不进入子程序内部。15内存搬家命令:M 起始地址 结束地址 目的地址实验二 顺序程序设计一、预习内

9、容1常用工具软件MASM、LINK和DEBUG的使用2完整程序设计方法的格式3汇编语言顺序结构程序的设计方法二、目的要求1继续熟悉常用工具软件MASM、LINK和DEBUG的使用2继续熟悉完整程序设计方法的格式3学习与掌握汇编语言顺序结构程序的设计方法三、实验内容编程实现datax双字除以字datay(用div),并且把商存入quotient字单元,把余数存入remainder字单元(具体数值可自行确定)。并且用debug查看程序的运行结果,检查程序运行结果的正确性。DSEG SEGMENT datax dd 956123h datay dw 123hquotient dw ?remainde

10、r dw ?DSEG ENDSCSEG SEGMENT assume cs:CSEG, ds:DSEG start:mov ax, dseg mov ds, axmov ax,dataxmov dx,datax2div dataymov quotient,axmov remainder,dxmov ax, 4c00h int 21h CSEG ENDSend start实验步骤:1用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在D:masm50下,注意保存时将文件扩展名改为.asm(如lab2.asm)。2用masm对源文件进行汇编,产生.obj(如lab2.obj)文件和.LST文

11、件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。3用 link将.obj文件连接成可执行的.exe文件(lab2.exe)。4直接运行link产生的.exe文件。5用debug调试程序,单步执行程序,并记录黑体部分单步执行后ax,dx,cs,ip寄存器以及标志寄存器的值.6在debug状态下,用“a+偏移地址”的方式将程序的div 改为idiv再单步执行黑体部分,对比步骤5的结果,查看有何变化,并记录。7修改源程序实现双字datax 与字datay的无符号乘法。四、实验报告或作业1分析程序,画出程序流程图。2汇编,连接及调试时产生的错误,其原因及解决办法。3步骤5的结果记录

12、。4步骤6的结果记录,并分析发生变化的原因。5思考:1) 指令mov dx,datax2 改写成 mov dx,datax+2 经过汇编后,二者是否相同,为什么?2) 如何实现双字datax 与字datay的乘法,写出完整的源程序。实验三 循环程序设计A-A实验A (必做)一、 实验目的:1 掌握循环程序的设计方法2 进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。3 学会针对不同的问题,选用不同的组织循环的方法。二、 实验内容1 编写一个程序,用二进制显示从键盘输入一个字符的ASCII码。2 编写一个程序,记录某个字存储单元数据中1的个数,以十进制形式显示结果。 三、

13、实验准备1 编写实验内容要求的两个程序。2 写出调试以上程序,即修改程序参数,检查结果的操作方法。3 熟悉源程序汇编、连接命令的使用方法即要回答的内容。四、 实验步骤1 用EDIT或其它编辑软件,编写.ASM源程序,例如Binary.ASM及Statistic.ASM。2 对其进行汇编及连接,产生.EXE文件。3 对.EXE文件进行调试运行。a. 用DEBUG调试运行,学会修改AL内容的方法。b. 对DSPKEY.EXE键入不同的字符,分别进行调试。c. 在MS-DOS下运行这两个.EXE文件。五、 实验报告要求 画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。六、 参考程序段清

14、单:;Binary.asmmov cx,8;CX8(循环次数)again:shl bl,1;左移进CF,从高位开始显示mov dl,0;MOV指令不改变CFadc dl,30h;DL030HCF;CF若是0,则DL 0 ;CF若是1,则DL 1 mov ah,2int 21h;显示loop again;CX减1,如果CX未减至0,则循环;Statistic.ASM;数据段numberdw 1110111111100100B;代码段mov bx,numberxor dl,dl;循环初值:DL0again:test bx,0ffffh;也可以用cmp bx,0jz done;全部是0就可以退出循环

15、,减少循环次数shl bx,1;用指令shr bx,1也可以adc dl,0;利用ADC指令加CF的特点进行计数jmp againdone:cmp dl,10;判断1的个数是否小于10jb digit;1的个数小于10,转移push dxmov dl,1;1的个数大于或等于10mov ah,2;则要先显示一个1int 21hpop dxsub dl,10digit:add dl,0;显示个数mov ah,2int 21hA-ABB实验 B一、预习内容1多重循环程序和排序程序设计方法。2带符号数的比较转移指令:JL,JLE,JG,JGE二、目的要求1掌握多重循环程序和排序程序设计方法。2掌握带符

16、号数的比较转移指令:JL,JLE,JG,JGE三、实验内容建立学生名次表,以grade为首地址的数组中保存了学生的成绩,其中 grade+i 保存学号为i+1的学生的成绩。要求建立一个10个字的rank数组,并根据grade中的学生成绩将学生名次填入rank数组中,其中rank+i的内容是学号为i+1学生的名次(提示:一个学生的名次等于成绩高于该学生的人数加1)DSEG SEGMENT grade dw 88,75,95,63,98,78,87,78,90,60 rank dw 10 dup(?)DSEG ENDSCSEG SEGMENT assume cs:CSEG, ds:DSEG sta

17、rt:mov ax, dseg mov ds, axmov di,10mov bx,0loop: mov dx,1mov cx,10 next:cmp ax,sijge no_countinc dxno_count:add si,2loop next add bx,2 jne loopmov ax, 4c00h int 21h CSEG ENDSend start实验步骤:1输入,汇编并连接此程序。2在DEBUG下运行此程序,记录运行结果。3将转移指令JGE改为JG,JL,JLE分别运行记录排序结果,察看结果是否正确不对,并分析原因。四、实验报告或作业1分析程序,画出程序流程图2汇编,连接及调

18、试时产生的错误,其原因及解决办法。3记录JGE情况下的排序结果,同时比较将转移指令JGE改为JG,JL,JLE 时的排序结果,并分析结果正确与否,如果不正确,写出原因和解决办法。4思考:如果想外循环也用loop实现,应该怎样修改程序?BB实验四 分支程序设计A-A实验A (必做)一、 实验目的:1 掌握分支程序的设计方法2 掌握利用DEBUG修改参数、检查结果的方法。3 掌握汇编语言源程序的编辑、汇编、连接及调试过程。二、 实验内容1 编写一个程序,显示AL寄存器中的两位十六进制数2 编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字

19、符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。三、 实验准备1 编写实验内容要求的两个程序。2 写出调试以上程序,即修改程序参数,检查结果的操作方法。3 熟悉源程序汇编、连接命令的使用方法即要回答的内容。四、 实验步骤1 用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。2 对其进行汇编及连接,产生.EXE文件。3 对.EXE文件进行调试运行。a. 用DEBUG调试运行,学会修改AL内容的方法。b. 对DSPKEY.EXE键入不同的字符,分别进行调试。c. 在MS-DOS下运行这两个.EXE文件。五、 实验报告

20、要求 画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。六、 参考程序清单 (1) 显示AL中两位十六进制数程序:;DISPHEX.ASMCODE SEGMENT ASSUME CS:CODESTART: MOV AL,3EH MOV BL,AL MOV DL,AL MOV CL,4 SHR DL,CL CMP DL,9 JBE NEXT1 ADD DL,7NEXT1: ADD DL,30H MOV AH,2 INT 21H ;显示高位ASCII码 MOV DL,BL AND DL,0FH CMP DL,9 JBE NEXT2 ADD DL,7NEXT2: ADD DL,30H M

21、OV AH,2V AH,2 INT 21H ;显示低位ASCII码 MOV AH,4CH INT 21HCODE ENDS ;返回DOS END START(2) 显示键入字符程序;DISPKEY.ASMCODE SEGEMENT ASSUME CS:CODESTART: MOV AH,1 INT 21H ;等待键入字符,送AL CMP AL,0DH ;是否是回车符? JZ DONE ;是则转DONE退出程序 CMP AL,0 JB NEXT CMP AL,9 JA CHARUP MOV DL,AL MOV AH,2 INT 21H JMP STARTCHARUP: CMP AL,41H JB

22、 NEXT CMP AL,5AH JA CHRDNDISPC: MOV DL,C MOV AH,2 INT 21HNEXT: JMP STARTCHRDN: CMP AL,61H JB NEXT CMP AL,7AH JA NEXT JMP DISPCDONE: MOV AH,4CH INT 21HCODE: ENDS END STARTA-ABB实验B (选做)一、预习内容1分支程序设计方法。2利用转移指令jl、jmp实现多岔分支的方法。二、目的要求1掌握分支程序设计方法。2掌握利用转移指令jl、jmp实现多岔分支的方法。三、实验内容统计学生成绩result。设有10个学生的成绩分别为56、

23、69、84、82、73、88、99、63、100和80分。试编制程序分别统计低于60分、6069分、7079分、8089分、9099分及100分的人数,并分别存放到s5、s6、s7、s8、s9及s10单元中DSEG SEGMENT grade dw 56,69,84,82,73,88,99,63,100,80s5 dw 0s6 dw 0s7 dw 0s8 dw 0s9 dw 0s10 dw 0DSEG ENDSCSEG SEGMENT assume cs:CSEG, ds:DSEG start:mov ax, dseg mov ds, axmov cx,10mov bx,offset grad

24、ecompare:mov ax, bxcmp ax,60jl fivecmp ax,70jl sixcmp ax,80jl sevencmp ax,90jl eightcmp ax,100jne nine nine:inc s9jmp short change_addreight:inc s8jmp short change_addrseven:inc s7jmp short change_addrsix:inc s6jmp short change_addrfive:inc s5change_addr: mov ax, 4c00h int 21h CSEG ENDSend start实验步骤

25、:1阅读程序,将程序补充完整。2输入,汇编并连接此程序。3在DEBUG下运行此程序,记录运行结果。4单步运行程序,记录前五次执行转移指令后寄存器cs ip的值。四、实验报告或作业1分析程序,画出程序流程图。2汇编,连接及调试时产生的错误,其原因及解决办法。3每次执行转移指令时寄存器cs ip的值。4、最终运行结果,即s5、s6、s7、s8、s9及s10的值。5、思考:如何修改程序使源程序先统计s10,然后依次统计s9,s8,s7,s6,s5?BB实验五 子程序设计A-A实验A(必做)本实验的目的在于让读者掌握同一模块调用的方法。一、 实验目的1 掌握主程序与子程序之间的调用关系及调用方法。2

26、掌握子程序调用过程中近程调用与远程调用的区别。3 掌握通过堆栈转送参数的方法。二、 实验内容1 将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示.2 编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符b的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数).三、 实验说明1 第一个实验程序用子程序的近程调用实现

27、。由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查CS值是不变的。2 第二个程序是利用远调用的方法调用子程序的。在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。3 第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调

28、用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。四、 实验准备1 预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图。2 熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。五、 实验步骤1 编辑、汇编两个源程序,生成相应的可执行文件(。EXE)2 用DEBUG的R 命令,T 命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。3 检查程序执行的结果是否正确。六、 实验报告要求 1 分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程有何不同。

29、2 说明用堆栈传送参数的过程及其具体方法。3 分析实验结果及所遇到问题,并说明解决的方法。七、参考程序清单 (1) 码型转换程序清单:;CONV.ASNDATA SEGMENTBUF DB 0ABH,0CDH,0DEH,01H,02H,03HDB 3AH,4BH,5CH,6FHDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV CX,10 LEA BX,BUFAGAIN: MOV AL, BX CALL HEXASC INC BX LOOP AGAIN MOV AH,4CH INT 21HHE

30、XASC PROC NEARMOV DL,ALPUSH CXMOV CL,4SHR DL,CLPOP CXCALL DISP ;显示高位HEX数MOV DL,ALAND DL,0FHCALL DISPRETHEXASC ENDPDISP PROP CMP DL,9 JBE NEXT ADD DL,7NEXT: ADD DL,30H MOV AH,2 INT 21H ;显示 RET DISP ENDPCODE ENDS END START(2)统计并显示某键入字符的个数的程序: :COUNTER.ASMDATA SEGMENTCHAR DB bBUF DB 50H, ? 50H DUP(?)DA

31、TA ENDS MCODE SEGMENT ASSUME CS: MCODE, DS: DATASTART: MOV AX,DATA MOV DS,AX LEA DX,BUF MOV AH,9 INT 21H LEA SI BUF MOV CL, SI+1 MOV CH, 0 ;CX中为字符串长度 INC SI INC SI ;SI指向串首址TABLE MOV AL,CHAR MOV AH,0 ;AX中为待查字符 PUSH SI PUSH CX PUSH AX ; 参数送堆栈CALL CHECKPOP AX :统计个数在AL中 MOV DL,CHAR MOV AH,2 INT 21H MOV

32、DL,AL AND DL, 0FH CMP DL,9 JBE NEXT ADD DL,7NEXT: ADD DL,30H MOV AH,2 INT 21H ;显示统计个数 MOV AH,4CH INT 21HM CODE ENDSSCODE SEGMENT ASSUME CS:SCODECHECK PROC FAR PUSH BP MOV BP,SP MOV SI,BP+10 MOV CX, BP+8 MOV AX, BP+6 XOR AH, AHAGAIN: CMP AL.SI JNE NEXT1 INC AHNEXT1: INC SI LOOP AGAIN MOV AL, AH MOV B

33、P+10,AX POP BP RET 4CHECK ENDP END STARTA-ABB实验B 子程序设计一、预习内容1子程序调用方法和参数传递方式。2过程调用伪指令: PROC,ENDP和NEAR。3子程序调用中堆栈的用法。4简化格式程序设计方法。二、目的要求1掌握子程序调用方法和参数传递方式。2掌握过程调用伪指令: PROC,ENDP和NEAR。3理解子程序调用中堆栈的用法。4熟悉简化格式程序设计方法。三、实验内容显示学生名次表rank。要求接收从键盘输入的一个班的学生成绩,并存放于10字的grade数组中,其中grade+i保存学号为i+1的学生的成绩。然后根据grade中的学生成绩,

34、把学生名次填入10字的rank数组中,其中rank+i的内容是学号为i+1学生的名次。再按学号把名次从终端显示出来。源程序如下,模块层次如图所示,源程序已经完成了mian, input, rankp, output, bindec和dec_div模块的编写,模块decbin和crlf需要自己完成。.model small.stack.data grade dw 10 dup(?)rank dw 10 dup(?)count dw ?mess1 db Grade?,$mess2 db 13,10,Iput Error!,13,10,$mess3 db Rank:,$.codemain proc

35、far start : mov ax, data mov ds, ax call input call rankp call output mov ax, 4c00h int 21hmain endpinput proc near mov dx,offset mess1 mov ah,09 int 21h mov si,0 mov count,0 enter: call decibin inc count cmp dl, je store cmp dl,13 ;is it return? je exit2 jne error store: mov gradesi,bx add si,2 jmp

36、 enter error: lea dx,mess2 mov ah,09 int 21h exit2: mov gradesi,bx call crlf ret input endprankp proc near mov di,count mov bx,0 loop1: mov ax,gradebx mov word ptr rankbx,0 mov cx,count lea si,grade next: cmp ax,si jg no_count inc word ptr rankbx no_count: add si,2 loop next add bx,2 dec di jne loop

37、1 ret rankp endpoutput proc near lea dx,mess3 mov ah,09 int 21h mov si,0 mov di,countnext1: mov bx,ranksi call binidec mov dl, mov ah,02 int 21h add si,2 dec di jnz next1 call crlf ret output endpdecibin proc near dec_div proc near mov ax,bx mov dx,0 div cx mov bx,dx mov dl,al add dl,30h mov ah,02h

38、int 21h retdec_div endpcrlf proc near。crlf endpend main decibin endpbinidec proc near push bx ; push cx ; push si ; push di ; mov cx,100d call dec_div mov cx,10d call dec_div mov cx,1 call dec_div pop di ; pop si ; pop cx ; pop bx ; retbinidec endp 四、实验步骤1认真阅读程序,自己编写十进制到二进制转换子程序decibin和输出回车换行子程序crlf

39、,将程序补充完整,然后汇编、链接、生成可执行文件。2用DEBUG的断点命令和T命令运行此程序,观察并记录每次过程调用和进出栈指令前后(带;的语句)的SP和堆栈内容,如记录执行call input,call rankp,call output三条指令后sp,bp以及sp的值。3记录数据段各变量的最后结果。五、实验报告或作业1画出input,output和rankp模块的流程图。2汇编,连接及调试时产生的错误,其原因及解决办法。3记录执行call input ,call rankp,call output三条指令后sp,bp以及sp的值,并指出sp指向哪条指令。4画出堆栈满时堆栈存储区域的示意图。

40、5记录最后的输出结果。6思考: 如果想用堆栈传递参数,源程序应做何修改?BB实验六 I/O程序设计A-A实验A 一、预习内容1程序直接控制I/O方式。2I/O程序设计方法。3子程序设计方法二、目的要求1掌握程序直接控制I/O方式。2熟悉I/O程序设计方法。3继续熟悉子程序设计方法。三、实验内容用位触发方式(也即程序直接控制输出控制寄存器(I/O端口为61hhh )的第一位,使该位按所需要的频率进行1和0的交替变化,从而控制开关电路产生一串脉冲波形,这些脉冲经放大后驱动扬声器发声音)模拟枪响程序。程序如下,但其中有些语句错误,需要修改后才能正确运行。code segmentmain proc f

41、arassume cs:codestart: mov cx,50d new_short: push cx call shoot mov cx,0f000h silent: loop silent pop cx loop new_short mov al,48h out 61h,al mov ax,4c00h int 21hmain endp shoot proc near mov dx,140h mov bx,20h in al,61h and al,11111100b sound: xor al,2 out 61h,al add dx,9248h mov cl,3 ror dx,cl mov

42、 cx,dx and cx,1ffh or cx,1000hdelay: push cxwait: loop wait pop cx loop delay dec bx jnz sound and al,11111100b out 61h,al retshoot endpcode endsend start实验步骤1认真阅读程序,将源程序中的错误找出后修改。2编译,链接,生成可执行文件,记录编译过程中的错误,并分析原因。3执行程序,调式程序,直到可以清楚听到枪响的声音。四、实验报告或作业1分析程序,画出程序流程图。2汇编,连接及调试时产生的错误,其原因及解决办法。3思考:试将程序中的黑体部分修改为 wait: loop wait,再编译运行程序,是否能听到枪声,为什么?A-ABB实验B (选做)一、实验目的 1掌握输入输出程序设计的概念和方法。 2了解PC机外围芯片8255、8259的功能。 3学习如何在PC机上编写具有输入输出功能的程序,包括8255、8259芯片的使用方法二、实验说明 本实验要求自行编写一个键盘输入处理程序,它可以完成键盘字符的读入并进行屏幕显示,本实验要利用IBMPC系统的

温馨提示

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

评论

0/150

提交评论