微机原理实验指导书_第1页
微机原理实验指导书_第2页
微机原理实验指导书_第3页
微机原理实验指导书_第4页
微机原理实验指导书_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

微型计算机原理与应用实验指导书上 海 大 学 通 信 学 院2010 年 4 月PC微机原理实验一一、 目的:掌握PC机DEBUG调试程序有关命令的操作及8086各类指令的功能。二、 要求:在PC机上完成下列程序的调试运行,并写出运行结果。1DEBUG的基本操作:(详细内容请参阅教材“4.5程序的调试,P173”和“附录F调试程序DEUBG的使用,P499”)(1) 从WINDOWS进入DOS之后,输入命令启动DEBUG:C:DEBUG 回车(2) 输入R命令,查看和记录CPU各个寄存器的内容:-R回车 看到什么?(3) 输入A命令,汇编下面的字符“WINDOWS”显示程序:-A100 ;从偏移地址是0100H处开始写指令MOVAH, MOVDL, 57 ;57H 是“W”的ASCII码INT21;INT 21是DOS 功能调用,AH=2代表2号功能;这3句合起来的功能是:显示DL中的字符MOVDL, 49INT 21MOVDL, 4EINT 21MOVDL, 44INT 21MOVDL, 4FINT 21MOVDL, 57INT 21MOVDL, 53INT 21INT3 ; 功能是产生一个断点,不要省略(4) 输入U命令反汇编上面的程序:-U100问:这里100代表什么?(5) 输入G命令连续运行上面的程序,记录运行结果:-G=100(6) 输入E命令把上面程序中的数据57,49,4E,44,4F,57,53依次分别改为57,45,4C,43,4F,4D,45:-E103 回车(以下同)-E107-E10B-E10F-E113-E117-E11B(7) 输入D命令查看程序机器码的存放情况:-D100 11E ;看从100开始到11E的机器码(8) 输入G命令再连续运行程序,并记录运行结果:-G=100(9) 依次输入下面的T命令(单步执行)和G命令(设置断点并启动运行),记录各命令的运行结果:-T=100 回车-G=100106 回车-G=10010A 回车-G=10010E 回车-G=10011E 回车注意:下面第2第8段程序是7个实用的小程序,若不小心打错指令,可以这样修改:例如:CS:0100B300MOVBL,0 0102 53PUSHBX 0103B220 LP1:MOVDL,20要修改“PUSHBX”,因为这条指令的IP是0102,所以按以下操作:-A 0102 回车,然后把正确的指令打入,“-A ”是汇编指令。如果要查看0100以后的指令及相应的机器代码,可以-U 0100 回车 ,能够看到CS:0100开始的指令及相应的机器代码。“-U ”是反汇编若发现有误用,用“-A XXXX 回车”,重打这条指令即可2编制一个能在CRT上连续显示A,B,C,DZ大写英文字符的源程序,并在源程序下汇编调试机运行。参考源程序(DEBUG调试环境中,源程序的十六进制数后面不写H):CS:0100B300MOVBL,0010253PUSHBX0103B220LP1:MOVDL,200105B402MOVAH,020107CD21INT2101095BPOPBX010A88D8MOVAL,BL010CFEC0INCAL010E3C1BCMPAL,1B01107502JNZLP2(0114) ;不能写LP2,应写01140112B001MOVAL,01011488C3LP2:MOVBL,AL011653PUSHBX;01170440ADDAL,40011988C2MOVDL,AL011BB402MOVAH,02011DCD21INT21011FB9FFFFMOVCX,FFFF012249DL:DECCX012375FDJNZDL(0122);不能写DL,应写01220125EBDCJMPLP1(0103);按CTRL+C,可中止程序运行。运行正确后,改写程序为0,1,2,3,4,5,7,8,9的循环显示。3编制一个3字节压缩BCD加法源程序若要实现123456+456789,根据低地址放低字节,高地址放高字节原则,请用E命令在DS:1000-1002单元正确存放被加数123456,在DS:1010-1012单元正确存放加数456789。参考程序如下:CS:0200BE0010MOVSI,10000203BF1010MOVDI,10100206BB2010MOVBX,10200209B103MOVCL,3020BB500MOVCH,0020DF8CLC020E8A04MAD:MOVAL,SI02101205ADCAL,DI021227DAA02138807MOVBX,AL021546INCSI021647INCDI021743INCBX0218E2F4LOOPMAD(020E)021AF4HLT运行结果:1020=_ 1021=_ 1022=_ SI=_ DI=_ BX=_相加后结果是:_F标志: O=_ S=_ Z=_ A=_ P=_ C=_注意:按CRT的实际显示填写。(参考书P502)思考:DAA的作用,如果没有DAA结果会如何?4一字节十六进制数转换为ASCII码(只考虑大写字母)用E命令在DS:1000单元中存放十六进制数5A调试运行下面程序:CS:03008D360010LEASI,100003048D3E2010LEADI,102003088A04MOVAL,SI030A240FMOVBL,AL030C240FANDAL,0F030EE80E00CALLCHANG(031F)031180E30ANDBL,F00314B90400MOVCX,40317D2EBSHRBL,CL031988D8MOVAL,BL031BE80100CALLCHANG(031F)031EF4HLT031F3C09CHANG:CMPAL,0903217602JBEAD30(0325)03230407ADDAL,0703250430AD30:ADDAL,3003278805MOVDI,AL032947INCDI032AC3RET运行结果:1020=_ 1021=_思考:NOP 是空操作指令,若在ADDAL,07后面,加一条NOP,结果会如何?5、搜索字符串结束标志,统计搜索的字符个数用E命令在DS:1000开始的单元中存放若干个ASCII字符,如:30,31,3239,0D。(0D作为字符串结束标志),调试运行下面程序CS:01008D3E0010LEADI,10000104B200MOVDL,00106B00DMOVAL,0D0108AEAGAIN:SCASB ;书P150,AL减去DI,INC DI01097404JE DONE(010F)010BFEC2INCDL010DEBF9JMPAGAIN(0108)010F8D1E2010 DONE:LEABX,102001138817 MOVBX,DL0115F4 HLT运行结果:搜索的字符个数存放在_单元,该单元的值是_AL=_ BX=_ DL=_思考:把SCASB换成通用指令,如何改?6、编制一个将N个带符号的正、负数分开的源程序。设N=10,用E命令在DS:1000-1009单元存放10个数(1字节): 01,02,03,04,06,FF,80,81,06,07将该数据块正、负数分开,正数放在1010为首地址的单元中,负数放在1020为首地址的单元中。参考程序:CS:0300BE0010MOVSI,10000303BF1010MOVDI,10100306BB2010MOVBX,10200309B90A00MOVCX,000A030CAC G1:LODSB ;书P150,SI送给AL;INC SI020DA880TESTAL,80030F7503 JNZMINUS(0314)0311 AA STOSB ; 书P150,AL送给DI;INC DI0312EB05JMPAGAIN(0319)0314887DFMINUS: XCHGBX, DI0316AASTOSB031787DFXCHGBX, DI031949AGAIN:DECCX030A75F0 JNZG1(030C)031CF4HLT运行结果:1010=_ 1011=_ 1012=_ 1013=_ 1014=_1015=_ 1016=_ 1020=_ 1021=_ 1022=_思考:二条XCHG作用是什么?如果不用STOSB(功能见书P150),程序能更简洁吗? 7、编制一个将N个ASCII字符进行偶校验的源程序。设N=8,用E命令在DS:10001007单元放8个ASCII字符31,32,33,34,41,42,43,44参考程序:CS:04008D360010LEASI,100004048D1E1010LEABX,10100408B90800MOVCX,8040BACAGAIN:LODSB040C20C0ANDAL,AL040E7A07JPENEXT(0417)04100C80ORAL,8004128807MOVBX,AL041443INCBX0415EB03JMPLP1(041A)04178807NEXT:MOVBX,AL041943INCBX041A49LP1:DECCX041B75EEJNZAGAIN(040B)041DF4HLT运行结果:10001007单元内容:_10101017单元内容:_改上述程序进行奇校验,写出运行结果:10001007单元内容:_10101017单元内容:_8、找出无序的有符号数中的最小值和最大值用E命令在DS:1000100A中存放11个数:0A,80,84,82,83,81,01,02,05,04,03,其中0A为数列的个数。调试运行下面程序:CS:02008D1E0010LEABX,100002048D361010LEASI,101002088D3E2010LEADI,1020020CB500MOVCH,0020E8A0F MOVCL,BX021049DECCX,0211 43 INCBX02128A07MOVAL,BX02148804MOVSI,AL02168805MOVDI,AL021843INCBX02198A07AGAIN:MOVAL,BX021B3A04CMPAL,SI021D740CJENEXT(022B)021F7F04 JGGET(0225)02218804MOVSI,AL0223EB06JMPNEXT(022B)02253A05GET:CMPAL,DI02277C02 JLNEXT(022B)02298805MOVDI,AL022B43NEXT:INCBX022C49DECCX022D75EAJNZAGAIN(0219)022FF4HLT运行结果:1010=_ 1020=_若求无符号数中的最小值和最大值,请修改并调试运行程序。PC 微机原理实验二一、 目的:掌握8088汇编语言程序的编辑、宏汇编、连接及运行的操作步骤,进一步掌握编制源程序的格式,了解编辑程序EDIT、宏汇编MASM、联机程序LINK的功能,熟悉具有扩展名.ASM、.OBJ、.LST、.EXE等文件查询。二、 要求:在DOS环境下,用EDIT文件编辑*.ASM源程序并存盘,用MASM文件汇编无误,用LINK文件连接无误,然后在DOS下运行*.EXE文件,用DEBUG文件检查运行结果。最后写出程序运行结果。运行以下程序(ASCORT.EXE)后,检测结果是否按从小到大的次序(ASCII码值)。排序算法可以参考教科书P114 例4.3.10。显示一串字符可以参考教科书P146例4.3.19。例如要显示BUF1中的字符,可以这样写:MOV DX,OFFSET BUF1MOV AH,9INT 21H ;(AH)=9 显示一串字符,首地址:DS:DX(书P146)源程序如下:NAME: ASCSORT.ASMSTACKSEGMENT STACKDW 256 DUP(?)TOPLABEL WORDSTACKENDSDATASEGMENTBUF1 DB 43H,47H,46H,41H,42H,30H,31H,32H,33H,34H,$BUF2 DB 0DH,0AH,$ ;使光标回车换行(参书P147)DATA ENDSCODESEGMENTASSUME CS,CODE, DS:DATA, SS:STACKSTART:MOV AX,DATAMOV DS,AX MOV AX,STACKMOV SS,AXMOV SP,OFFSET TOP ;前几句几乎是固定格式 MOV DX,OFFSET BUF1MOV AH,9INT 21H ; 显示BUF1中未排序的原始数据MOV DX,OFFSET BUF2MOV AH,9INT 21H ; 使光标回车换行(参考书P147)MOV CX, 10; 因为BUF1是10个字节;下面是排序算法的主体部分MOV SI,CX; SI指向DATBUF最后一单元加1MOV BL,0FFH; BL中置标志0FFHLOOPA:CMP BL,0FFH; (BL)不为0FFH则转DONEJNZ DONEMOV BL,00DEC CX;外循环修正CXJZ DONEPUSH SI; SI, CX-堆栈PUSH CX;LOOPB:DEC SI; 内循环修正指针MOV AL,SICMP AL,SI-1JAE LAXCHG AL,SI-1MOV SI,ALMOV BL,0FFHLA:LOOP LOOPBPOP CXPOP SIJMP LOOPADONE: MOV DX,OFFSET BUF1;MOV AH,9;INT 21H ; 显示BUF1中已经排序的有序数据MOV CX,LENGTH DATBUF;-MOV AH,4CHINT 21H;返回DOS;-CODEENDSEND START思考:(1)如果要求程序执行后,显示Please enter string:142AFC7 回车 ;(当场输入原始数据)1247ACF ;(排序后的结果)该如何修改程序? (2)实验一的第3题“编制一个3字节压缩BCD加法源程序”改写成标准汇编 例如,至少写成这样:A+B=C INPUT A = ;输入被加数 INPUT B = ;输入加数 RESULT = ;计算的和提示:显示程序可以参考书P146PC微机原理实验三(PC机发声程序)一. 目的:了解8254定时器、8255可编程外围接口芯片的工作原理,掌握对这些芯片的编程方法二. 要求:根据参考例子,自己编写一个简单的曲子。 注:可以参考书P400“扬声器驱动原理逻辑图”PC机上的大多数输入输出(IO)都是由8255可编程序外围接口芯片管理的。它包括三个8位寄存器,两个用于输入功能,一个用于输出功能。输入寄存器分配的IO端口号为60H和62H,输出寄存器分配的IO端口号为61H。输出寄存器中的两位来选择扬声器的驱动方式,当输出寄存器(IO端口6 1H)的第0位为l时,控制8254定时器来驱动扬声器,当第l位为l时,扬声器的门电路接通,并一直保持到位1变为0时关闭。连接到扬声器上的是8254的2号定时器,它实际上是一个振荡电路,此电路向扬声器发送指定频率的脉冲,当输出端口61H控制扬声器为接通状态时,就发出了一定频率的声音。 PC机内的R0M BIOS中有个BEEP子程序,它能根据BL中给出的时间计数值控制8254定时器,产生持续时间为1个或几个05秒,频率为896Hz的声音,这个子程序的用途是当“加电自测系统发现硬件错误后,由ERRORBEEP处理程序调用BEEP子程序,使扬声器发出“嘟嘟的信号。BL中的时间计数值由ERRORBEEP程序设置为533H,BEEP子程序将此计数值送给8254的定时器2来产生896Hz的声音,然后BEEP又将AL的第0位和第l位置1,并把AL的值送到8255的输出寄存器(1O端口61H),使扬声器接通发出声音。 实际上BEEP是一个很好的通用发声程序,我们可以利用并修改BEEP,使其产生任一频率的声音。为此我们需要做两点修改,首先,BEEP程序只能产生896Hz的声音,我们的通用发声程序应能产生任一频率的声音。其次,BEEP产生声音的持续时间(音长)只能是05秒的倍数,我们希望声音的持续时间易于调整,例如可以是l0ms的倍数。 我们知道BEEP是将计数值533H送给定时器2产生896Hz的声音的,那么产生其它频率 声音的时间计数值应为: 533H896给定频率=l23280H给定频率 假定发声的频率存放在D1寄存器中,下面的指令在AX中得到送往定时器2的计数值: MOV DX,l2H MOV AX,533H*896 D DI 10ms的延迟时间可以简单地通过执行循环指令取得: WAIT: MOV CX2801DELAY: LOOP DELAY 注意:这个时间是在老的8086上运行的时间,现代“奔腾”要快得多,必须调整! 如果要产生与l0ms成倍数的延迟时间,可在BX寄存器中放入倍数。例如要产生l秒的持续 时间,则在BX中放入100,以控制LOOP指令执行1002801次,也就是1 0ms的100倍。指令 如下: MOV BX,100 WAIT: MOV CX,2801 DELAY: LOOP DELAY DEC BX JNZ WAIT 这样我们就能在修改后的BEEP程序的基础上编写一个任一频率(由Dl指定)和任一持续时 间(由CX和BX指定)的通用发声程序。它包括三个步骤: 1在2号定时器中的43端口送一个特定的数OB6H(1 0 11 0 1l OB),此数对定时器的方式寄存器进行初始化,使定时器2准备接收计时常数。 2在2号定时器中的4 2H端口装入一个l 6位的计时常数(533H896频率),以建立将 要产生的声音频率。3把输出端口61H的0、1两位置1,发出声音。下面举例说明8253计数器2产生一定频率的方波并送至扬声器发音的程序 例:欲使8253的计数器2产生600 Hz的方波,经滤波后送至扬声器发音,当按下任一键时声音停止。试编写此程序。8253的端口地址为40H43H,8255A的端口地址为60H63H。 解:计数器2的时钟输入:T2=tf2=t119 MHz840 ns 方波发生器OUT2的输出周期为:1600 Hzl.665 ms计数器2方波发生器的计数初值为:l.665 ms840 nsl983利用上述办法,编制的源程序如下。STACK SEGMENT PARA STACK STACK DB 256 DUP(0)STACK ENDSDATA SEGMENT PARA PUBLIC DATAFRED DW l983 ;119 MHz600 Hz=1983为计数值DATA ENDSCODE SEGMENT PARA PUBLIC CODEASSUME CS:CODE,DS:DATA,SS:STACK;-START PROC FARPUSH DS MOV AX,0 ;为正确返回DOS保存地址PUSH AX MOV AX,DATAMOV DS,AX ;设置DS指向DATA数据段;-IN Al, 61H ;读PB口当前状态0R Al, 03H ;使PB1 PB0均为1OUT 6lH, AL ;输出PB口以使扬声器发声;-MOV AL,101101108 ;控制字D7D6=l0选择计数器2,D5D4=11先写低8位;再写高8位,D3D2D1=011工作在方式3(方波发生器),;D0=0二进制计数OUT 43H,AL ;命令写入8253控制寄存器;-MOV BX,FRED ;设分频计数值(1983)MOV Al,BL ;先写低位字节OUT 42H,ALMOV AL,BH ;再写高位字节OUT 42H,AL;- MOV AH,0 ;INT l6H的功能号0调用是从键盘读入字符,出口是AL中为;键盘输入字符的ASCIl码(见BIOS中断调用)。INT l6H;-IN AL,61H ;读PB口的当前状态AND AL,11111100B ;使PB,、PB。均为OOUT 61HAL ;扬声器停止工作;-RET ;结束,返回DOSSTART ENDP乐曲程序 利用通用发声程序,可以编写演奏乐曲的程序。乐曲是按照一定的高低、长短和强弱关系组成的音调,在一首乐曲中,每个音符的音高和音长与频率和节拍有关 组成乐曲的每个音符的频率值和持续时间是乐曲程序发声所需要的两个数据。音符的频率可以,音符的持续时间根据乐曲的速度及每个音符的节拍数来确定。在44(四四拍)中,四分音符为一拍,每小节4拍,全音符持续4拍,二分音符持续2拍,四分音符持续l拍,八分音符持续半拍等。如果我们给全音符分配1秒的时间,则二分音符的持续时间为05秒(50 X1 0ms),四分音符的持续时间为O25秒(251 0ms),八分音符的持续时间为01 25秒(1 251 0ms)。 知道了音调与频率和时间的关系,我们就可以按照乐曲的曲谱将每个音符的频率和持续时间定义成两个数据表,然后编写程序依次取出表中的频率值和时间值,调用通用发音程序发出各种声音。编写乐曲程序可分为四个步骤: 1 为演奏的乐曲定义一个频率表(FREQ)和一个节拍时间表(TIME),例如: FREQ DW 330,294,262,294,3 DUP(330) ;1,2小节DW 294,294,294,330,392,392 ;3,4小节DW 330,294,262,294,4 DUP(330) ;5,6小节DW 294,294,330,294,262,0FFFFH ;7,8小节,其中0FFFFH是结束符TIME DW 6 DUP(25),50 ;l,2小节Dw 2 DUP(25,25,50) ;3,4小节DW l2 DUP(25),1 00 ;58小节2分别将两个表的偏移地址放入Sl和BPLEA SI,FREQLEA BP,DS:TIME3从表中取出音符的频率放入DI,取出音符的持续时间放入BXMOV DI,SIMOV BX,DS:BP4调用通用发音子程序发出音调下面是按某乐谱编写的一个演奏程序,同时在屏幕上显示字符。调试程序,若调不通,请仔细检查和修改;调通后说明具体完成什么功能?画出程序的流程框图。dseg segmentfreg dw 262, 294,330,349,392,440,494times dw 7 dup(65535)num db ?num1 db 3count db 7mess db *musci1.exe*,$dseg endsstack segment para stack stack dw 100 dup(?)stack endscseg segmentassume cs:cseg,ds:dseg,ss:stackmain proc farstart: push dssub ax,axpush axmov ax,dseg mov ds,ax mov es,ax mov al,1ch mov ah,35h int 21h push es push bx push ds mov dx,offset musc mov ax,seg musc mov ds,ax mov al,1ch mov ah,25h int 21h pop ds in al,21h and al,0feh out 21h,al sti mov cl,0 mov byte ptr num,cl lp1: mov cl,byte ptr num mov al,cl inc al cmp al,1bh jnz lp2 mov al,1 lp2: mov cl,al mov byte ptr num,cl add al,40h mov dl,al mov ah,2 int 21h mov dh,10 lp4: mov cx,0 lp3: loop lp3 dec dh jnz lp4 mov al,byte ptr num1 xor al,0 jnz lp1 pop dx pop ds mov al,1ch mov ah,25h int 21h in al,21h or al,1 out 21h,al cli retmain endp musc proc near push ds push ax push cx push dx mov ax,dseg mov ds,ax dec count jnz exit mov dx, offset mess mov ah, 9 int 21h mov si, offset freg mov bp, offset times loop1:mov di,si cmp di,0 je exit1 mov bx,ds:bp call sound add si,2 add bp,2 jmp loop1 exit1: mov byte ptr count,7 de

温馨提示

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

评论

0/150

提交评论