《微机实验》报告实验名称:keilc的使用与汇编语言上机操作一、任务要求实验目的:熟悉keilc环境,通过在keilc环境下调试字节拆分、合并程序、数据块清零程序、加法程序,掌握汇编语言程序的调试方法,加深对bcd码、ascii码、堆栈、寄存器、数据指针、汇编语言指令、机器码等基本概念的理解,为后续程序编制和调试打下基础。
实验内容:1.掌握keilc环境的使用1)字节拆分、合并:调试e421.asm程序,观察相关寄存器和单元的内容。
2)数据块填充:调试fill.asm程序,观察相关寄存器和单元的内容。
2. 编写两个十六位数的加法程序。
有两个十六位无符号数,分别存放在从20h和30h开始的数据区中,低八位先存,高八位在后,和存于r3(高八位)和r4(低八位),进位位存于r2。
二、设计思路实验1中的两个实验,已经给出了程序代码,,无需再进行设计。
下面阐述实验2的设计思路:对于该程序,在处理低位相加时,直接采用指令add,然后存数,在处理高位时,考虑到可能存在进位,所以在相加时,应使用指令addc将被加数、加数以及低位到高位的进位相加然后存数。
此外,在处理该问题时,还应考虑到两个十六位相加可能会出现第十七位,所以要另外安排一个地址单元用来存放最高位的数。
三、资源分配两个十六位无符号数,分别存放在从20h和30h开始的数据区中;和存于r3(高4八位)和r4(低八位);进位位存于r2。
四、流程图四、源代码(含文件头说明、资源使用说明、语句行注释)file name: test2.asmdescription: 两个十六位数的加法程序date: 2012/09/26designed by: zhangbosource used: 20h: 加数a的低位21h: 加数a的高位30h: 加数b的低位31h: 加数b的高位r4: 和的低位r3: 和的高位r2: 和的进位org 0000h ljmp main org 0000h main: clr c ;将进位位清零mov 20h,#10h六、程序测试方法与结果、软件性能分析手动输入两个加数的值,可得到正确的和,多改变几次,皆正确。
对于不同的加数,分别在调试过程中跟踪a,r4,r3,r2的值,皆可得到预期数值。
所以,可以说,该程序的源代码是合理正确的,该程序合格,本实验取得成功。
软件性能良好。
思考题:1.怎样查看工作寄存器、sfr、片内ram、片外ram及程序代码空间内容?disassembly 窗口有何作用?选择debug下的start /stop debug session,在界面的左侧会出现程序代码的空间内容。
mov 21h,#2ah mov 30h,#21h mov 31h,#00hmov r0,20h ;将a中的地位存入r0中 mov a,30h addc a,r0 mov r4,a clra ;将b中的地位存入a累加器中 ;将低位相加 ;其和存入r4中 ;对累加器a清零mov r0,21h ;将a中的高位存入r0中 mov a,31h ;将b中的高位存入a累加器中addc a,r0 ;将高位以及进位位相加mov r3,a ;其和存入r4中clra ;对累加器a清零 addc a,#0 ;将进位存入a.7 mov r2,a ;将进位存入r2.7 sjmp $ end disassembly窗口内显示的是编译之后转化成的汇编代码2.字节拆分、合并还有哪些方法,举一例说明。
org 0000hljmp mainorg 0100hmain: mov sp, #40h ;赋堆栈指针mov 30h, #49h ;30h单元赋值mov r0, #32h ;r0指针赋值mov @r0, 30h ;将30h中的内容copy到32h中mov a, f0h ;累加器a赋值anl a, 30h ;得到原数码的高四位swap a 3. 若按递减1规律填充数据块,应如何修改程序?在原程序中修改,从main开始,第三行改为 mov r0,#ffh 第四行改为 mov dptr,#70ffh 第六行改为 dec a第七行改为 dec dptr第八行改为 dec r0第九行改为 cjne r0,#ffh,fill1 4. 若从7020h单元开始,连续填充10个字节,应该如何修改程序?不妨将10-19送入7020h-7029单元中,改变后的程序代码如下:org 0000hljmp mainorg main: mov sp,#40h0100h fill: mov a, #10 ;将10h送入累加器a中mov r0, #10h ;设循环计数器mov dptr, #7020h ;设数据指针fill1: movx @dptr, ainc ainc ;传送到片外ram ;a内容加1 ;修改数据指针;判断是否结束 dptr djne r0, fill1 here: sjmp here ;原地踏步 end5. 若完成双字节bcd码加法,应如何修改程序?不妨设加数分别存于30h-31h、40h-41h中,低位在前高位在后,各单元均为压缩的bcd码。
将和存入50h-51h中。
其程序片段如下:...mov a,30hadd a,40hda amov 50h,a ;低2位bcd码之和存入50h mov a,31hadd a,41hda amov 51h,a ;高2位bcd码之和存入51h篇二:微机实验报告微机原理与接口技术实验报告姓名:张楠乔学号: 10213030班级:自动化1004 指导教师:周永华实验一交通灯控制实验一、实验目的通过并行接口8255实现十字路口交通灯的模拟控制,进一步掌握对并行口的使用。
二、实验内容实验内容,如图1连接电路,l7、l6、l5作为南北路口的交通灯与pc7、pc6、pc5相连,l2、l1、l0作为东西路口的交通灯与pc2、pc1、pc0相连,编程使六个灯按交通灯变化规律亮灭。
红黄绿红黄绿l7 l6 l5 l2 l1 l0 图1 连接图要求:十字路口交通灯的变化规律要求:(1)南北路口的绿灯、东西路口的红灯同时亮30秒左右。
(2)南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮。
(3)南北路口的红灯、东西路口的绿灯同时亮30秒左右。
(4)南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁若干次。
(5)转(1)重复。
三、实验流程图图2 流程图四、试验程序:data segmentpc equ 0c40ahpd equ 0c40bhdata endsstack1 segment stackdw 100hdup(?)stack1 endscode segmentassume cs:code,ds:data,ss:stack1 start: mov dx,datamov ds,dx ;初始化mov al,80hmov dx,pd s: mov al,24hmov dx,pcout dx,alcall delay3 ;南北绿灯亮、东西红灯亮3秒mov cx,6y1: mov al,44hout dx,alcall delay1mov al,04hout dx,alcall delay1loop y1 ;南北绿灯灭,南北黄灯闪,东西红灯亮mov al,81hout dx,alcall delay3 ;东西红灯灭,南北红灯、东西绿灯亮3秒mov cx,6y2: mov al,82hout dx,alcall delay1mov al,80hout dx,alcall delay1loop y2 ;东西绿灯灭,东西黄灯闪,南北红灯亮mov dl,0ffhmov ah,6int 21hjz smov ah,4chint 21h ;查询是否有键按下delay3 proc ;延时3秒子程序push cxpush axmov cx,0afffht1: mov ax,0ffffht2: dec axjnz t2loop t1pop axpop cxretdelay3 endpdelay1 proc ;延时半秒子程序push cx mov cx,1d55ht3: mov ax,0ffffht4: dec axjnz t4loop t3pop axpop cxretdelay1 endpcode endsend start五、实验步骤(1)将pc总线接口卡插在任意扩展槽中(已接好)。
(2)用50芯线扁平电缆线连接接口卡和实验台。
(3)如图1所示连接线路。
(4)打开实验箱电源,启动tcp-2003实验系统软件环境。
(5)测试8255、led和串口是否完好。
六、实验现象:南北路口的绿灯、东西路口的红灯同时亮3秒左右,然后南北路口的黄灯闪烁若干次,东西路口的红灯继续亮,接着南北路口的红灯、东西路口的绿灯同时亮3秒左右,然后南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁若干次。
如此循环。
结果与实验要求相符。
七、实验心得本实验的重要一部分就是延时子程序,编写程序时候要根据流程图,这样就从一定程度上简化了实验,还有就是实验的调试过程,一定要细心又有耐心篇三:微机原理实验报告微型计算机原理实验报告班级:姓名:学号:2012年1月14日实验一、数据传送、算术运算、循环程序结构【实验目的】1.熟悉8086汇编语言源程序的框架结构,并掌握汇编语言程序的编写、汇编、连接、执行的过程,并利用turbo debugger调试汇编程序。
2.熟悉8086指令系统的数据传送指令,掌握寻址方式。
3.熟悉8086指令系统的算术运算指令。
掌握循环结构汇编语言程序的编制。
【实验内容】教材p121,第14、15题。
教材p195,第6、12题。
实验1.1:p121,第14题设有两个8个字节长的bcd码数据bcd1及bcd2。
bcd1数以1000h为首地址在内存中顺序存放;bcd2数以2000h为首地址在内存中顺序存放。
要求相加后结果顺序存放在以2000h为首地址的内存区中(设结果bcd数仍不超过8个字节长)。
【实验原理】考虑两个8个字节长的bcd码相加,首先根据地址要求将数据放在对应的地址单元中,然后做加法,bcd码相加要用到调整指令,结果才为正确的bcd数【程序框图】【程序源代码】datas segmentorg 1000h1000h bcd1 db org 2000hbcd2 db 11h,12h,13h,14h,15h,16h,17h,18h;起始地址为2000h datas ends codes segmentassume cs:codes,ds:datas start: mov ax,datas mov ds,ax mov bx,0 mov cx,8 ;设置循环次数8次clc ;清进位cf标志again:moval,[bx+1000h]adc [bx+2000h],al;结果放在2000h开始的单元内 daa inc bx loop again;没完成则转again循环 mov ah,4ch int 21h codes ends end start 运行:bcd1 db 01h,02h,03h,04h,05h,06h,07h,88h bcd2 db11h,12h,13h,14h,15h,16h,17h,18h 结果如下:ds:2000h为首地址的连续八个字节单元中实验1.2:p121,第15题设从2000h为首地址的内存中,存放着10个带符号的字节数据,试编写“找出其中最大的数,并存入2000h单元中“的程序。