8086微机原理实验之子程序及中断实验
- 格式:doc
- 大小:58.50 KB
- 文档页数:3
汇编语言程序设计实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科131LEA DX,FNAMEMOV CX,0 ;语句1INT 21HJC EXITMOV FNUM,AXMOV BX,AX ;语句2MOV CX,100MOV AH,40HLEA DX ,BUFINT 21HMOV BX,FNUMMOV AH,3EHINT 21HEXIT:MOV AH,4CHINT 21HCODE ENDSEND START使用相应的文本编辑器建立文件LAB7.asm,内容如上所示。
2.汇编并运行此程序后,在当前目录建立的文件名是什么?其内容是什么?1>汇编:C:\masm> masm lab7;2>连接:C:\masm> link lab7;3>运行:C:\masm> lab73.若将语句1 改为mov cx,1,则运行情况与前面会有什么区别?4.若将语句1 改为mov cx,2,则运行结果同上会有什么不同?并简要说明此语句的作用.5.若将语句2 改为mov bx,1,则运行结果会有什么不同?简要说明则语句的作用.实验二:编写0 号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回到DOS。
源程序下:assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset domov ax,0mov es,axmov di,200hmov cx,offset doend-offset do ;安装中断例程cldrep movsbmov word ptr es:[0],200hmov word ptr es:[2],0 ;设置中断向量表mov dx,0ffffhmov bx,1 ;测试一下div bxmov ax,4c00hint 21hdo:jmp short dostartdb 'divide error!'dostart:mov ax,0mov ds,axmov si,202hmov ax,0b800hmov es,axmov di,160*12+60mov cx,13s:mov al,ds:[si]mov ah,15mov es:[di],axinc siinc diinc diloop smov ax,4c00hint 21hdoend:nopcode endsend start3.若将语句1 改为mov cx,1,文件为只读。
8086微机原理实验报告实验名称:8086微机原理实验实验目的:1.深入了解8086微处理器的内部结构和指令系统。
2.掌握汇编语言的编程方法和技巧。
3.熟悉微机系统的输入输出操作原理。
4.掌握8086微机系统的调试方法和程序调试技巧。
实验器材:1.8086微处理器芯片2.Intel 8086学习板3.编程器4.示波器5.实验箱实验步骤:1.熟悉8086微处理器的内部结构和指令系统在开始实验前,首先需要熟悉8086微处理器的内部结构和指令系统。
通过阅读教材和讲义,了解到8086微处理器采用16位结构,具有4个寄存器组,支持16种不同寻址方式的指令。
熟练掌握常用的指令系统和汇编语言的编程方法。
2.设计并编制简单的汇编程序在熟悉8086微处理器的内部结构和指令系统后,我们开始设计并编制简单的汇编程序。
本实验中,我们编写了一个简单的汇编程序,用于实现两个数的加法操作,并将结果存储在内存中。
程序中使用了mov指令将操作数送入寄存器,add指令将它们相加,再用mov指令将结果存储到内存中。
程序流程图如下所示:a. 将第一个数送入累加器A中。
b. 将第二个数送入寄存器B中。
c. 执行add指令,将A和B相加,结果保存在A中。
d. 将结果存储到内存中。
e. 程序结束。
3.调试程序并进行测试在完成汇编程序的编写后,我们需要使用调试器对程序进行调试,并进行测试。
首先,将程序加载到学习板上进行调试。
在调试过程中,我们使用示波器观察各个信号的波形,以确定程序的正确性。
通过逐步单步执行程序并观察寄存器和标志位的变化,我们验证了程序的正确性。
接下来,我们使用输入设备输入两个数,并观察输出结果是否正确。
测试结果表明程序正确实现了两个数的加法操作。
4.总结体会和改进建议通过本次实验,我们深入了解了8086微处理器的内部结构和指令系统,掌握了汇编语言的编程方法和技巧,熟悉了微机系统的输入输出操作原理,以及掌握了8086微机系统的调试方法和程序调试技巧。
实验一循环程序、分支程序与运算程序的设计一. 实验内容1.在ABC地址处有20个字节数据,今要求传送到CBA地址处,并在屏幕上显示目的串的内容。
试用两种方法实现。
(字节串传送,字节传送循环)2.以BLOCK1和BLOCK2开头的2个字符串,其长度均为LEN,试编程实现:(1)将BLOCK1开头的字符串送到BLOCK2开始的内存空间。
(2)将BLOCK1开始的内存空间全部清零。
3.试编一程序,要求比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则屏幕显示“MATCH”,若不相同则屏幕显示“NO MATCH”4.在ABC和BCD两地址起,各有两个字节的无符号数,试编程实现这两个无符号数的加法以及减法运算,并将结果分别存放到CBA和DCB开始的存储单元中去。
二. 实验目的:1.使学生掌握MASM汇编环境下程序的编辑、编译、连接、调试过程及方法。
2.掌握程序框图的设计方法;3.掌握分支程序的设计方法;4.掌握循环程序的设计方法;三. 实验说明1.实验之前,一定写好预习报告(包括画出程序框图;写出程序),否则不准做实验;2.调试程序程序,改正语法错误和其他错误。
四. 实验报告要求:1.画出程序框图;2.写出预习过程中所写的两个程序;3.写出调试之后的程序和两个程序;实验二主程序与子程序的设计一. 实验内容1.试用子程序结构编写一程序:从键盘输入一个2位十进制的月份数(01~12),然后显示出相应的英文缩写名。
提示:根据题目要求实现的功能,可编写用一个主程序MAIN分别调用几个子程序。
(1)INPUT从键盘接收一个2位数,并把它转换为对应的二进制数。
(2)LOCATE 把输入的月份数与其英文缩写名(如JAN,FEB,MAR,APP,MAY,JUN等)对应起来,制成一个字符表以便查找。
DISPLAY 将找到的缩写字母在屏幕上显示出来,显示可用DOS所提供的显示功能(INT 21H的09号功能)。
微机实验报告第一部分:8086汇编语言程序设计一、实验目的通过上机练习,初步掌握8086的指令系统,熟悉8086汇编语言程序的编写格式,学会编写简单的汇编语言应用程序,初步学会使用DEBUG调试工具。
二、实验题目(一)编程实现从字符串中查找特定的字符,记录特定字符的个数,并将结果在屏幕上显示,同时退出并返回DOS。
(要求字符串从键盘上输入)1、流程图2、实验程序及注释DATA SEGMENTBUFSIZE DB 20 ;数据段ACTCHAR DB ? ;定义字符串CHARTEXT DB 20 DUP(?) ;给输入字符分配内存DB '$'CNT DB 0 ;给计数器分配内存STRING1 DB 'PLEASE INPUT THE STRING:','$'STRING2 DB 0AH,0DH,'INPUT THE WORD YOU WANT TO CHECK:','$' STRING3 DB 0AH,0DH,'THE NUMBER OF THE WORD IS:','$'DATA ENDS ;数据段结束COSEG SEGMENT ;代码段ASSUME CS:COSEG,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV DX,OFFSET STRING1 ;显示提示语:请输入字符串MOV AH,09H ;输出字符串STRING1INT 21HMOV DX,OFFSET BUFSIZE ;从键盘输入字符串存入BUFSIZEMOV AH,0AH ;并送显INT 21HMOV DX,OFFSET STRING2 ;显示提示语:想查询的字符是MOV AH,09H ;输出字符串STRING2INT 21HMOV AH,01H ;从键盘上输入字符到AL中并送显INT 21HMOV BX,OFFSET CHARTEXT ;将字符串首地址存入BXMOV CL,ACTCHAR ;置循环次数CX=字符串长度XOR CH,CHLP1: CMP AL, [BX] ;字符串从头开始与键入字符AL比较JZ LP2 ;相等则转入LP2INC BX ;指针指向字符串下一个字符DEC CX ;循环次数减一JNZ LP1 ;若还有未比较的字符,继续循环LP1JMP FINI ;若全部比较完毕,跳转FINILP2: INC CNT ;计数器增一INC BX ;指针指向字符串下一个字符DEC CX ;循环次数减一JNZ LP1 ;若还有未比较的字符,跳至LP1 FINI: MOV DX,OFFSET STRING3 ;显示提示语:所查询的字符个数:MOV AH,09HINT 21HMOV AL,CNT ;将计数器的值送ALAAM ;将此值转换成非压缩BCD码ADD AH,30H ;将BCD码转换为ASCⅡ码MOV DL,AH ;高位送显MOV AH,02HINT 21HMOV AL,CNT ;再将计数器的值送ALAAMADD AL,30H ;将BCD码转换为ASCⅡ码MOV DL,AL ;低位送显MOV AH,02HINT 21HMOV AH,4CH ;结束INT 21HCOSEG ENDS ;代码段结束END START ;程序结束3、运行结果PLEASE INPUT THE STRING(先输入字符串):ASDFAAD↙INPUT THE WORD YOU WANT TO CHECK(输入待查找字符): A↙THE NUMBER OF THE WORD IS(数量为):3↙PLEASE INPUT THE STRING(先输入字符串):ASDFAAD↙INPUT THE WORD YOU WANT TO CHECK(输入待查找字符):9↙THE NUMBER OF THE WORD IS(数量为):0↙PLEASE INPUT THE STRING(先输入字符串):ASDFAAD↙INPUT THE WORD YOU WANT TO CHECK(输入待查找字符): S↙THE NUMBER OF THE WORD IS(数量为):1↙4、程序改进○1循环次数的改进原来的程序:MOV CX,19改进原因:此程序表明无论输入的字符串多长,即使没有达到限定的最大字符串的长度,也要循环19次。
汇编语⾔程序设计实验四:8086标志寄存器及中断实验任务1task1.asm源码:assume cs:code, ds:datadata segmentx dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031hy dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912hdata endscode segmentstart:mov ax, datamov ds, axmov si, offset xmov di, offset ycall add128mov ah, 4chint 21hadd128:push axpush cxpush sipush disub ax, axmov cx, 8s: mov ax, [si]adc ax, [di]mov [si], axinc siinc siinc diinc diloop spop dipop sipop cxpop axretcode endsend start关于add指令的调试过程截图如下:由图可知add指令使得ZF标志位由NZ变为ZR,CF标志位由NC变为CY,可知运算结果为0且在运算中由最⾼位向更⾼位产⽣了进位。
关于inc指令的调试过程截图如下:由图可知inc指令使得ZF标志位由NZ变为ZR,可知运算结果为0,⽽CF未曾改变。
line31~line34的4条inc指令,不能替换成如下代码,原因是:该题⽤adc指令进⾏⼤整数加法,期间需要⽤到CF标志位的数值,⽽上⾯已经验证过add指令会对CF标志位产⽣影响,故不能替换。
add si, 2add di, 2128位加之前数值截图:完成128位加之后数值截图(有变化):实验任务2task2.asm源码:assume cs:code, ds:datadata segmentstr db 80 dup(?)data endscode segmentmov ds, axmov si, 0s1:mov ah, 1int 21hmov [si], alcmp al, '#'je nextinc sijmp s1next:mov ah, 2mov dl, 0ahint 21hmov cx, simov si, 0s2: mov ah, 2mov dl, [si]int 21hinc siloop s2mov ah, 4chint 21hcode endsend start运⾏结果截图:line11-18:获取键盘输⼊的值并赋值给ds:[si] ,若为“#”,则跳转到next处,否则si++后再次重新进⼊本循环。
微机原理上机实验报告实验八:8086中断实验实验十二:步进电机实验微机原理上机实验(八)实验报告实验八:8086中断实验一、实验目的1、了解8086内部响应中断的机制;掌握中断向量的作用。
2、利用实验仪上单脉冲、74HC244电路,不使用8259,实现一个中断实例。
3、复习本节实验内容,可尝试自行编写程序,做好实验准备工作,填写实验报告。
二、实验内容1、编制程序:拨动单脉冲开关,“”送给8086的INTR,触发中断;8086通过INTA信号,读取中断向量;8086计数中断次数,显示于F5区的数码管上注意:给INTR高电平信号,8086就会相应中断,所以实验开始前,保证单脉冲开关给8086低电平;中断程序中,加一个较长的延时程序,在中断结束前,有时间拨动单脉冲开关,恢复给8086低电平。
三、实验原理图本实验,通过F4区的8个拨动开关,给74HC244设定中断向量;本实验的中断向量是08H,即IN7-IN0位数据是00001000。
同学可以自定义中断向量,实验程序中处理中断向量部分程序作相应调整四、实验步骤1、连线说明:B4区:CS244、BLE ——C1区:GNDB4区:RD(IO区)——A3区:INTAA3区:INTR ——B2区:单脉冲B4区:JP57(D0..D7) ——A3区:JP41B4区:JP52(IN0..7) ——F4区:JP27(1..8)D3区:CS、A0、A1 ——A3区:CS1、A0、A1D3区:PC0、PC1 ——F5区:KL1、KL2D3区:JP20、B、C ——F5区:A、B、C2、运行程序3、实验开始前,保证单脉冲开关给8086低电平;运行程序;向下拨动开关(触发中断),立即向上拨动开关,产生一个“”,观察结果,数码管上显示的次数与拨动开关次数是否对应。
五、实验代码EXTRN InitKeyDisplay:NEAR, Display8:NEAR_STACK SEGMENT STACKDW 100 DUP(?)_STACK ENDS_DATA SEGMENT WORD PUBLIC 'DATA'BUFFER DB 8 DUP(?)Counter DB ?ReDisplayFlag DB 0_DATA ENDSCODE SEGMENTSTART PROC NEARASSUME CS:CODE, DS:_DATA, SS:_STACKMOV AX,_DATAMOV DS,AXMOV ES,AXNOPCALL InitKeyDisplay ;对键盘、数码管控制器8255初始化CALL WriIntverMOV Counter,0 ;中断次数MOV ReDisplayFlag,1 ;需要显示STI ;开中断START1: LEA SI,BufferCALL Display8CMP ReDisplayFlag,0JZ START1CALL LedDisplayMOV ReDisplayFlag,0JMP START1WriIntver PROC NEARPUSH ESMOV AX,0MOV ES,AXMOV DI,20HLEA AX,INT_0STOSWMOV AX,CSSTOSWPOP ESRETWriIntver ENDPLedDisplay PROC NEARMOV AL,CounterMOV AH,ALAND AL,0FHMOV Buffer,ALAND AH,0F0HROR AH,4MOV Buffer + 1,AHMOV Buffer + 2,10H ;高六位不需要显示MOV Buffer + 3,10HMOV Buffer + 4,10HMOV Buffer + 5,10HMOV Buffer + 6,10HMOV Buffer + 7,10HRETLedDisplay ENDPINT_0: PUSH DXPUSH AXMOV AL,CounterADD AL,1DAAMOV Counter,ALMOV ReDisplayFlag,1CALL LedDisplayDELAY: PUSH BXPUSH CXPUSH DIPUSH SIMOV CX,20DELAY1: LEA SI,BufferCALL Display8loop DELAY1POP SIPOP DIPOP CXPOP BXPOP AX六、实验思考题1.绘制本实验的详细实验电路图?微机原理上机实验(十二)实验报告实验十二:步进电机实验一、实验目的1、了解步进电机的基本原理,掌握步进电机的转动编程方法2、了解影响电机转速的因素有那些二、实验内容编写程序:使用F5区的键盘控制步进电机的正反转、调节转速,连续转动或转动指定步数;将相应的数据显示在F5区的数码管上。
汇编语言程序设计实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科131MOV AX,4C00HINT 21HMAIN ENDPPROADD PROC NEARPUSH AXPUSH CXPUSH SIPUSH DIMOV SI,[BX]MOV DI,[BX+2]MOV CX,[DI]MOV DI,[BX+4]XOR AX,AXNEXT:ADD AX,[SI]ADD SI,2LOOP NEXTMOV [DI],AXPOP DIPOP SIPOP CXPOP AXRETPROADD ENDPARY DW 1,2,3,4,5,6,7,8,9,10COUNT DW 10SUM DW ?TABLE DW 3 DUP(?)CODE ENDSEND MAIN使用相应的文本编辑器建立文件LAB5.asm,内容如上所示。
二. 生成可执行文件:1.汇编:C:\masm> masm lab5;2.连接:C:\masm> link lab5;三. 请写出此程序中的变量ary,count,sum 的EA,并判断此程序的功能:四. 用debug 调试此程序时,第一条指令的段内EA 是多少?此程序数据段内偏移地址为0 的字单元数据为多少?其对应的机器指令是什么?-L ;加载程序文件lab5.exe-R ;查看IP 与CS 寄存器的内容-D DS:0 ;查看当前数据段内偏移地址为0 的字单元数据-U ;查看机器指令实验二:编写一个子程序,实现在屏幕的指定位置,用指定颜色,显示一个用0 结尾的字符串源程序如下data segmentstr db 'display string',0data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov dh,8mov dl,21mov cl,3mov si,offset strcall show_strmov ax,4c00hint 21h;----------------------------show_str proc nearpush axpush cxpush dxpush espush simov es:[bx], cljcxz okmov es:[bx+1], dlinc siadd bx, 2jmp short sok:pop sipop espop dxpop cxpop bxpop axret; 子程序:divdw; 要求:进行不会除法溢出的除法运算,被除数为dword,除数为word,结果为dword ; 参数:(ax) = 被除数dword型的低16位; (dx) = 被除数dword型的高16位; (cx) = 除数; 返回:(dx) = 结果的高16位; (ax) = 结果的低16位; (cx) = 余数divdw:mov bx, ax ; 缓存ax——被除数的低16位mov ax, dx ; ax = H,被除数的高16位mov dx, 0div cx ; ax 为商,dx为余数 = rem(H/N) * 65536push ax ; 结果的商,也就是最后要放在dx中的mov ax, bx ; dx为 rem(H/N) * 65536, 为高16位,ax为低16位,再进行一次除法运算div cx ; ax 为商——最后结果的低16位,dx为余数——为最后结果,应赋给cxmov cx, dxpop dxretcode endsend start实验结果实验一:变量ary,count,sum 的EA分别是00140,00154,00156此程序的功能是数列求和实验二:实验三:实验总结这次实验,感觉难度最大的就是做2个子程序的设计,在网上向好友请教了N回!还犯了一些低级的错误,如将16位的寄存器的内容传送到字符型数字串里去,这很明显是不对的,在逆序时寄存器的高16位会直接把正常的数字字符冲掉,还有就是将当我直接将字型单元的内容传送字型单元时,编译器会报错,不过提示是它后面的指令错误。
电梯模拟实验一、实验目的通过综合实验使学员复习并熟练掌握各个模块电路功能、基本原理、线路连接和驱动方法。
自己编写嵌入式代码进行驱动,掌握相关的程序设计、电路测试的基本能力。
通过动手实践进一步加深对理论知识的理解,提高动手能力。
二、实验原理1.使用模块:本实验使用了8254、8255、七段数码管、4*4键盘、步进电机、喇叭6大模块来进行模拟电梯的综合实验。
2.连接电路:(1).使用8255的C口的PC0~PC7连接4*4键盘的行3~列0,接收4*4键盘输入;(2).将8255的A口PA0~PA7分别与七段数码管的段码驱动输入端a~dp相连,位码驱动输入端S0接+5V,S1~S3接GND,编程实现在其显示电梯所处的楼层;(3).使用8255的B口的PB0~PB3分别与步进电机的驱动输入端BA~BD相连,编程实现根据键盘输入实现顺时针(反时针)转动;(4).8254的CLK0接1MHz时钟,GATE0接8255的PB5,OUT0和8255的PB4分别接与门的两个输入端A和B,与门输出端Y连接喇叭,编程实现电梯到达所要求的楼层后发出设定的声音进行提示,具体实验电路如下图.3.接线:4.程序流程三、关键点及难点1.关键点(1).8255的控制方式8255是通用并行接口芯片,但在具体应用时,要根据实际情况选择工作方式,连接硬件电路(外设),待进行初始化编程之后才能成为某一专用的接口电路。
8255的初始化编程比较简单,只需要一个方式控制字就把3个端口设置完成。
方式控制字决定端口A、B和C的工作方式,如下图所示。
(2).I/O端口值的读写实验中,会对大量的I/O端口进行读写操作,我们通过I/O端口对相关的硬件进行数据的读写,在进行数据读写的过程中,要清楚相关的函数操作以及写入的bit位的值对硬件起到怎样的控制。
下面是C语言方式对I/O端口读写进行操作的相关函数:(3).七段数码管工作原理实验所用的七段数码管为共阴型,段码采用同相驱动,输入加高电平,选中的数码管亮,位码加反相驱动器,位码输入端高电平选中。
一、实验目的1. 理解中断子程序的概念及其在嵌入式系统中的应用。
2. 掌握中断子程序的编程方法,包括中断的设置、中断服务程序的编写和中断优先级的管理。
3. 通过实际操作,验证中断子程序在系统中的正确运行,并分析中断处理的效果。
二、实验环境1. 开发平台:Keil uVision 52. 目标芯片:8051单片机3. 仿真器:STK5004. 实验板:基于8051单片机的实验板三、实验内容本次实验主要围绕以下内容展开:1. 中断子程序的初始化设置。
2. 编写中断服务程序,实现特定的功能。
3. 中断优先级的管理和中断嵌套的实现。
4. 实验验证与结果分析。
四、实验步骤1. 中断子程序的初始化设置(1)在Keil uVision 5中创建一个新的项目,选择8051单片机作为目标芯片。
(2)在项目中添加必要的头文件和库文件。
(3)编写中断初始化函数,配置中断源、中断优先级和中断使能。
2. 编写中断服务程序(1)根据实验要求,编写中断服务程序,实现特定的功能。
(2)在中断服务程序中,处理中断触发的事件,如按键按下、定时器溢出等。
3. 中断优先级的管理和中断嵌套的实现(1)在实验中,设置不同的中断优先级,观察中断处理的效果。
(2)实现中断嵌套,验证高优先级中断能够打断低优先级中断。
4. 实验验证与结果分析(1)编译并下载程序到实验板。
(2)观察实验板上的现象,验证中断子程序是否正常工作。
(3)分析实验结果,总结中断子程序在系统中的应用。
五、实验结果与分析1. 中断初始化通过编写中断初始化函数,成功配置了中断源、中断优先级和中断使能。
2. 中断服务程序编写的中断服务程序能够正确处理中断触发的事件,实现了预期的功能。
3. 中断优先级管理通过设置不同的中断优先级,验证了高优先级中断能够打断低优先级中断。
4. 中断嵌套实现了中断嵌套,高优先级中断能够成功打断低优先级中断。
六、实验总结通过本次实验,我们深入了解了中断子程序的概念、编程方法和应用。