实验01 存储器读写

TPC01-1.ASM

信息显示程序

俺也不清楚能不能麻溜的使用call dispmsg直接显示,对第一个实验印象不深了。

    include io.inc.model small.stack.data
msg 'Hello,Assembly!',13,10,0.code
start:mov ax,@datamov ds,axmov ah,9mov dx,offset msgint 21hmov ax,4coohint 21hend start.exit 0end start

TPC01-2.ASM

存储器的读写

实验报告中已指出:SRAM的段地址为0D000H,而SRAM6264的地址范围为D6000H~D6FFFH,说明初始偏移量为6000H,用“段基地址:偏移地址”(比如es:[bx])即可表示出存储器的位置。对存储器的读和写就是汇编的循环语句问题。

include io.inc.model small.stack.data
msg byte 'start read!',13,10,0.code
start:mov ax,@datamov ds,axmov ax,0d000h   ;6264段地址mov es,ax       ;段基地址mov bx,6000h    ;偏移地址mov al,20h      ;ASCII码从20H开始mov cx,95       ;ASCII码有95个字符push espush bxpush cx
write:mov es:[bx],alinc alinc bxloop writemov ax,offset msgcall dispmsgcall readcpop cxpop bxpop es
read:mov al,es:[bx]call dispcinc bxloop read.exit 0end start

实验04 中断实验

TPC04-1.ASM

主片8259中断实验

该中断属于可屏蔽中断,编程思路与课本例7-6思路一致。因为中断向量号为0BH,所以需要做一些改动。

   include io.inc.model small.stack.data
intmsg byte 'TPCA Interrupt No.3!',13,10,0
counter byte 0      ;中断次数.code
start:mov ax,@datamov ds,ax;获取原中断向量表项mov ax,350bhint 21hpush espush bxcli             ;关中断;设置新中断向量表项push dsmov ax,seg new0bhmov ds,axmov dx,offset new0bhmov ax,250bhint 21hpop ds;获取原IMRin al,21hpush ax         ;push最少跟16位,所以不能用push al;设置新IMRand al,0f7h     ;11110111out 21h,almov counter,0   ;设置中断次数初值sti             ;开中断start1:cmp counter,5jb start1cli             ;关中断 ;恢复IMRpop axout 21h,al;恢复原中断向量表项pop dx          ;offsetpop ds          ;segmov ax,250bhint 21hsti.exit 0new0bh procstipush axpush sipush dsmov ax,@data    mov ds,axinc countermov si,offset intmsgcall dpstri     ;不能使用DOS系统功能调用,所以需要调用ROM-BIOS;EOImov al,20hout 20h,alpop dspop sipop axiret
new0bh endpdpstri proc         ;显示字符串子程序push axpush bx
dps1:mov al,[si]cmp al,0jz dps2mov bx,0mov ah,0ehint 10hinc sijmp dps1
dps2:pop bxpop axret
dpstri endpend start

TPC04-2.ASM

从片8259中断实验

首先需要修改中断向量号为72H带来的变化。同时,因为是从片,所以需要修改主片的IR2状态和EOI命令。

    include io.inc.model small.stack.data
intmsg byte 'TPCA Interrupt No.3!',13,10,0
counter byte 0      ;中断次数.code
start:mov ax,@datamov ds,ax;获取原中断向量表项mov ax,3572hint 21hpush espush bxcli             ;关中断;设置新中断向量表项push dsmov ax,seg new72hmov ds,axmov dx,offset new72hmov ax,2572hint 21hpop ds;获取原IMRin al,21hpush ax;设置新IMRand al,0fbh     ;11111011out 21h,al;获取原IMRin al,0a1hpush ax;设置新IMRand al,0fbh     ;11111011out 0a1h,almov counter,0   ;设置中断次数初值sti             ;开中断start1:cmp counter,5jb start1cli             ;关中断 ;恢复IMRpop axout 0a1h,alpop axout 21h,al;恢复原中断向量表项pop dx          ;offsetpop ds          ;segmov ax,2572hint 21hsti.exit 0new72h procstipush axpush sipush dsmov ax,@data    mov ds,axinc countermov si,offset intmsgcall dpstri     ;EOI:先从片后主片mov al,20hout 0a0h,alout 20h,alpop dspop sipop axiret
new72h endpdpstri proc         ;显示字符串子程序push axpush bx
dps1:mov al,[si]cmp al,0jz dps2mov bx,0mov ah,0ehint 10hinc sijmp dps1
dps2:pop bxpop axret
dpstri endpend start

TPC04-3.ASM

中断嵌套实验

实验3类似于实验1和2的结合,在优先级低的中断服务程序中加入delay函数即可。

实验3:include io.inc.model small.stack.data
msg3 byte 'TPCA Interrupt No.3!',13,10,0
msg31 byte 'TPCA Interrupt No.3 Again!',13,10,0
msg10 byte 'TPCA Interrupt No.10!',13,10,0
msg101 byte 'TPCA Interrupt No.10 Again!',13,10,0
counter3 byte 0
counter10 byte 0.code
start:mov ax,@datamov ds,ax;获取原中断向量表项mov ax,350bhint 21hpush espush bxmov ax,3572hint 21hpush espush bxcli;设置新中断向量表项push dsmov ax,seg new0bhmov ds,axmov dx,offset new0bhmov ax,250bhint 21hpop dspush dsmov ax,seg new72hmov ds,axmov dx,offset new72hmov ax,2572hint 21hpop ds;获取原IMR(主)in al,21hpush ax;设置新IMR(主)and al,0f3h     ;11110011out 21h,al;获取原IMR(从)in al,0a1hpush ax;设置新IMR(从)and al,0fbh     ;11111011out 0a1h,almov counter3,0   ;设置中断次数初值mov counter10,0sti             ;开中断start1:cmp counter3,5jb start1
start2:cmp counter10,5jb start2cli             ;关中断 ;恢复IMRpop axout 0a1h,alpop axout 21h,al;恢复原中断向量表项pop dx          ;offsetpop ds          ;segmov ax,2572hint 21hpop dxpop dsmov ax,250bhint 21hsti.exit 0new0bh procstipush axpush sipush dsmov ax,@datamov ds,axinc counter3mov si,offset msg3call dpstricall delaymov si,offset msg31call dpstri;EOImov al,20hout 20h,alpop dspop sipop axiret
new0bh endpnew72h procstipush axpush sipush dsmov ax,@datamov ds,axinc counter10mov si,offset msg10call dpstricall delaymov si,offset msg101call dpstri;EOImov al,20hout 0a0h,alout 20h,alpop dspop sipop axiret
new72h endp
dpstri proc         ;显示字符串子程序push axpush bx
dps1:mov al,[si]cmp al,0jz dps2mov bx,0mov ah,0ehint 10hinc sijmp dps1
dps2:pop bxpop axret
dpstri endp
delay procpush bxpush cxmov bx,2000
delay1:xor cx,cx
delay2:loop delay2dec bxjnz delay1pop cxpop bxret
delay endpend start

实验05 可编程定时器/计数器(8253/8254)

TPC05-1.ASM

编程记录脉冲个数

通过计数器0的I/O端口号读取计数器当前计数值,如果相同则继续说明没有经过一个时钟周期,反复读取,直到计数值变化,输出计数值。若计数未结束(计数值不为0),则循环上述步骤。

include io.inc.model small.stack.data.code
start:mov ax,@datamov ds,ax;写入方式控制字mov dx,283hmov al,10h ;00010000out dx,al;写入计数值mov dx,280hmov al,5out dx,almov ah,al
again:;反复读取计数值需要加延时call delay    in al,dxcmp al,ahjz again ;计数值没变call dispuibcall dispcrlfmov ah,alcmp al,0jnz again ;计数未结束.exit 0delay procpush bxpush cxmov bx,2000
delay1:xor cx,cx
delay2:
loop dalay2dec bxjnz delay1pop cxpop bxret
delay endp end start

TPC05-2.ASM

编程输出一定频率的方波信号

方波信号应该选用方式3,在设定好初始化程序后,8254芯片就可以周期性地生成方波了

include io.inc.model small.stack.data.code
start:mov ax,@datamov ds,ax;写入方式控制字(计数器0)mov dx,283hmov al,37h  ;00110111out dx,al;写入计数初值mov dx,280hmov ax,1000hout dx,almov al,ahout dx,al;写入方式控制字(计数器1)mov dx,283hmov al,76h  ;01110110out dx,al;写入计数初值mov dx,281hmov ax,1000out dx,almov al,ahout dx,al.exit 0end start

TPC05-3.ASM

实现定时1秒的功能

这道题与课本上例7-6完全一样,例7-6的前提是该PC系统的IRQ来源于定时器,这里我们只需要补充定时器的实现细节即可(即定时器的初始化操作)

    include io.inc.model small.stack.data
intmsg byte 'Interrupt.',13,10,0
counter byte 0.code
start:mov ax,@datamov ds,ax;获取原中断向量mov ax,350bhint 21hpush espush bx;设置新中断向量clipush dsmov ax,seg new0bhmov ds,axmov dx,offset new0bhmov ax,250bhint 21hpop ds;获取原IMRin al,21hpush ax;设置新IMRand al,0f7h  ;11110111out 21h,al;8253/8254初始化;计数器0mov dx,283hmov al,37h  ;00110111out dx,almov ax,1000hmov dx,280hout dx,almov al,ahout dx,al;计数器1mov dx,283hmov al,77h  ;01110111out dx,almov ax,1000hmov dx,281hout dx,almov al,ahout dx,almov counter,0stistart1:cmp counter,5jb start1;恢复clipop axout 21h,alpop dxpop dsmov ax,250bhint 21hsti.exit 0
new0bh procstipush axpush sipush dsmov ax,@datamov dx,axinc countermov si,offset intmsgcall dpstrimov al,20hout 20h,alpop dspop sipop axiret
new0bh endpdpstri procpush axpush bx
dps1:mov al,[si]cmp al,0jz dps2mov bx,0mov ah,0ehint 10hinc sijmp dps1
dps2:pop bxpop axret
dpstri endpend start

实验06 可编程并行接口(8255)

TPC06-1.ASM

方式0(基本输入输出)实验

先初始化,再对数据端口读写即可。 其中,端口A为方式0输出,端口C为方式0输入(输入信号为K0~K7),端口B任意。

    include io.inc.model small.stack.data.code
start:mov ax,@datamov ds,axmov dx,28bhmov al,89h  ;10001001out dx,almov dx,28ahin al,dxmov dx,288hout dx,al.exit 0
end start

TPC06-2.ASM

方式1(选通)输出实验

中断服务程序,中断的来源是手动按一次单脉冲按钮。我们只需要完善8255的初始化程序和把中断服务程序修改为数据端口的写操作即可。

    include io.inc.model small.stack.data
msg byte 01h
counter byte 0.code
start:mov ax,@datamov ds,ax;获取原中断向量mov ax,350bhint 21hpush espush bx;设置新中断向量clipush dsmov ax,seg new0bhmov ds,axmov dx,offset new0bhmov ax,250bhint 21hpop ds;获取原IMRin al,21hpush ax;设置新IMRand al,0f7h ;111101111out 21h,almov counter,0;8255初始化mov al,0a0h ;10100000hmov dx,28bhout dx,alsti
start1:cmp counter,8jb start1;恢复clipop axout 21h,alpop dxpop dsmov ax,250bhint 21hsti.exit 0
new0bh procstiinc counter   call litlight;EOImov al,20h
out 20h,aliret
new0bh endp
litlight procmov al,msgcall disphbcall dispcrlfmov dx,288hout dx,alrol light,1ret
litlight endpend start

TPC06-3.ASM

方式1(选通)输入实验

中断仍由手动产生,和上一个实验一样,我们只需完善8255的初始化程序和修改中断服务程序。

    include io.inc.model small.stack.data
counter byte 0.code
start:mov ax,@datamov ds,ax;获取原中断向量mov ax,350bhint 21hpush espush bx;设置新中断向量clipush dsmov ax,seg new0bhmov ds,axmov dx,offset new0bhmov ax,250bhint 21hpop ds;获取原IMRin al,21hpush ax;设置新IMRand al,0f7h ;111101111out 21h,almov counter,0;8255初始化mov al,0b0h ;10110000mov dx,28bhout dx,alsti
start1:cmp counter,5jb start1;恢复clipop axout 21h,alpop dxpop dsmov ax,250bhint 21hsti.exit 0
new0bh procstiinc countercall displed;EOImov al,20hout 20h,aliret
new0bh endp
displed procmov dx,288hin al,dxcall disphbcall dispcrlfret
displed endpend start

实验08 数码管显示

TPC08-1.ASM

一位静态显示

输入一个数,通过并行接口8255传给数码管,这里涉及8255的初始化编程。因为传给数码管的数需要让其对应段发亮,所以需要换码操作。因为已经通过硬件方式选中S3,所以只需要关注段控制,将段表提前写好进行换码即可。

    include io.inc.model small.stack.data
ledtb byte 3fh,06h,5bh,4fh,66hbyte 6dh,7dh,07h,7fh,6fh.code
start:mov ax,@datamov ds,ax;8255初始化mov dx,28bhmov al,80h ;10000000out dx,al;1位数码管显示call readuiw ;出口参数为axmov bx,axmov al,ledtb[bx] ;换码为显示代码mov dx,288hout dx,al.exit 0end start

TPC08-2.ASM

多位动态显示

让处理器通过8255传给段控制端口段显示代码,然后传给位控制端口位显示代码,顺序地输出段码和位码,依次让每个数码管显示数字,并不断重复显示。为此,可以开辟一个数码缓冲区,存放要显示地数字,第一个数字在最左边地数码管显示,下一个数字送到左边第二个数码管显示,以此类推,利用rol指令即可实现这一过程。和课本不同之处在于课本是循环8位,而实验要求循环4位,需稍加修改。

    include io.inc.model small.stack.data
leddt byte 3,4,5,6  ;存放要显示的数字
ledtb byte 3fh,06h,5bh,4fh,66hbyte 6dh,7dh,07h,7fh,6fh.code
start:mov ax,@datamov ds,ax;8255初始化mov al,80h ;10000000mov dx,28bhout dx,almov si,offset leddtcall displeddispled procpush axpush bxpush dx
again:    xor bx,bx;选中最左边的数码管;也有可能是最右边...mov ah,01h  ;位码00000001
led1:mov bl,[si]mov al,ledtb[bx] ;换码mov dx,288h ;段控制端口out dx,almov al,ahmov dx,289h ;位控制端口out dx,alcall delayinc sirol ah,1    ;指向下一个数码管;是否循环一个周期cmp ah,10h  ;00010000   jz againjmp led1 pop dxpop bxpop axret
displed endpdelay procpush bxpush cxmov bx,5
delay1:xor cx,cx
delay2:loop delay2dec bxjnz delay1pop cxpop bxret
delay endpend start

TPC08-3.ASM

多位循环显示

俺这道题不会,下面的代码感觉不怎么对。为了应付期末考试的话可以不用看这个了(追求满绩也不用看)

    include io.inc.model small.stack.data
buf byte 0,0,0,0  ;存放要显示的数字
ledtb byte 3fh,06h,5bh,4fh,66hbyte 6dh,7dh,07h,7fh,6fh.code
start:mov ax,@datamov ds,ax;8255初始化mov dx,28bhmov al,80hout dx,al
start1:xor si,simov ah,08h ;位码
again:mov bl,buf[si]mov bh,0mov al,led[bx]mov dx,288hout dx,al  ;段mov al,ahmov dx,289hout dx,al  ;位call delayinc sishr ah,1jnz againmov bl,buf+3   ;要显示的数加1inc blcmp bl,10jb next3mov bl,0mov bh,buf+2inc bhcmp bh,10jb next2mov bh,0mov cl,buf+1inc clcmp cl,10jb next1mov cl,0mov ch,bufinc chcmp ch,10jb next0mov ch,0
next0:mov buf,ch
next1:mov buf+1,cl
next2:mov buf+2,bh
next3: mov buf+3,cl.exit 0
delay procpush bxpush cxmov bx,5
delay1:xor cx,cx
delay2:loop delay2dec bxjnz delay1pop cxpop bxret
delay endpend start

实验10 模/数转换器

TPC10-1.ASM

软件延时方式

软件延时方式不需要考虑EOC信号,因此只需要应用out和in指令实现对ADC0809进行启动和读数据两个操作即可。

    include io.inc.model small.stack.data
msg byte 'press any key to exit',13,10,0.code
start:mov ax,@datamov ds,axmov ax,offsetcall dispmsg
again:mov dx,298h ;启动ADCout dx,alcall delayin al,dx    ;从ADC读入数据call disphbcall dispcrlfcall readkeyjz again.exit 0
delay procpush bxpush cxmov bx,2000
delay1:xor cx,cx
delay2:loop delay2dec bxjnz delay1pop cxpop bxret
delay endpend start

TPC10-2.ASM

查询方式

查询方式两步走:循环+test

    include io.inc.model small.stack.data.code
start:mov ax,@datamov ds,ax;8255的初始化mov al,88h  ;10001000(PC7作输入端)mov dx,28bhout dx,al
start1:mov dx,298h ;启动ADCout dx,alcall delaymov dx,28ah ;端口C
start2:in al,dxtest al,80h ;10000000jz start2mov dx,298hin al,dx    ;读取数字量call disphbcall dispcrlfjmp start1.exit 0delay procpush bxpush cxmov bx,2000
delay1:xor cx,cx
delay2:loop delay2dec bxjnz delay1pop cxpop bxret
delay endpend start

TPC10-3.ASM

中断方式

中断方式的编程已经很熟悉了,和之前的处理方法一样。我们需要设置好中断服务程序之前的环境和修改相应的中断服务程序。

    include io.inc.model small.stack.data
counter byte 0.code
start:mov ax,@datamov ds,ax;获取原中断向量mov ax,350bhint 21hpush espush bx;设置新中断向量clipush dsmov ax,seg new0bhmov ds,axmov dx,offset new0bhmov ax,250bhint 21hpop ds;获取原IMRin al,21hpush ax;设置新IMRand al,0f7h ;111101111out 21h,almov counter,0;启动ADCmov dx,298hout dx,alcall delaysti
start1:cmp counter,10jb start1;恢复clipop axout 21h,alpop dxpop dsmov ax,250bhint 21hsti.exit 0
new0bh procstiinc counter;读取并显示数字量mov dx,298hin al,dxcall disphbcall dispcrlf;EOImov al,20hout 20h,aliret
new0bh endpdelay procpush bxpush cxmov bx,2000
delay1:xor cx,cx
delay2:loop delay2dec bxjnz delay1pop cxpop bxret
delay endpend start 

祝大家微机都满绩

微机原理与接口技术实验相关推荐

  1. 南航计算机硬件实验,南航80X86微机原理及接口技术实验指导书.pdf

    80X86 微机原理及接口技术实验 指导书 卓然 编著 2015-3-1 序 错误!未定义书签. 第一章 TD-PIT++实验系统简介 3 1. 概述 3 2. 系统总线电路单元 5 3. 接口实验单 ...

  2. 微机原理与接口技术实验:子程序设计实验

    学生实验报告 实验课名称:微机原理与接口技术 实验项目名称:子程序设计实验 实验名称:单指令功能的实现 一. 实验目的 1.掌握汇编语言源程序子程序设计方法:. 二.实验内容 设计一个程序,将所有的小 ...

  3. 微机原理与接口技术实验:宏实现1+2+3...+100

    学生实验报告 实验课名称:微机原理与接口技术 实验项目名称:宏 实验名称:宏实现1+2+3-+100 一. 实验目的 掌握重复宏的简单使用,并实现1+2+3-+100 二.实验内容 设计一个程序,利用 ...

  4. 计算机微机原理与接口技术课程设计课题,微机原理与接口技术课程设计报告

    <微机原理与接口技术课程设计报告>由会员分享,可在线阅读,更多相关<微机原理与接口技术课程设计报告(12页珍藏版)>请在人人文库网上搜索. 1.微机原理与接口技术课程设计设计题 ...

  5. 微型计算机原理无微机接口,微机原理与接口技术

    <微机原理与接口技术>课程实验教学大纲 课程名称:微机原理与接口技术 英文名称:Principles and Interface of Microprocessors 实验课性质:非独立设 ...

  6. 关于微型计算机原理的文献,关于微型计算机原理论文范文资料 与微型计算机原理和接口技术实验教学体系改革有关论文参考文献...

    <微型计算机原理和接口技术实验教学体系改革>:这是一篇与微型计算机原理论文范文相关的免费优秀学术论文范文资料,为你的论文写作提供参考. [摘 要] 本文结合上海星研微机原理实验教学仪器-S ...

  7. 微机原理与接口技术计时十字路口交通信号灯及公共时钟

    一.方案设计 1. 设计内容 本题模拟场景为十字路口交通信号灯及路口公共时钟,通过Proteus8仿真平台进行模拟.南北路口方向和东西路口方向均设有红.黄.绿三种状态灯以及数字倒计时显示,同时设有路口 ...

  8. 计算机微机原理及接口技术实训室,《微机原理与接口技术》课程实验报告.doc...

    <微机原理与接口技术>课程实验报告 实验一基本操作 一.实验目的 ? 1.熟悉Netlab MCS-51单片机实验系统的设置和使用方法 2.掌握基本MCS-51软件的编写.修改和编译的方法 ...

  9. 微型计算机音乐发生器,微机原理及接口技术音乐发生器实验.doc

    微机原理及接口技术音乐发生器实验 微机原理及接口技术音乐发生器实验发生器音乐发生器)) Y N N (图2.2.1) 符号-频率对照表: 音符1 2 3 4 5 6 7频率131 147 165 17 ...

  10. led接口实验微型计算机,“微机原理与接口技术”开放性实验建设——“点阵LED显示器显示汉字”实验...

    "微机原理与接口技术"开放性实验建设--"点阵LED显示器显示汉字"实验 维普资讯 http://doc.xuehai.net 第 2 6卷第 9期 20 0 ...

最新文章

  1. 《VMware、Citrix和Microsoft虚拟化技术详解与应用实践》一1.1 虚拟化概述
  2. 记录Hibernate的缓存知识
  3. (转)GDB 使用方法
  4. 六、Web服务器——FilterListener 学习笔记
  5. hp 服务器可以安装win7系统安装失败,如何解决win7hp1213打印机安装失败的问题
  6. 编译原理 第3版 第一章练习
  7. ENSP教程---配置DHCP
  8. Centos系统安装踩坑
  9. 紫光拼音输入法 v6.9.0.22 绿色版
  10. 无损压缩算法专题——无损压缩算法介绍
  11. ubuntu修改桌面主文件夹为英文
  12. 攻防世界WEB进阶之mfw
  13. 形态学填充孔洞的几个问题
  14. 【68期分享】7款红色大气PPT模板免费下载
  15. mysql默认存储引擎_MySQL5.5 所支持的存储引擎
  16. Oralce数据库断电之ORA-00600: 内部错误代码, 参数: [kcratr_nab_less_than_odr], [1], [37]
  17. 阿里云服务器的windows和linux系统怎么选
  18. codeforces B.Maximum Absurdity 解题报告
  19. Python - 140种标准库、第三方库和外部工具整理
  20. 车展背后|车规级芯片知多少?

热门文章

  1. sip协议详解(一)
  2. 大学计算机aoa学什么,浙江省高校计算机二级AOA考试excel试题及解析.xls
  3. kindle看pdf不清楚_Kindle 对 PDF 的支持真的很糟糕吗?
  4. 基于高德地图实现热力地图和标记点显示文字
  5. Java基本数据类型取值范围
  6. 照片宽高比怎么设置_2019年中级会计报名照片上传完整攻略
  7. 京东类目如何修改,批量修改京东分类教程
  8. 4 大话“奇异值”矩阵
  9. 形态学图像处理之边界提取与跟踪
  10. Drools教程 —— 简介