微机程序设计代码例题
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坦克大战
测试游戏功能是否正常
检查游戏性能是否达标
调试游戏中的错误和问题
优化游戏性能和体验
游戏测试:成功运 行,无严重错误
调试过程:定位并 修复了若干问题
测试结果:性能稳 定,符合预期
结论:游戏测试和 调试工作顺利完成
游戏优化和改进
优化算法:采用更高效的算法,减 少计算量,提高游戏运行速度。
完 成 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个⼩案例进⾏了详细的分析介绍,需要的朋友参考下【程序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语言程序设计部分习题及例题参考程序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编程是指使用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. 编写8086汇编语言程序片段,完成将数据段中偏移地址为1000H单元中的一个字数据的高8位传送至寄存器AL,低8位传送至寄存器DL。
2 请用2种不同的方法写出程序段,完成将源操作数(SRC)和目的操作数(DST)互换。
3分别用2种不同的方法完成在字存储单元DB1中存储数据2000H的操作(提示:分别用指令语句和伪指令语句)。
4 判断MEM单元的数据,编程将奇数存入MEMA单元,将偶数存入MEMB单元。
(提示:如果一个数的最低位为1,则该数为奇数,否则为偶数。
仅编写程序段)5 编一个程序段,数据段有100个无符号字节数据块BUF,试找出其中最小的数并放入MIN单元中(注:不低于/高于等于条件转移指令为JNB)。
6.编一个程序段。
数据段有100个无符号字节数据块BUF,试找出其中数值为0的数据个数并放入ZERO单元中(注:结果不为零条件转移指令为JNZ)。
7. 在数据段BUF开始的连续10个单元中存放有10个无符号数,编程找出其中的最大值放入MAX单元中。
(提示:低于/不高于等于条件转移指令为JB,仅编程序段)8.在数据段BUF开始的连续10个单元中存放有10个无符号数,编程求出它们的和并放入SUM单元中。
(提示:假设结果不溢出,仅编程序段)参考答案1.编写8086汇编语言程序片段,完成将数据段中偏移地址为1000H单元中的一个字数据的高8位传送至寄存器AL,低8位传送至寄存器DL。
MOV BX,1000HMOV DL,[BX]INC BXMOV AL,[BX]HLT2.请用2种不同的方法写出程序段,完成将源操作数(SRC)和目的操作数(DST)互换。
① MOV AX,SRCMOV BX,DSTXCHG AX,BXMOV SRC,AXMOV DST,BX② MOV AX,SRCMOV BX,DSTMOV SRC,BXMOV DST,AX③ PUSH WORD PTR [SRC]PUSH WORD PTR [DST]POP WORD PTR [SRC]POP WORD PTR [DST]3.分别用2种不同的方法完成在字存储单元DB1中存储数据2000H的操作(提示:分别用指令语句和伪指令语句)。
(微机原理及应用)编程题_试题集
重庆科技学院试题库系统试题库导出试题微机原理及应用-编程题(43题)题序:0017题型:06难度:01分值:10.0章号:03节号:02知识点:;8086/8088指令系统题干:变量DATAX和DATAY定义如下:DATAX DW 0148HDW 2316HDA TAY DW 0237HDW 4052H试编写一个程序段,实现将DATAX和DA TAY两个字数据相乘(用MUL)。
答案:解:(1) MOV AX, DATAXMUL DATAYMOV DATAY,AXMOV DATAY+2,DX题序:0018题型:06难度:02分值:10.0章号:03节号:02知识点:;8086/8088指令系统题干:变量DATAX和DATAY定义如下:DATAX DW 0148HDW 2316HDA TAY DW 0237HDW 4052H试编写一个程序段,实现将DATAX除以23(用DIV)。
答案:解:(1) MOV AX, DATAXMOV BL, 23DIV BLMOV BL,AHMOV AH, 0MOV DATAY, AX ;存放商MOV AL,BLMOV DATAY+2, DX ;存放余数题序:0002题型:06难度:03分值:10.0章号:03节号:02知识点:;8086/8088指令系统题干:试编写一个程序段,实现将BX中的数除以10,结果仍放在BX中。
答案:解: MOV CL,0AHMOV AX,BXDIV CLMOV BX,AX题序:0016题型:06难度:03分值:10.0章号:03节号:02知识点:;8086/8088指令系统题干:变量DATAX和DATAY定义如下:DATAX DW 0148HDW 2316HDA TAY DW 0237HDW 4052H试编写一个程序段,实现将DATAX和DA TAY中的两个双字数据相加, 和存放在DA TAY和答案:解:(1) MOV AX, DATAXADD AX, DATAYMOV BX, DATAX+2ADD BX, DATAY+2MOV DATAY, AXMOV DATAY+2, BX题序:0020题型:06难度:03分值:10.0章号:03节号:02知识点:;8086/8088指令系统题干:变量N1和N2均为2字节的非压缩BCD数码,请写出计算N1与N2之差的指令序列。
微机原理实验(循环程序设计)
教
师
评
阅
教师签字年月日
备注:1.文件名命名方式为:学号+姓名+实验序号.DOC
2.将文件按附件形式添加后提交
DATA SEGMENT
DB 06H,12H,88H,82H,90H,22H,33H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV DI,0000H
MOV CL,[DI]
XOR CH,CH
MOV BL,CH
INC DI
A0: MOV AL,[DI]
TEST AL,80H
JE A2
INC BL
A2: INC DI
LOOPA0
MOV [DI],BL
MOV AX,4C00H
INT 21H
CODE ENDS
END START
实
验
步
骤
(1)用编辑软件如:EDIT,输入源程序,并保存,后缀名为.ASM。
-U ;先用反汇编来查看源程序装入的地址和数据段的地址
:
-G=xxxx:xxxx;从程序装入的地址处,开始运行程序
(5)查看实验结果。
(6)也可使用EMU8086软件进行调试
骤
实
验
分
析
与
总
结
1.通过实验掌握了宏汇编命令的基本格式及对循环结构的理解。
2.熟悉并掌握了循环结构程序设计的方法。
2.求某数据区内负数的个数。
设数据区的第一个单元存放数据的个数,从第二个单元开始存放数据,在最后一个单元存放结果。
微机原理程序设计试题
汇编语言程序设计试题一、单项选择题〔在每小题的四个备选答案中有一个正确的答案,将正确答案的序号写在题干的括号内。
每小题1分,共10分)1.在堆栈段中,存放栈顶地址的寄存器是()A.IPB.SPC.BXD.BP2.汇编语言程序中,反映指令操作结果的标志是()A.状态标志B.控制标志C.ZFD.DF3.书写汇编语言程序时规定,对字母开头的十六进制数,其前面必须加()A.OB.DC.BD.H4.计算机中用来存储程序、数据等信息的记忆装置是()A.控制器B.运算器C.CPUD.存储器5.MOV [SI][BX],AL,该指令中目的操作数采用的寻址方式是()A.基址加变址B.寄存器C.寄存器间接D.寄存器相对6.MUL 〒SI〓指令中的乘积是存放在()、AX中。
A.CXB.BXC.DXD.SI7.汇编语言中,存放下一条将要执行的指令地址寄存器是()A.SPB.AXC.DID.IP8.在计算机中,以先进后出方式工作的存储空间是()A.存储器B.RAMC.ROMD.堆栈9.TEST AH,30H指令的功能与()指令功能相类似。
A.ANDB.CMPC.SUBD.OR10.在存储器中留60个字的空单元的伪指令是()A.ARRAY EQU 60B.ARRAY DW 60C.ARRAY DB 60 DUP(?)D.ARRAY DW 60 DUP(?)二、填空题(每空格1分,共20分)l.变量和标号的区别是________。
2.下述指令的目的操作数是存放在堆栈段中,请填入正确答案。
ADD____[BX],CH。
3.段地址和偏移地址为2000:5076的存储单元物理地址是____。
4.在下列程序段括号中,填入正确的答案。
() SEGMENTBUF DB 12H,56HDATA ENDSCODE SEGMENT...CODE ()5.指出下列指令错误原因,填入括号中。
A. MOV AX,BL ;()B. MOV CS,AX ;()C. DEC GAMA[BX];()D. MOV ES,5600H;()E. SUB AX,DS ;()6.下列语句在存贮器中分别为变量分配多少字节?请填入括号中。
Visual Basic程序设计语言常用算法例题源代码30题
Visual Basic程序设计语言常用算法源代码30例题1、统计随机产生的十个两位正整数中偶数与奇数的个数,并求出偶数与奇数各自的总和Option ExplicitPrivate Sub Form_Click()Dim x As Integer, s1 As Integer, s2 As IntegerDim n1 As Integer, n2 As Integer, i As IntegerRandomizeFor i = 1 To 10_x=int(90*rnd)+10__Print x;If _ x mod 2=0 Thenn2 = n2 + 1s2 = s2 + xElse___n1=n1+1_s1 = s1 + xEnd IfNext iPrintPrint "奇数个数="; n1; "偶数个数="; n2;End Sub2.从字符串中分离数字和字母Private Sub Command1_Click()Dim s As String, i As IntegerConst ch As String = “0123456789.”s = "2L0A09U.0SI3V.24"For i = 1 To Len(s)If InStr(ch, Mid(s, i, 1)) = 0 Thenst1 = Mid(s, i, 1) & st1Elsest2 = st2 & Mid(s, i, 1)End IfNext iPrint st1: Print st2End Sub3. 统计字符串中“O”的个数Private Sub Command1_Click()a = "THERE IS A BOOK ON THE DESK"m = len(a)For i = 1 To mb =mid(a,i,1)If b = "O" Then num=num+1Next iPrint numEnd Sub4.从给定的字符串中只分离出数字Private Sub Command1_Click()Dim s As String, t As StringDim i As Integers = Text1.TextFor i = 1 To Len(s)If Mid(s, i, 1) >= "0" And Mid(s, i, 1) <= 9 Thent = t & Mid(s, i, 1)End IfNext iText2.Text = tEnd Sub5.(一)将正整数转化成二进制数Private Sub Command1_Click()Dim n As Long, t As Stringn = Val(Text1.Text)Dot = n Mod 2 & tn = n \ 2Loop Until n = 0Text2.Text = tEnd Sub5、(二)将正整数转化成16进制Private Sub Command1_Click()Dim n As Long, t As String, g As Stringn = Val(Text1.Text)Dog = n Mod 16If Val(g) > 9 Theng = Chr(55 + Val(g))End Ift = g & tn = n \ 16Loop Until n = 0Text2.Text = tEnd Sub5、(三)将正整数转化成8进制Private Sub Command1_Click()Dim n As Long, t As Stringn = Val(Text1.Text)Dot = n Mod 8 & tn = n \ 8Loop Until n = 0Text2.Text = tEnd Sub6.找出100以内的所有勾股数(不包括100)Private Sub Form_Click()Dim a As Integer, b As Integer, c As Integer, n As IntegerFor a = 1 To 99For b = 1 To 99For c = 1 To 99If a ^ 2 + b ^ 2 = c ^ 2 And a <> b Thenn = n + 1Print a; b; c; “; “;If n Mod 5 = 0 ThenPrintEnd IfEnd IfNext cNext bNext aPrint nEnd Sub7.找出三位数字中的所有升序数(各位数字>十位数字>百位数字)Private Sub Form_Click()Dim a As Integer, b As Integer, c As Integer, n As IntegerFor a = 1 To 9For b = 1 To 9For c = 1 To 9If a < b And b < c Thenn = n + 1Print a * 100 + b * 10 + c;If n Mod 10 = 0 Then '控制每行打印10个PrintEnd IfEnd IfNext cNext bNext aPrint nEnd Sub或Dim n As Integer, a1 As Integer, a2 As Integer, a3 As Integer, js As Integer For n = 100 To 999a1 = n \ 100 ‘取出百位数字a2 = n \ 10 Mod 10 ‘取出十位数字a3 = n Mod 10 ‘取出个位数字If a1 < a2 And a2 < a3 Thenjs = js + 1Print n;If js Mod 10 = 0 ThenPrintEnd IfEnd IfNext nPrint jsEnd Sub利用过程调用思想求升序数例找出a-b范围内的所有升序数,a>=100,b<=30000Private sub command1_click()Dim a as integer,b as integer,i as integera=text1:b=text2For i=a to bIf sx(i) thenList1.additem iEnd ifNext iEnd subPrivate sub function sx(byval n as integer) as booleanDim a() as integer,k as integer,i as integerDoK=k+1Redim preserve a(k)a(k)=n mod 10n=n\10loop until n<=0for i=1 to ubound(a)-1if a(i+1)>=a(i) then exit function (应该去判断a(1)>a(2)……a(k)但是不好判断,遇难则反,只要有一个a(i+1)>=a(i)这不是升序数)next isx=trueend function8.最小公倍数Private Sub Form_Click()Dim m%, n%, tem%m = Val(Text1.Text)n = Val(Text2.Text)tem = mDo While tem Mod n <> 0tem = tem + mLoopPrint m; "和"; n; "的最小公倍数是:"; temEnd Sub9.求一维数组a(n)各元素的和:Dim s as integer , I as intgers=0for i=1 to ns=s+a(i)next i10.求二维数组a(n,m)各元素的和Dim s as integer, i as integer, j as integers=0For i=1 to nfor j=1 to ms=s+a(i,j)next jNext i11. 求二维数组a(m,n)周边元素的和Dim s as integer, i as integerS=0For i=1 to ns=s+a(1,i)+a(m,i) (求第一行与最后一行的和)Next ifor i=2 to m-1s=s+a(i,1)+a(i,n) (求第二行到倒数第二行第一列与最后一列的和)Next i12、求二维数组a(n,n)主对角线元素的和(理解主对角线)Dim s as integer,i as integerS=0For i=1 to ns=s+ a (i,i)Next i13、求二维数组a(n,n)次对角线元素的Dim a as integer, i as integerS=0For i=1 to ns=s+a(i,n+1-i)Next i14、三种排序法(1)选择排序法是逐个比较,逆序交换;冒泡法是两两比较,逆序交换.(2)直接排序法(以降序为例)特点:比较后不立即互换元素,而是记下较大值的位置,并在每一轮比较完毕后和S(i)互换选择排序法(比较排序法)基本过程(以降序为例):将第一个元素顺序与其后面的元素比较,比第一个大则进行交换,第一轮完毕后,最大的元素被挪到了第一个位置,第二轮从第二个元素开始重复上面的过程,结束后得到第二个最大的元素,如此下去经过N-1 轮的比较,可将N 个数排好(3)冒泡法排序(以升序为例),则方法为:将相邻两个数比较,把小数对调到前边,如此进行一轮后,就会把最大的数互换到最后,再进行一次,则会把第二大数排在倒数第二的位置上,进行N-1次后,整个数列即可排好.在这种排序过程中,小数如同气泡一样逐层上浮,而大数逐个下沉,因此,被形象的喻为“冒泡”.选择法对数组经行降序排列Option explicitOption base 1Private sub command1_click()Dim sort(10) as integer, temp as integer , i as integer, j as integerFor i=1 to 10Sort(i)=int(rnd*99)+1Text1=text1 & str(sort(i))Next iFor i= 1 to 9For j=i+1 to 10If sort(i)<sort(j) thenTemp=a(i)a(i)=a(j)a(j)=tempend ifnext jtext2=text2 & str(sort(i))next itext2=text2 & str(sort(i))end sub直接排序法的精髓(降序)For i=1 to N-1pointer=I‘初始化pointer,在每轮比较开始处for j=I+1 to Nif Sort(pointer)< Sort(j) then pointer= j next jif I<> pointer thentemp=Sort(i) ‘交换Sort(i)=Sort(pointer)Sort(pointer)=tempend ifNext I冒泡排序法的精髓(升序)For i=1 to N-1for j=1 to N-i ‘比较次数逐次减少if S(j) > S(j+1) thent=S(j)S(j)=S(j+1)S(j+1)=t ‘立即互换end ifnext jnext i15、求三个数的和!Private Sub ifnum(str1 As String, n As Integer)Dim k As IntegerFor k = 1 To Len(str1) ‘逐个字符判断是否为数字If Asc(Mid(str1, k, 1)) < 48 Or Asc(Mid(str1, k, 1)) > 57 Thenn = 0: Exit SubEnd IfNext kn = 1End SubPrivate Sub Command1_Click()Dim a As String, b As String, c As StringDim y1 As Integer, y2 As Integer, y3 As Integera = Text1.Text ‘a,b,c用来取得三个文本框的字符串b = Text2.Textc = Text3.TextCall ifnum(a, y1) '用来判断a,b,c是否为数字串,为数字串时y1,y2,y3都为1 Call ifnum(b, y2)Call ifnum(c, y3)If y1 = 1 And y2 = 1 And y3 = 1 ThenText4.Text = Val(a) + Val(b) + Val(c)ElseText4.Text = "三个文本框内有非数字串"End IfEnd Sub16.求三个数的最小公倍数Option ExplicitPrivate Sub Command1_Click()Dim A As Integer, B As IntegerDim L As Long, C As IntegerA = Text1B = Text2C = Text3L = LCM(LCM(A, B), C)Text4 = LEnd SubPrivate Function LCM(ByVal X As Integer, ByVal Y As Integer)Dim M As Long, Flg As BooleanFlg = FalseDo Until FlgM = M + XIf M Mod Y = 0 ThenFlg = TrueEnd IfLoopLCM = MEnd Function17.打印九九乘法表Private sub form_clickDim I as integer, j as integerFor i=1 to 9For j=1 to iPrint j;”*”I;”=”i*j;Next jprintNext iEnd sub18判断完数(一个数如果恰好等于他所有因子之和,这个数就是完数。
微机原理-实验一-汇编语言-冒泡排序
微机原理实验报告班级:XXXXX姓名:XXXX学号:20XXXXXXXXX大学信息科学与技术学院信息工程系实验一汇编语言程序设计-(具体题目)一、实验目的(根据实际情况修改):1、熟悉MASM编译环境,了解程序的汇编方法;2、熟悉常用汇编指令,学习汇编程序设计方法;3、学习汇编语言的调试过程,通过调试过程认识CPU执行程序的方式;4、了解冒泡法原理,学习多重循环的编程方法。
二、实验内容:编写程序,用冒泡法实现将数据段内9,8,7,6,5,4,3,2,1按照由小到大的顺序重新排列。
三、程序流程图和程序代码1、流程图2、代码与注释(代码不能和指导书完全一样,写出注释,写出寄存器尤其是DS的值)data segmentbuf1 db 8,7,6,5,4,3,2,1data endscode segmentassume cs:code,ds:datastart: mov ax,data //传送数据段datamov ds,axmov dx,7 //dx放外循环7次L3: mov cx,dx //cx放内循环7次lea si,buf1 //将db里的数据传送到siL2: mov al,[si]cmp al,[si+1] //比较[si]与[si+1]jb L1 //[si]<[si+1],跳转到L1xchg al,[si+1] //[si]>[si+1],两两交换mov [si],alL1: inc si //si减1loop L2 //循环L2dec dx //外循环减1,没减到0则跳转到L3 jnz L3 //入内循环,计数初值mov ah,4chint 21hcode endsend start四、调试过程及遇到的问题1、程序执行截图2、调试用到的命令-U命令:查看数据段地址;-d命令:查看运行前后存储器内容;-g命令:运行程序;-t命令:查看运行前后寄存器和存储器内容。
3、遇到的问题及解决办法问题:运行程序后,数据1在存储器地址末尾没变。
微机练习题5
一、单选题第1题(1分)你的得分:1调试程序DEBUG的命令E表示【1】。
A. 单步运行程序B. 反汇编命令C. 检查和修改寄存器内容D. 修改内存单元内容题目答案:D你的答案:D第2题(1分)你的得分:1语句DADA DW 'AB','CD','E','F' 汇编后占用的存储空间是【2】个字节。
A. 4 B. 8 C. 6 D. 5题目答案:B你的答案:B第3题(1分)你的得分:0把汇编源程序变成代码程序的过程是【3】。
A. 编译B. 汇编C. 编辑D. 连接题目答案:B你的答案:D题目分析:把高级语言源程序转换成代码程序称为编译;把汇编语言源程序转换成代码程序称为汇编。
编辑指的是对源程序进行录入、修改等操作。
连接指的是把代码程序转换成可执行文件。
第4题(1分)你的得分:1下列程序段:dataseg segmentevenbyte1 db 78h, 0e2hdataseg ends其中byte1 的地址为【4】。
A. 奇地址B. 偶地址C. 段地址D. 逻辑地址题目答案:B你的答案:B第5题(2分)你的得分:0已知VAR EQU 9MOV CX,((VAR GE 8)AND 2000H) OR ((VAR LT 8) AND 1990H)汇编上述语句时,生成的语句为【5】。
A. MOV CX,1990HB. MOV CX,8C. MOV CX,2000HD. MOV CX,0题目答案:C你的答案:D题目分析:已知VAR EQU 9((VAR GE 8)AND 2000H) OR ((VAR LT 8) AND 1990H)( 0FFFFH AND 2000H) OR (0000H AND 1990H)2000H OR 0000H2000H第6题(1分)你的得分:1书写汇编语言程序时规定,对字母开头的十六进制数,其前面必须加【6】。
微机编程题
二、实验内容1.设W、X、Y、Z均为16位带符号数。
2.要求完成计算表达式(W-(X*Y+Z-220))/X。
3.将表达式的商和余数存入数据区RESULT单元开始的区域中。
参考程序清单DATA SEGMENTW DW -304X DW 1000Y DW -12Z DW 20RESULT DW 2 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV AX,X ;被乘数X取到AX中IMUL Y ;计算X*YMOV CX,AXMOV BX,DX ;X*Y转存到BX、CXMOV AX,Z ;Z取到AX中CWD ;Z扩展到DX、AX中ADD CX,AXADC BX,DX ;计算X*Y+ZSUB BX,220 ;计算X*Y+Z-220SBB BX,0MOV AX,W ;W取到AX中CWD ;扩展到DX、AX中SUB AX,CXSBB DX,BX ;计算W-(X*Y+Z-220)IDIV X ;计算(W-(X*Y+Z-220))/XMOV RESULT,AXMOV RESULT+2,DX ;送结果MOV AH,4CHINT 21H ;返回DOSCODE ENDSEND START内容一:1.在数据区中定义三个带符号字节变量。
2.编写程序将其中的最大数找出送到MAX单元中。
参考程序清单DATA SEGMENTX DB 115Y DB 23Z DB -20MAX DB ?DATA ENDS ;数据定义CODE SEGMENTASSUME DS:DATA,CS:CODESTART:MOV AX,DATAMOV DS,AX ;数据段初始化 MOV AL,X ;X取到AL中 CMP AL,Y ;X和Y比较JG NEXT ;X>Y转NEXT MOV AL,Y ;否则Y取到AL中 CMP AL,Z ;Y和Z比较JG EXIT ;Y>Z转EXIT MOV AL,Z ;否则Z取到AL中 JMP EXIT ;转EXITNEXT: CMP AL,Z ;X和Z比较JG EXIT ;X>Z转EXIT MOV AL,Z ;否则Z取到AL中EXIT: MOV MAX,AL ;AL中内容送MAX单元 MOV AH,4CHINT 21H ;返回DOSCODE ENDSEND START内容二:1.编写程序实现将数据段STR1单元开始的20个字符移到STR2开始的存储区。
微机程序设计代码例题
一、简单程序设计简单程序设计是没有分支,没有循环的直线运行程序,程序执行按照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之一中去。
计算机C程序设计编程经典例题
计算机C程序设计编程经典例题1、找出100-999之间的所有超级素数(除去个位数还是素数)。
#include<stdio.h>int main(){int i,j,a;printf("超级素数分别是:\n");for(i=100;i<999;i++){for(j=2;j<=i;j++)if(i%j==0)break;if(i==j){a=j/10;for(j=2;j<=a;j++)if(a%j==0)break;if(a==j)printf("%d\n",i);}}printf("\n");return 0;}2、输入一个字符串判断是否为回文#include<stdio.h>int main(){char string[200];int i,n=0;printf("请输入一段字符串:\n");gets(string);for(i=0;(string[i])!='\0';i++)n++;for(i=0;i<n/2;i++)if((string[i])!=string[n-i-1]){printf("此字符串不是回文!\n");return 0;}printf("此字符串是回文!\n");return 0;}3、键盘中输入一个整数,输出其因子积。
#include<stdio.h>int main(){int n,i,m;printf("请输入一个正整数:\n");scanf("%d",&n);m=n;printf("1");while(m!=1){for(i=2;i<=m;i++)if(m%i==0)break;printf("*%d",i);m=m/i;}printf("=%d",n);printf("\n");return 0; }4、输入数据,输出其中最小者#include<stdio.h>int main(){float a[5];float min;int i;printf("请输入五个数据:\n");for(i=0;i<5;i++)scanf("%f",&a[i]);min=a[0];for(i=1;i<5;i++){if(min>a[i])min=a[i];}printf("最小数是:\n");printf("%f",min);printf("\n");return 0;}5、输入一个二进制的数,将他转换为十进制输出。
微机-例题总和
WORD PTR S9 STOP WORD PTR S7 STOP WORD PTRS5 SI
DEC CX
ADR DB 250 DUP (68, 59 , 85, 96) JNZ AGAIN
MOV AH,4CH
INT 21H
思考:如果多加一个分数段“80~90”呢.? CODE
ENDS END
START
;段的定义
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA MOV DS,AX
;给DS赋段基址
XOR AL,AL MOV BL,1 AGAIN:ADD AL,BL INC BL CMP AL,100
JB AGAIN DEC BL DEC BL MOV N,BL
INT 21H
JG NEXT1
CODE ENDS
NEG AL
END START
JMP STOP
X+20 (0<x<=8)
NEXT1:CMP AL,15 JL NEXT2 JMP STOP
Y= 5X-2 (8<x<15) ︳x︳ (其它)
.
例7:编制程序统计AX寄存器中有多少 位存置器“中1。”,将置“1”的位数送往CL寄思AX考寄:存如器果内不容想怎改么变办?
.
NEXT2:CMP AL,8
DATA SEGMENT
JG NEXT3
ARGX DB 7
ADD AL,20
RLT DW ?
ADC AH,0
DATA ENDS
JMP STOP
NEXT3:SAL AL,1 JNC GO1 INC AH
GO1: SAL AL,1 JNC GO2
微机原理程序题
sign 与 sintegerch1 与 caps 均 sum 与 i 变量1. 将下面 C 语言程序的代码片段转换为功能等价的汇编语言代码片段, 其中 均为双字变量。
if ( sinteger = = 0) sign = = 0; else If ( siteger > 0) sign = 1; else sign = - 1; mov eax,sinteger mov edx,sign cmp eax,0 jnz L1 mov ebx,0L1:cmp ebx,0 jl L2 mov ebx,1 L2:mov ebx,-12. 将下面 C 语言程序的代码片段转换为功能等价的汇编语言代码片段,其中 为字节变量。
if (ch1> = ' a ' && ch1< = ' z ') caps= =0; if (ch1> = A ' '&& ch1< = 'Z ') caps= =1; mov ax,ch1 mov bx,capscmp ax,a jb next cmp ax,z ja next mov bx,0 next:cmp ax,A jl done cmp ax,Z ja done done:3. 将下面 C 语言程序的代码片段转换为功能等价的汇编语言代码片段,其中 均为双字变量。
sum=0;for ( i=1;i< =100;i++) if ( i%2= =0) sum=sum+i; mov ecx,i mov ecx,1 .while(ecx<=100) mov eax,ecx xor edx,edx mov ebx,2 div ebx cmp edx,0 jnz next add sum,ecx next:inc ecx .endw1. 能被 4 整除但不能被 100 整除,或者年被 400 整除的年份是闰年。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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个字符从打印机输出。