微机程序设计代码例题

合集下载

C语言程序设计50例(经典收藏)

C语言程序设计50例(经典收藏)

C语言程序设计50例(经典收藏)各位读友大家好,此文档由网络收集而来,欢迎您下载,谢谢C语言程序设计50例(经典收藏)【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。

组成所有的排列后再去掉不满足条件的排列。

2.程序源代码:复制代码代码如下:#include ““#include ““main(){int i,j,k;printf(“\n”);for(i=1;i2) /*如果是闰年且月份大于2,总天数应该加一天*/sum++;printf(“It is the %dth day.”,sum);getch();}============================== ============================== ==【程序5】题目:输入三个整数x,y,z,请把这三个数由小到大输出。

1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z 则将x与z的值进行交换,这样能使x 最小。

2.程序源代码:复制代码代码如下:#include ““#include ““main(){int x,y,z,t;scanf(“%d%d%d”,&x,&y,&z);if (x>y){t=x;x=y;y=t;} /*交换x,y的值*/if(x>z){t=z;z=x;x=t;} /*交换x,z的值*/if(y>z){t=y;y=z;z=t;} /*交换z,y的值*/printf(“small to big: %d %d %d\n”,x,y,z);getch();}============================================================ ==【程序6】题目:用*号输出字母C的图案。

微机原理编程题集合汇总

微机原理编程题集合汇总

微机原理编程题1. 分支程序设计①.编写一段程序,已知BUF1单元中有一带符号字节数据X,BUF2中有一带符号字节数据Y,根据以下函数关系编写程序求Z的值,结果存入RESULT 单元。

Z=|X-Y|;DATA SEGMENTBUF1 DB 05HBUF2 DB 02HRESULT DB?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV AL,BUF1MOV BL,BUF2SUB AL,BLJNC GREATNEG ALGREAT:MOV RESULT,ALEXIT: MOV AH,4CHINT 21HCODE ENDSEND START②.编写一段程序,已知BUF单元中有一无符号字节数据X,假设为8,根据以下函数关系编写程序求Y的值,结果存入RESULT 单元。

Z=5X X<10,X-5 X>=10;DATA SEGMENTBUF DB 8RESULT DB?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV AL,BUFCMP AL,10JAE GREMOV BL,ALADD AL,ALADD AL,ALADD AL,BLJMP DONEGRE: SUB AL,5DONE: MOV RESULT,ALMOV AH,4CHINT 21HCODE ENDSEND START③.在内存单元BUF中存放一个带符号字节数据X,假定为-2,试根据以下函数关系编写程序求Y的值,结果存入RESULT 单元。

Y=1 X>0,0 X=0,-1 X<0;DATA SEGMENTBUF DB-2RESULT DB?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV AL,BUFCMP AL,0JGE L1MOV AL,-1JMP L3L1:JZ L2MOV AL,1JMP L3L2:MOV AL,0L3:MOV RESULT,ALMOV AH,4CHINT 21HCODE ENDSEND START2. N个数中求最大值、最小值.假定N=10,已知原始数据存放在BUF开始的内存单元中,将结果存入MAX,MIN内存单元中。

(汇编代码)微机原理课程设计之TANK坦克大战

(汇编代码)微机原理课程设计之TANK坦克大战
测试报告
测试游戏功能是否正常
检查游戏性能是否达标
调试游戏中的错误和问题
优化游戏性能和体验
游戏测试:成功运 行,无严重错误
调试过程:定位并 修复了若干问题
测试结果:性能稳 定,符合预期
结论:游戏测试和 调试工作顺利完成
游戏优化和改进
优化算法:采用更高效的算法,减 少计算量,提高游戏运行速度。
完 成 TA N K 坦 克 大 战 游 戏 的 程 序设计和实现
学会使用汇编语言进行编程
掌握游戏的基本规则和玩法
游戏规则和玩法
游戏目标:击败所有敌人,保护基地 角色设定:玩家扮演坦克,有生命值和弹药量限制 武器装备:多种武器可供选择,不同武器有不同的攻击力和射程 游戏地图:多个关卡,每个关卡有不同的地形和敌人配置
添加标题
游戏状态管理:游戏状态包括开始、进行中和结束三个状态。在开 始状态下,玩家可以开始游戏;在进行中状态下,玩家可以操作坦 克移动和射击;在结束状态下,游戏结束并给出评价。
添加标题
游戏角色行为:游戏角色包括玩家坦克和敌方坦克。玩家坦克的行 为包括移动和射击;敌方坦克的行为包括移动和攻击。
游戏界面布局:简洁明了,易于操作 角色设计:形象生动,符合游戏主题 场景设计:丰富多样,增加游戏趣味性 特效设计:绚丽多彩,提升游戏体验感
添加标题
添加标题
添加标题
添加标题
敌方角色:游戏中的敌方坦克种类多 样,包括轻型坦克、重型坦克、自行 火炮等,具有不同的攻击和防御能力, 对玩家构成威胁。
游戏辅助角色:游戏中的一些辅助角 色,如地图、弹药补给点等,为玩家 提供地图信息和弹药补给服务,帮助 玩家更好地进行游戏。
游戏程序设计和实 现
游戏整体架构:包 括游戏的主要功能 模块和各模块之间 的关系

微机原理编程例题

微机原理编程例题

1编程计算z=(X2-3y)/2,设x,y为单字节正整数,结果Z用两个字节来存放。

•DATA SEGMENT•X DB 25•Y DB 32•Z DW ?•DATA ENDS•;•CODE SEGMENT•ASSUME CS:CODE,DS:DATA•EXPRE PROC FAR•START:PUSH DS•SUB AX,AX•PUSH AX•MOV AX,DATA•MOV DS,AX•MOV AL,X•MUL AL ;X2•MOV BL,Y•ADD BL,BLADD BL,Y ;3Y•SUB AX,BX ; X2-3Y•SHR AX,1 ; (X2-3Y)/2•MOV Z,AX ;存放结果•EXPRE ENDP•CODE ENDS•END START2编程求S=∑i,并将S存入SUM单元•DATA SEGMENT•SUM DW ?DATA ENDS•CODE SEGMENT•ASSUME CS:CODE,DS:DATA•;•START:MOV AX,DATA•MOV DS,AX•MOV AX,0;和清零•MOV CX,100;设计数初值•ADD AX,CX;求和•DEC CX ;计数•JNZ AGAIN•MOV SUM,AX;存和•MOV AH,4CH•INT 21H•CODE ENDS•END START3在内存的字单元X中有一个16位的二进制数。

试编写一程序统计出X单元中含1的个数,并存入RESULT单元•DATA SEGMENT•X DW 31A0H•RESULT DW ?•DATA ENDS•CODE SEGMENT•ASSUME CS:CODE,DS:DATA•START PROC FAR•PUSH DS•XOR AX,AX•PUSH AX•MOV AX,DATA•MOV DS,AX•MOV CX,0; 初始化cx=0•MOV AX,X ;取X到AX•AGAIN: AND AX,AX;X=0•JZ EXIT ;X=0.退出•SHL AX,1•JNC NEXT ;CF=1?•JNC CX ;是,计数•NEXT:JMP AGAIN•EXIT: JMP AGAIN•EXIT: MOV RESULT,CX;存结果•RET•START ENDP•CODE ENDS•END START4在40个元素组成的数组中寻找第一个非0元素•MOV CX,28H•MOV SI.0FFH•NEXT:INC SI•CMP BYTE PTR[SI],0•LOOPZ NEXT•JNZ OKK•CALL DISPLAY1•RET•OKK: CALL DISPLAY2•RET5.PAGE 60,132;指定每页60行,132列TITLE 对两个字数据求和;为源程序指定标题•SSEG SEGMENT ;堆栈段开始•DW 20H ;定义堆栈段空间•SSEG ENDS ;堆栈段结束•DSEG SEGMENT ;数据段开始•AGRX DW 1234H ;定义被加数•AGRY DW 5678H ;定义加数•SUM DW ? ;定义存放结果的空单元•DSEG ENDS ;数据段结束•CSEG SEGMENT ;代码段开始•ASSUME CS:CSEG,DS:DSEG SS:SSEG •MOV AX,DSEG;初始化DS寄存器•MOV DS,AX•MOV AX,AGRX;取被加数到AX寄存器•MOV BX,AGRY;取加数到BX寄存器•ADD AX,BX; 两个数相加•MOV SUM,AX;存放结果•MOV AX,4C00H•INT 21H;程序正常退出•CSEG ENDS;代码段结束•END MAIN ;源程序结束。

微机原理实验编程题(完整)

微机原理实验编程题(完整)

1)(正确)比较两个无符号数的大小(量个数放在内存S3的连续两个单元中),将大数存入MAX单元中。

DATAS SEGMENTBUF DB 1,2CNT EQU $-BUFDATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV CX,CNT-1LEA BX,BUFMOV AL,[BX]L2: INC BXCMP AL,[BX]JAE L1MOV AL,[BX]L1:LOOP L2ADD AL,30H- 1 - / 16MOV DL,ALMOV AH,2INT 21HMOV AH,4CHINT 21HCODES ENDSEND STAR2)(正确)试编一程序,求三个带符号数据中的最大值,并将最大值存入MAX单元中,设三个带符号数分别在三个变量X,Y,Z中存储。

DATAS SEGMENTX DB 5Y DB-2Z DB 0MAX DB?DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV AL,XMOV BL,YCMP AL,BLJG L1MOV AL,BLL1:MOV BL,ZCMP AL,BLL2: MOV MAX,ALMOV AH,4CHINT 21HCODES ENDSEND START3)(正确)根据MODE单元中编号0-7分别转向L0-L7标号处,执行L0-L7处分别完成显示‘0-7’字符,即当MODE=0时,转向L0标号,完成显示‘0’,当MODE=7时,转向L7标号,完成显示‘7’。

DATAS SEGMENTMODE DB 0DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:- 3 - / 16MOV AX,DATASMOV DS,AXMOV AL,MODECMP AL,0JZ L0CMP AL,1JZ L1CMP AL,2JZ L2CMP AL,3JZ L3CMP AL,4JZ L4CMP AL,5JZ L5CMP AL,6JZ L6MOV DL,'7'MOV AH,02HINT 21HJMP L8L0:MOV DL,'0'MOV AH,02HINT 21HJMP L8L1:MOV DL,'1'MOV AH,02HINT 21HJMP L8L2:MOV DL,'2'MOV AH,02HINT 21HJMP L8L3:MOV DL,'3'MOV AH,02HINT 21HJMP L8L4:MOV DL,'4'- 5 - / 16MOV AH,02HINT 21HJMP L8L5:MOV DL,'5'MOV AH,02HINT 21HJMP L8L6:MOV DL,'6'MOV AH,02HINT 21HJMP L8L8:MOV AH,4CHINT 21HCODES ENDSEND START4)(正确)根据输入值(0-4)的不同,执行不同的操作,用转移标法编写程序。

C语言程序设计50例(经典收藏)

C语言程序设计50例(经典收藏)

C语⾔程序设计50例(经典收藏)本篇⽂章是对C语⾔程序设计的50个⼩案例进⾏了详细的分析介绍,需要的朋友参考下【程序1】题⽬:有1、2、3、4个数字,能组成多少个互不相同且⽆重复数字的三位数?都是多少?1.程序分析:可填在百位、⼗位、个位的数字都是1、2、3、4。

组成所有的排列后再去 掉不满⾜条件的排列。

2.程序源代码:复制代码代码如下:#include "stdio.h"#include "conio.h"main(){int i,j,k;printf("\n");for(i=1;i<5;i++) /*以下为三重循环*/for(j=1;j<5;j++)for (k=1;k<5;k++){if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/printf("%d,%d,%d\n",i,j,k);}getch();}==============================================================【程序2】题⽬:企业发放的奖⾦根据利润提成。

利润(I)低于或等于10万元时,奖⾦可提10%;利润⾼ 于10万元,低于20万元时,低于10万元的部分按10%提成,⾼于10万元的部分,可可提 成7.5%;20万到40万之间时,⾼于20万元的部分,可提成5%;40万到60万之间时⾼于 40万元的部分,可提成3%;60万到100万之间时,⾼于60万元的部分,可提成1.5%,⾼于 100万元时,超过100万元的部分按1%提成,从键盘输⼊当⽉利润I,求应发放奖⾦总数?1.程序分析:请利⽤数轴来分界,定位。

注意定义时需把奖⾦定义成长整型。

2.程序源代码:复制代码代码如下:#include "stdio.h"#include "conio.h"main(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0. 1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;else if(i<=200000)bonus=bonus1+(i-100000)*0.075;else if(i<=400000)bonus=bonus2+(i-200000)*0.05;else if(i<=600000)bonus=bonus4+(i-400000)*0.03;else if(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus);getch();}==============================================================【程序3】题⽬:⼀个整数,它加上100后是⼀个完全平⽅数,再加上168⼜是⼀个完全平⽅数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开⽅,再将该数加上268后再开⽅,如果开⽅后 的结果满⾜如下条件,即是结果。

C语言程序设计部分习题及例题参考程序

C语言程序设计部分习题及例题参考程序

C语言程序设计部分习题及例题参考程序C语言程序设计部分习题及例题参考程序Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998《C语言程序设计》部分例题及课后习题参考程序1.编程计算如下分段函数:y={2x+3 x≥10 4x 0≤x<10 5x?6 x<0[参考程序]#include <>int main(){float x,y;printf("input x:"); scanf("%f",&x);if(x>=10)y=2*x+3;else if(x>=0)y=4*x;elsey=5*x-6;printf("y=%.2f\",y);}2.编程将从键盘输入的百分制成绩转换为等级分,转换方法如下:90以上(大于或等于90,下同)为A,80分以上为B,70分以上为C,60分以上为D,60分以下,即低于60分为E。

[参考程序]#include <>int main(){float score;char rank;printf("input a score:");scanf("%f",&score);if(score>100||score<0){printf("invalid score input\");exit(-1);}switch((int)score/10){case 10:case 9:rank='A';break;case 8:rank='B';break;case 7:rank='C';break;case 6:rank='D';break;default:rank='E';}printf("%.2f:%c\",score,rank);return 0;}3.编程判断以从键盘输入的三个数为边长,是否能构成三角形。

vc编程设计例题100例

vc编程设计例题100例

vc编程设计例题100例VC编程是指使用Visual C++进行程序设计的一种方法。

在学习VC 编程的过程中,通过实际的例题练习,可以更好地掌握编程技巧和应用。

下面将介绍一些VC编程设计例题,供大家参考。

1. 编写一个程序,实现两个整数的加法运算,并输出结果。

2. 编写一个程序,实现两个整数的乘法运算,并输出结果。

3. 编写一个程序,实现两个整数的除法运算,并输出结果。

4. 编写一个程序,实现两个整数的取余运算,并输出结果。

5. 编写一个程序,实现两个整数的比较,并输出较大的数。

6. 编写一个程序,实现两个整数的比较,并输出较小的数。

7. 编写一个程序,实现两个整数的平均值计算,并输出结果。

8. 编写一个程序,实现两个整数的最大公约数计算,并输出结果。

9. 编写一个程序,实现两个整数的最小公倍数计算,并输出结果。

10. 编写一个程序,实现一个整数的阶乘计算,并输出结果。

11. 编写一个程序,实现一个整数的平方计算,并输出结果。

12. 编写一个程序,实现一个整数的立方计算,并输出结果。

13. 编写一个程序,实现一个整数的平方根计算,并输出结果。

14. 编写一个程序,实现一个整数的立方根计算,并输出结果。

16. 编写一个程序,实现一个整数的正弦计算,并输出结果。

17. 编写一个程序,实现一个整数的余弦计算,并输出结果。

18. 编写一个程序,实现一个整数的正切计算,并输出结果。

19. 编写一个程序,实现一个整数的反正弦计算,并输出结果。

20. 编写一个程序,实现一个整数的反余弦计算,并输出结果。

21. 编写一个程序,实现一个整数的反正切计算,并输出结果。

22. 编写一个程序,实现一个整数的自然对数计算,并输出结果。

23. 编写一个程序,实现一个整数的指数计算,并输出结果。

24. 编写一个程序,实现一个整数的对数计算,并输出结果。

25. 编写一个程序,实现一个整数的四舍五入计算,并输出结果。

26. 编写一个程序,实现一个整数的向上取整计算,并输出结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、简单程序设计简单程序设计是没有分支,没有循环的直线运行程序,程序执行按照IP内容自动增加的顺序进行。

例1 利用查表法计算平方值。

已知0 ~ 9的平方值连续存在以SQTAB开始的存储区域中,求SUR单元内容X的平方值,并放在DIS单元中。

假定0≤X≤9且为整数。

分析:建立平方表,通过查表完成。

STACK SEGMENTDB 100 DUP(?)STACK ENDSDATA SEGMENTSUR DB ?DIS DB ?SQTAB DB 0,1,4,9,16,25,36,49,64,81 ; 0~9的平方表DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA BEGIN:PUSH DSMOV AX,0PUSH AX ;保证返回DOS,MOV AX,DATAMOV DS,AX ;为DS送初值LEA BX,SQTAB ;以下程序部分完成查表求平方值MOV AH,0 ;亦可用查表指令完成(如下程序段)MOV AL,SUR ;AL=X LEA BX, SQTABADD BX,AX ;MOV AL, SURMOV AL,[BX] ;XLATMOV DIS,AL ;MOV DIS, ALCODE ENDSEND BEGIN例2 已知Z=(X+Y)-(W+Z),其中X,Y,Z,W均为用压缩BCD码表示的数,写出程序。

分析:这也是一种典型的直线程序,在这里要注意是BCD数相加,要进行十进制调整。

具体程序如下:MOV AL ,Z MOV BL ,W ADD AL ,BLDAAMOV BL ,AL ; BL=(W+Z ) MOV AL ,X MOV DL ,Y ADD AL ,DL ; AL=(X+Y )DAA ;十进制调整SUBAL ,BL ; AL=(X+Y )-(Z+W )DAS ;十进制调整MOV Z ,AL ;结果送Z 例2 利用表实现分支根据AL 中各位被置位情况,控制转移到8个子程序P1~P8之一中去。

转移表的结构如表3-2所示。

分析:对于这种程序关键要找出每种情况的转移地址,从图中可见表地址=表基地址+偏移量, 而偏移量可由AL 各位所在位置*2求得。

流程图见图3-3。

DATA SEGMENTBASE DW SR0,SR1,SR2,SR3, SR4,SR5,SR6,SR7 DATA ENDS CODESEGMENTASSUME CS :CODE ,DS :DATA ,ES :DATA BEGIN : PUSH DS XORAX ,AXPUSH AXMOV AX ,DATA 图3-3 流程图 MOV DS ,AXLEABX ,BASE ;表头送BX表3-2 子程序R1—R8的入口地址表P1 子程序R1的入口偏移地址 P2 子程序R2的入口偏移地址 P3 子程序R3的入口偏移地址 …… …… ……. ……P7 子程序R7的入口偏移地址 P8子程序R8的入口偏移地址IN AL,PORTGETBIT:RCR AL,1 ;右移一位JC GETAD ;移出位是1?INC BXINC BX ;修改指针JMP GETBIGETAD:JMP WORD PTR[BX] ;实现散转CODE ENDSEND BEGIN根据跳转表构成方法不同,实现分支的方法也有所改变,下面有三个问题希望大家思考:(1) 若跳转表地址由段值和偏移量四个字节构成,程序应如何实现?(2) 若跳转表中的内容由JMP OPRD指令构成,表的结构应如何组织、程序如何实现?(3) 上述程序若不用间接跳转指令,而改为直接跳转,程序如何变动?例3将内存中某一区域的原数据块传送到另一区域中。

分析:这种程序若源数据块与目的数据块之间地址没有重叠,则可直接用传送或串操作实现;若地址重叠,则要先判断源地址+数据块长度是否小于目的地址,若是,则可按增量方式进行,否则要修改指针指向数据块底部,采用减量方式传送。

程序如下:DATA SEGMENTSTR DB 1000 DUP(?)STR1 EQU STR+7STR2 EQU STR+25STRCOUNT EQU 50DATA ENDSSTACK SEGMENT PARA STACK ‘STACK’STAPN DB 100DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK GOO PROCPUSH DSSUB AX,AX ;将AX清零PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,STACKMOV SS,AXMOV CX,STRCOUNTMOV SI,STR1MOV DI,STR2CLD ;将DF置0确定地址修改方向PUSH SI ;将源首地址入栈ADD SI,STRCOUNT-1 ;判断源地址+数据块长度是否小CMP SI,DI ;于目的地址POP SI ;将源首地址弹出堆栈,赋给SIJL OK ;如果源地址+数据;块长度小于目的地址,直接传送数据STD ;如果大于目的地址,将DF置1改变地址修改方向ADD SI,STRCOUNT-1 ;从最后一个存储单元传送数据,以免ADD DI,STRCOUNT-1 ;把源数据中最后几个单元的数据覆盖OK:REP MOVSBRETGOO ENDPCODE ENDSEND GOO例4 设内存BUFF开始的单元中依次存放着30个8位无符号数,求它们的和并放在SUM单元中,试编写程序。

分析:这是一个求累加的程序。

(设计思想同C语言)程序如下:MOV SI,BUFF ;设地址指针MOV CX,30 ;设计数初值XOR AX,AX ;设累加器初值AGAIN:ADD AL,[SI]ADC AH,0INC SIDEC CXJNZ AGAIN ;循环累加MOV SUM,AX例4在给定个数的16位数串中,找出大于零、等于零和小于零的个数,并紧跟着原串存放。

分析:这是一个统计问题,须设定三个计数器分别统计三种情况下的结果。

程序如下:DATA SEGMENTBUFF DW X1,X2,X3, (X)COUNT EQU $-BUFF ;此时,COUNT的值为BUFF所占的字节数PLUSE DB ?ZERO DB ?MINUS DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAASSUME ES:DATA,SS:STACKBEGIN:MOV AX,DATAMOV DS,AXMOV CX,COUNTSHR CX,1 ;相当于除2,正好为BUFF中的数据个数MOV DX,0 ;设定计数器初值MOV AX,0 ;设定计数器初值LEA BX,BUFFAGAIN:CMP WORD PTR[BX],0JAE PLU ;大于等于0,则转PIUINC AH ;<0,则统计JMP NEXTPLU:JZ ZER ;=0,则转ZERINC DL ;>0,则统计JMP NEXTZER:INC DH ;=0,则统计NEXT:INC BXINC BXLOOP AGAINMOV PLUS,DLMOV ZERO,DHMOV MINUS,AHMOV AX,4C00HINT 21HCODE ENDSEND BEGIN第七章8259A的应用举例例1. IBMPC机中,只有一片8259A,可接受外部8级中断。

在I/O地址中,分配8259A的端口地址为20H和21H,初始化为:边沿触发、缓冲连接、中断结束采用EOI命令、中断优先级采用完全嵌套方式,8级中断源的中断类型分别为08H—0FH,初始化程序为:MOV DX,20HMOV AL,00010011BOUT DX,AL ;写入ICW1MOV DX,21HMOV AL,08HOUT DX,AL ;写入ICW2MOV AL,00001101BOUT DX,AL ;写入ICW4XOR AL,ALOUT DX,AL ;写入OCW1。

STI。

例2.进入和退出特殊屏蔽方式的流程图。

假定,初始化之后,8259A工作于完全嵌套方式,要求对于IR3的中断级,能够允许任何级别的中断中断其中断服务程序,即8259A按特殊屏蔽方式工作。

因而在响应IR3而执行IR3的中断服务程序时,在A处,写入OCW1以屏蔽IR3,然后写入OCW3使ESMM=SMM=1,于是从A处开始,8259A进而特殊屏蔽方式,此后继续执行IR3的中断服务程序。

在中断服务结束之前,再向8259A写入OCW3使ESMM=1,SMM=0,结束特殊屏蔽方式,返回到完全嵌套方式,接着写入OCW1,撤消对IR3的屏蔽,最后写入OCW2,向8259A发出EOI命令。

此例,说明在IR3的中断服务程序的A处至B处,允许任何级别的中断源中断IR3的服务程序。

(除本身之外)。

IR3中断服务程序入口STI 保护现场。

STI 开中断MOV AL,00001000B 服务程序OUT 21H,AL ;OCW1 写入OCW1,使IM3=1MOV AL,01101000B 写入OCW3,使ESMM=SMM=1OUT 20H,AL ;OCW3继续服务。

写入OCW3,使ESMM=1,SMM=0 MOV AL,01001000B 写入OCW1,使IM3=0OUT 20H,AL ;OCW3 写入OCW2,普通的EOI命令MOV AL,00H 中断返回OUT 21H,AL ;OCW1MOV AL,00100111BOUT 20H,AL ;OCW3OUT 21H,AL ;OCW3 EOI命令例3.读8259A相关寄存器的内容。

设8259A的端口地址为20H、21H,请读入IRR、ISR、IMR寄存器的内容,并相继保存在数据段2000H开始的内存单元中;若该8259A为主片,请用查询方式,查询哪个从片有中断请求。

解:MOV AL,xxx01010B 发OCW3,欲读取IRR的内容OUT 20H,ALIN AL,20H 读入并保存IRR的内容MOV (2000H),ALMOV AL,xxx01011B 发OCW3,欲读取ISR的内容OUT 20H,ALIN AL,20H 读入并保存ISR的内容MOV (2001H),ALIN AL,21H 读入并保存ISR的内容MOV (2002H),ALMOV AL,xxx0110xB 发OCW3,欲查询是否有中断请求OUT 20HIN AL,20H 读入相应状态,并判断最高位是否为1TEST AL,80HJZ DONEAND AL,07H 判断中断源的编码…………DONE:HLT第八章接口应用举例例4 将上例中8255A的工作方式改为方式1,采用中断方式将BUFF开始的缓冲区中的100个字符从打印机输出。

相关文档
最新文档