河北工业大学汇编语言程序设计实验
河北工业大学 单片机实验 第四次试验 实验八 查表程序设计

实验八查表程序设计一、实验目的1.进一步熟悉MCS-51指令系统和汇编语言程序设计。
2.学会用MOVC指令编写查表程序。
二、实验内容1.设计并调试一个查平方表的程序,其功能为应用查表指令MOVC A,@A+PC,求累加器A中数的平方值,结果平方值送A。
要求待查的(A)≤15。
2.设计并调试一个根据电压值查与其对应的温度值的查表程序,其功能为应用查表指令MOVC A,@A+DPTR,求(A)中电压值对应的温度值,将温度值送R2R3(温度值为二字节的压缩BCD码),电压值的范围为(A)≤0FFH。
实验程序参考框图如3-8所示。
三、实验步骤1.键入程序和预定表后;2.通过修改自变量参数启动并调试程序,直至正确为止。
3.边调试边体会用PC或DPTR作指针查表的区别。
四、实验报告要求根据实验内容和程序参考流程,编出所需查表程序,列出实验程序清单。
五、思考题1.当表的长度〉255个字节时应选哪一条指令查表?答:当表的长度〉255个字节时应选“MOVC A,@A+DPTR”指令查表,并且需要对DPH、DPL进行运算处理,求出表目地址,再用“MOVC A,@A+DPTR”指令查表。
2.用PC指针查表编程时应注意什么?答:应先用传送指令把所查数据的项数送入累加器A,并用“ADD A,#data”对A进行修正data值等于查表指令和数据表格之间的字节数,然后用“MOVC A,@A+PC”查表,同时用PC指针查表的表的范围不能大于255个字节。
六、参考程序清单1.求平方值查表程序:ORG 0000HADD A,#02HMOVC A,@A+PCSJMP $DB 0,1,4,9,16,25 36,49DB 64,81,100,121,144,169,196,225END本程序实现通过查表得A累加器中数的平方值并将结果送A,根据A中数值采用基址加变址方法找到所查数的地址得所对应的平方数。
例:当(A)=5时,执行过程如下:D:0XE0(A)PC指针 ORG 0000H 05HC:0X0000 ADD A,#02H 07HC:0X0002 MOVC A,@A+PC 19H ;A+PC=A(10),查表的19H(25) C:0X0003 SJMP $C:0X0005 DB 0,1,4,9,16,25 36,49DB 64,81,100,121,144,169,196,225END2.测量温度查表程序:双字节查表程序刘程序如图3-8所示:双字节查表参考程序清单:ORG 0000HMOV DPTR,#TABMOV R0,AADD A,R0MOV F0,CADD A,DPLMOV DPL,ACLR AADDC A,DPHMOV C,F0ADDC A,#0MOV DPH,ACLR AMOVC A,@A+DPTR ;查第一个字节MOV R2,ACLR AINC DPTRMOVC A,@A+DPTR ;查第二个字节MOV R3,ASJMP $TAB:DW 0100H,0110H,0120H,0130H,0140H,0150H,0160H ;温度表END本程序实现根据A中电压查表中与之对应的温度值,表中温度均为2字节故(A)*2+DPTR(表首地址)即可查的对应温度值。
-《汇编语言程序设计》实验教学大纲

《汇编语言程序设计》实验教学大纲
二、实验的地位、作用和目的
汇编语言程序设计是一门实践性很强的课程,只有通过上机实习,才能深刻理解各类指令的功能,了解CPU是如何通过执行一条条指令完成某个特定功能.通过实习不仅锻炼了学生的动手能力,而且,激发了学生对本课的兴趣,变被动学为主动学,从而使学习更轻松,最终掌握汇编语言程序设计的思想和方法。
三、实验方式
1、验证性实验是指给定实验目的要求、实验条件和给出实验电路或程序,由学生独立完成
的实验;
2、设计性实验是指给定实验目的要求和实验条件,由学生自行设计实验方案并加以实现的
实验;
3、综合性实验是指实验内容涉及本课程的综合知识或与本课程相关课程知识的实验;
4、研究性实验是指参与教师的科研课题的实验。
四、实验内容、学时分配及基本要求
[实验题目一] 数码转换程序设计
[实验题目二] 分支程序设计
[实验题目三] 循环程序设计
[实验题目四] 字符串操作程序设计
[实验题目五] BCD码与二进制数之间转换程序设计
[实验题目六] 输入输出程序设计
[实验题目七] 循环嵌套程序设计
[实验题目八] 结构的定义及应用
[实验题目九] 计算机模拟钢琴程序设计
[实验题目十] 宏功能的应用
注:实验5、6任选一个,实验9、10任选一个
五、实验考核
平时成绩=(∑(操作成绩×60%+报告成绩×40%))/所开的实验个数
六、本大纲主笔人:陈华审核人:薛建生批准人:牛斌。
河北工业大学语义分析实验报告

实验三语义分析程序实现一、实验设计在实现词法、语法分析程序的基础上,编写相应的语义子程序,进行语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法。
基本实验题目:对文法G2[<算术表达式>]中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。
语法制导翻译模式是在语法分析的基础上,增加语义操作来实现的,实际上是对前后文无关文法的一种扩展。
一般而言,首先需要根据进行的语义分析工作,完成对给定文法的必要拆分和语义动作的编写,从而为每一个产生式都配备相应的语义子程序,以便在进行语法分析的同时进行语义解释。
即在语法分析过程中,每当用一个产生式进行推导或归约时,语法分析程序除执行相应的语法分析动作之外,还要调用相应的语义子程序,以便完成生成中间代码、查填有关表格、检查并报告源程序中的语义错误等工作。
每个语义子程序需指明相应产生式中各个符号的具体含义,并规定使用该产生式进行分析时所应采取的语义动作。
这样,语法制导翻译程序在对源程序从左到右进行的一遍扫描中,既完成语法分析任务,又完成语义分析和中间代码生成方面的工作。
本实验要求从编译器的整体设计出发,重点通过对实验二中语法分析程序的扩展,完成一个编译器前端程序的编写、调试和测试工作,形成一个将源程序翻译为中间代码序列的编译系统。
二、程序代码在词法分析和语法分析的基础上,完成了语义的分析,同样采用了头文件的形式,在VC++6.0中运行#include<stdio.h>#include<ctype.h>#include<stdlib.h>#include<string.h>#include<math.h>#include"cifa.h"#include"fenxibiao.h"# define PL 15 //+# define MI 16 //-# define MU 17# define DI 18#define acc 100#define MAXState 20#define NUMBER 9//表达式的个数#define MAXTEMP 10//最多临时变量的个数int State[MAXState];//状态栈int i=0;int CURRENTSTATE=0;//标识当前状态int LENGTH[NUMBER]={1,3,3,1,3,3,1,3,1};//表达式右边的长度int length;int index;//索引int Yes=0;//判断是否结束int tag=0;//判断是否需要调用词法程序//extern char * cifa();double e1,t4,f7;//整形char e12[20],t42[20],f72[20];//字符型int TEMP[MAXTEMP];int temp=0;int biaoshifu=0;FILE * fp;void REPORT_ERROR(){Yes=1;long f1=ftell(fp);char ch=fgetc(fp);fseek(fp,-1,1);printf("语法错误,第%d个字符'%C'处\n",f1,ch); }void Accept(){Yes=1;//printf("语法分析成功\n");}int INDEX(char a)//获取当前字符串对应的索引{int i;switch (a){case 'E':i=8;return(i);break;case 'T':i=9;return(i);break;case 'F':i=10;return(i);break;default: REPORT_ERROR();return(0);break;}}void Gen(int a,double i1,double i2,int t)//输出四元式{switch(a){case PL:printf("(+,%g,%g,%d)\n",i1,i2,t);break;case MI:printf("(-,%g,%g,%d)\n",i1,i2,t);break;case MU:printf("(*,%g,%g,%d)\n",i1,i2,t);break;case DI:printf("(/,%g,%g,%d)\n",i1,i2,t);break;default:break;}}void yuyi(int n)//语义子程序{switch(n){case 1:{temp++;//产生临时变量,Gen(PL,e1,t4,temp);e1=temp;break;}case 2:{temp++;//产生临时变量,TEMP[temp] Gen(MI,e1,t4,temp);e1=temp;break;}case 3:{e1=t4;break;}case 4:{temp++;Gen(MU,t4,f7,temp); t4=temp;break;}case 5:{temp++;Gen(DI,t4,f7,temp); t4=temp;break;}case 6:{t4=f7;break;}case 7:{f7=e1;break;}case 8:{f7=FCON;break;}default :printf("error\n");break;}}void Gen2(int a,char *i1,char *i2,int t)//输出四元式{switch(a){case PL:printf("(+,%s,%s,%d)\n",&i1,&i2,t);break;case MI:printf("(-,%s,%s,%d)\n",&i1,&i2,t);break;case MU:printf("(*,%s,%s,%d)\n",&i1,&i2,t);break;case DI:printf("(/,%s,%s,%d)\n",&i1,&i2,t); break;default:break;}}void fuzhi(char *a,char *b)//将数组b赋值给数组a {}void yuyi2(int n)//语义子程序{switch(n){case 1:{temp++;//产生临时变量Gen2(PL,e12,t42,temp);e12[0]=temp;break;}case 2:{temp++;//产生临时变量,TEMP[temp] Gen2(MI,e12,t42,temp);e12[0]=temp;break;}case 3:{//e12=t42;strcpy(e12,t42);break;}case 4:{temp++;Gen2(MU,t42,f72,temp); t42[0]=temp;break;}case 5:{temp++;Gen2(DI,t42,f72,temp); t42[0]=temp;break;}case 6:{//t42=f72;strcpy(t42,f72); break;}case 7:{//f72=e12;strcpy(f72,e12);break;}case 8:{//f72=TOKEN[0];strcpy(f72,TOKEN);break;}default :printf("error\n"); break;}}void INPUT(int a){index=a;int index2=0;if(Table[CURRENTSTATE][index]!=acc) {if (Table[CURRENTSTATE][index]==0)//报错{REPORT_ERROR();}elseif (Table[CURRENTSTATE][index]<20)//移近{ i++;State[i]=Table[CURRENTSTATE][index]; CURRENTSTATE=State[i];}else //规约{tag=1;length=LENGTH[Table[CURRENTSTATE][index]-20]; i=i-length;//指针回退switch(Table[CURRENTSTATE][index]-20){case 1:case 2:case 3:index2=8;break;case 4:case 5:case 6:index2=9;break;case 7:case 8:index2=10;break;default :REPORT_ERROR();break;}if (biaoshifu!=1)//不是标识符{yuyi(Table[CURRENTSTATE][index]-20);//规约调用语义子程序}else{yuyi2(Table[CURRENTSTATE][index]-20);//规约调用语义子程序}CURRENTSTATE=State[i];i++;State[i]=Table[CURRENTSTATE][index2];CURRENTSTATE=State[i];}}else{Accept();CURRENTSTATE=0;}}void main(){int res;State[0]=0;if((fp=fopen("b.txt","r"))==NULL) {printf("file open error!\n");exit(0);}else{res=cifa(fp);if(start==1)//文件以begin开始{do{res=cifa(fp);if(end==0){fseek(fp,-1,1);//文件指针回退一个*/。
汇编语言程序设计实验指导书

重庆师范大学涉外商贸学院计算机各专业实验用书汇编语言程序设计实验指导书(第一版)张开成编前言为适应教学内容由简到繁、由易到难、由浅入深的教学特点,我们编写了这本简易实验指导书,用以指导实验教学。
该指导书分两部分,第一部分指出实验的实验目的、实验内容、实验准备、实验要求、共提出十五个实验,需三十个学时完成。
第二部分为十五个实验的全部程序,仅供学生参考。
该实验指导书由数计学院计算机教研室张开成同志编写。
2010年2月第一部分提出各实验的实验内容、实验目的、实验要求和学时分配实验一:汇编语言基本操作实验(2学时)一、实验目的:明确QE、MASM、LINK三个系统软件的作用。
掌握汇编语言程序的编辑、汇编、连接过程。
二、实验内容:1、编写一个程序:用十进制输出一个按键的AS CⅡ值。
2、从键盘上读入两个一位数(必须保证按下数字键),输出它们的积。
三、实验准备:1、预习QE、MASM、LINK 三个软件的使用方法。
2、按实验要求,编写好实验源程序。
四、实验步骤:1、用QE编辑扩展名为.ASM的源文件。
2、汇编、连接生成扩展名为.EXE的可执行文件。
3、运行程序。
五、实验报告要求:1、总结用QE编辑源程序的方法。
2、说明源程序的连接、汇编过程。
3、分析运行结果。
4、按要求写出完整的实验报告(必须列出程序清单)。
实验二:分支程序设计实验(2学时)一、实验目的:1、学会简单分支和多分支程序的设计方法。
2、掌握程序的调试方法。
二、实验内容:1、从键盘读入两个一位数,输出它们的积。
若为非数字键,则显示字符“E”,退出程序。
2、从键盘接收一个按键,如为小写字母,则显示“L”,是大写字母,则显示“U”,如是数字,则显示“N”,都不是则显示“*”。
三、实验准备:1、预习分支程序设计方法。
2、按实验内容要求,编写好实验源程序。
四、实验步骤:1、用QE编辑扩展名为.ASM的源文件。
2、汇编、连接生成可执行文件.EXE。
3、运行程序。
河北工业大学编译原理实验报告

编译原理实验报告组员:韦廷廷(112455)、熊敏(112456)、马昊(113042) 任课老师:吴清一、任务概述本次实验我们要完成的任务主要是实现一个简单语言集的词法、语法和语义分析程序,验证实际编译系统的实现方法。
我们组的分工并不是词法分析、语法分析、语义分析每人负责一个,而是先确定每种分析按照哪一种方法实现,然后每个人写出自己的想法,按照自己的想法实验,最后总结到一起,有问题大家一起讨论,共同商量解决的办法。
二、系统设计实验采用的实现方法和依据:语言中的各类单词符号及其分类码表实验采用的实现方法和依据:文法:E → T | E+T | E-T T → F | T*F | T/F F → i | (E)状态ACTION GOTO ()+ - * / i # E T F0 S4 S5 1 2 31 S6 S7 Acc2 R3 R3 R3 S8 S9 R33 R6 R6 R6 R6 R6 R64 S4 S5 10 2 35 R8 R8 R8 R8 R8 R86 S4 S5 11 37 S4 S5 12 38 S4 S5 139 S4 S5 1410 S15 S6 S711 R1 R1 R1 S8 S9 R112 R2 R2 R2 S8 S9 R213 R4 R4 R4 R4 R4 R414 R5 R5 R5 R5 R5 R515 R7 R7 R7 R7 R7 R7三、系统实现(包括必要的框图,各.h和.c文件说明,所有函数功能的说明,数据结构、各种表格、变量等的说明,以及函数调用关系图等)(1)各.h和.c文件说明Cifa.cpp的功能:字符串扫描识别。
Table.cpp的功能:存放SLR分析法需要用到的ACTION和GOTO表。
Yufa.cpp的功能:引用Cifa.cpp、Table.cpp两个文件进行语法、语义的分析。
(2)函数功能说明词法分析部分函数说明:int lookup (char *token) //比较是否是关键字int GetChar(char ch) //每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。
汇编语言程序设计(合工大版)习题参考答案

4 部份习题参考答案以下各数均为十进制数,请采纳8位二进制补码运算,并回答标志寄放器FLAGS中CF和OF的值,运算结果所代表的十进制数是多少?若是用16位二进制补码运算,其结果所代表的十进制数是多少?FLAGS中CF和OF的值呢?(1)85+69 (2)85+(-69) (3)85-(-69) (4)85-(69)85=55H,69=45H,-69=BBH,8位二进制补码运算:(1)85+69 =55H+45H=9AH, CF=0,OF=1(2)85+(-69)=55H+BBH=110H,CF=1,OF=0其余略实模式下,写出段地址和偏移地址为1234:200二、1430:004二、FF00:0FFF 的物理地址。
1234:2002=12340+2002=143421430:0042=14300+0042=14342FF00:0FFF=FF000+0FFF=FFFFF已知8086系统某存储单元物理地址为:52506H,你以为段基址的最大值、最小值别离是多少? 8086微机最多能够有多少个不同的段基址?52506=5250:0006, 段基址的最大值=525052506=4251:FFF6, 段基址的最小值=4251从物理地址为00100H开始到00103H单元中顺序寄存的数据为:12H,34H,56H,78H。
请画出数据寄存示用意,并回答以下问题:(1)写出00101H字节单元的内容(00101)= 34H(2)写出00102H字单元的内容(00102)= 7856H习题3别离说明8086处置器中各寄放器的名称和作用是什么?溢出标志OF与进位标志CF有何作用和区别?何为段地址?何为有效地址?何为物理地址?用指令举例说明。
带符号数比较大小,当AX < BX时程序转向标号L1,假设前导指令为CMP AX, BX后续指令应什么缘故?假设视为二个无符号数比较大小, 后续指令应什么缘故?带符号数:JL L1, 无符号数:JB L1ADD指令和ADC指令在什么情形下是一样的结果?CF=0说出CALL指令和INT 21H指令的操作,有何异同?CALL把断点压入堆栈,不必然是远调,INT 21H还要把FLAGS压入堆栈,且是远调,总入口地址为84H内存中的两个字。
河北工业大学汇编语言程序设计实验

DEC DI
;DI=DI-1,即将 DI 指向前
一个存储单元
PUSH CX
;保存 CX 寄存器的内容
MOV CL, 04H
;给 CL 寄存器赋值为 04H
河北工业大学汇编语言实验设计
SHR DX, CL
;将[DX]逻辑右移四位
POP CX
;恢复 CX 寄存器的内容
LOOP BBB
;循环判断语句,CX=CX-1,若 CX
A ;在屏幕上显示结果 ;带返回码终止
3) 在 BUF 和 BUF+1、BUF+2 单元分别放有一个无符号字节型数,编程序将其中 最大数存入 MAX 单元,并在屏幕上显示。
STACK SEGMENT STACK
;堆栈段
DB 1000 DUP (0)
;定义其后的每个操作数都占有一个字节
STACK ENDS
ADD DI, 03
NEXT: MOV AX, DX
河北工业大学汇编语言实验设计
AND AX, 000FH CMP AL, 0AH JB QQQ ADD AL, 07H QQQ: ADD AL, 30H MOV [DI], AL DEC DI PUSH CX MOV CL, 14 SHR DX, CL POP CX LOOP NEXT MOV DX, OFFSET MOV AH, 09H INT 21H MOV AH, 4CH INT 21H CODE ENDS END START
DEC SI
;SI=SI-1,即将 SI 指向前一个存储单
元
PUSH CX
;保存 CX 寄存器的内容
MOV CL, 04H
;给 CL 寄存器赋值为 04H
SHR DX, CL
c++程序设计实验报告 直接可交版

河北工业大学《C语言程序设计课程设计》报告学部(系)计算机科学与技术班级计C141 姓名赵冰心学号 148025 成绩____一、题目小学生四则运算练习器二、设计思路1、总体设计1)分析程序的功能练习者首先选择所要练习的运算类型(加减乘除),再选运算数据的范围。
系统自动出题,练习者解答,答错两次后系统给出正确答案并出下道题。
每次出十题2)系统总体结构每一次练习的过程可以由这几部分完成:练习者选择运算种类,练习者选择运算数范围,系统连续出题,系统判断正误并给出提示,系统统计答题分数,学生选择是否继续运算。
每次计算有三个关注:1运算类型的选择2运算数范围的选择3结果正误的判断。
程序关键部分:1 switch语句,实现对运算类型的选择,表达式满足条件后break跳出2继续对运算数范围的选择。
3选择好之后系统根据练习者的选择,随机出十道题。
出题用到for循环语句和rand()函数产生随机数。
4定义三个函数,加减乘。
对函数多次调用,来实现10道题的运算。
5每次答题,系统记录答题情况,给予相应的分值,并以此累加,最终得出总成绩。
2、各功能模块的设计:说明各功能模块的实现方法#include<stdio.h>//把程序需要使用的关于系统定义的函数printf()的一些信息文件stdio.h包含进来。
#include<stdlib.h>//下面有用到rand()()、srand()() 所以先用头文件#include<time.h>//根据时间产生随机数的头文件{int a,c,d,i,g;char b;while(1){int f=0;jiemian();scanf("%d%c",&a,&b);//输入a,bfor(i=0;i<10;i++){srand(time(NULL));//根据time.h头文件产生随机数switch(b)}printf("本次成绩为:%d\n",f);printf("是否继续?\n");printf("1 是 2否\n");scanf("%d",&g);if(g==2)break;//如果g=2则打破循环}}void jiemian(){printf("***********欢迎使用四则运算练习程序**************\n"); printf("请选择运算种类及运算范围\n");printf("1 加法\n");printf("2 减法\n");printf("3 乘法\n");printf("a:1~10\n");printf("b:1~50\n");printf("c:1~100\n");}加法运算int jia(int a,int b)//加法运算{int e;printf("%d+%d=",a,b);scanf("%d",&e);if(e==a+b)return 1;//如果e=a+b成立继续循环else//错误的话给出正确答案{printf("回答错误!正确答案为:%d\n",a+b);return 0;}}减法运算int jian(int a,int b)//减法运算{int e,t;if(a<b){t=a;a=b;b=t;}printf("%d-%d=",a,b);scanf("%d",&e);if(e==a-b)return 1;//如果e=a-b成立继续循环else{printf("回答错误!正确答案为:%d\n",a-b); return 0;}}乘法运算int cheng(int a,int b)//乘法运算{int e;printf("%d*%d=",a,b);scanf("%d",&e);if(e==a*b)//如果e=a*b成立则继续循环return 1;else{printf("回答错误!正确答案为:%d\n",a*b);return 0;//返回}}3、设计中的主要困难及解决方案1 如何选择加减乘法以及如何选择算数范围2 产生的随机数满足所选定的运算数范围,由于随机数是随机产生的,经过参考资料知道利用所需范围的边界可对随机数的范围进行限定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言程序设计实验网络*** ***实验一 顺序与分支程序设计一 、实验目的1) 掌握顺序程序设计方法。
2) 掌握分支程序的结构及分支程序的设计,调试方法。
2) 学习数据传送及算术和逻辑运算指令的用法。
3) 熟悉在pc 机上建立、汇编、连接、调试和运行汇编语言程序的过程。
二、实验内容1.实验六从键盘上接收一位十进制数x ,计算y 值,并以十六进制形式显示出来,y 按下列公式计算。
⎪⎪⎩⎪⎪⎨⎧===-=+=)6(2/)5()4(2)3(2222X X X X X X X X X X Y2..实验七实验内容:从键盘上接收两个一位十六进制数x 和y ,然后再输入一个a-d 之间的一个字符,按下列要求计算。
a)当输入字符为a ,则计算x+y ,并以十六进 制形式显示出来 b)当输入字符为b ,则计算|x-y|,并以十六进制形式显示出来 c)当输入字符为c ,则计算x*y ,并以十六进制形式显示出来 d)当输入字符为d ,则计算x/y ,并以十六进制形式显示出来三、实验代码实验六DATE SEGMENTX DB ?DATE ENDS ;数据段CODE SEGMENTASSUME CS:CODE,DS:DATESTART:MOV AX,DATE ;代码段MOV DS,AX ;初始化ds寄存器MOV AH,1INT 21H ;读文件到缓冲区CMP AL,33H ;比较指令JB L0 ;A<BCMP AL,36HJA L0AND AL,0FH ;逻辑与指令MOV X,AL ;al给xMOV AL,XCMP AL,3HJE L1 ;执行L1命令CMP AL,4HJE L4 ;执行L4命令CMP AL,5HJE L6 ;执行L6命令CMP AL,6HJE L7 ;执行L7命令L1:MUL ALADD AL,X ;al+xL5:MOV BL,ALMOV CL,4SHR AL,CL ;移位指令CMP AL,9JLE L2 ;转移指令。
小于或等于,或者不大于则转移ADD AL,7L2:ADD AL,30H ;寄存器al加0x30MOV DL,ALMOV AH,2 ;把2放入ah里INT 21HAND BL,0FH ;逻辑与运算指令CMP BL,9JLE L3ADD BL,7 ;相加L3:ADD BL,30HMOV DL,BLMOV AH,2INT 21HJMP L0L4:MUL ALSUB AL,XSUB AL,XJMP L5L6:MUL ALJMP L5L7:MUL ALSHR AL,1JMP L5L0:MOV AH,4CHINT 21HCODE ENDSEND START实验七DATA SEGMENTX DB 0Y DB 0W DB 0DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXXOR AX,AXMOV AH,1INT 21HCMP AL,39HJBE L1SUB AL,07HL1:SUB AL,30HMOV X,ALMOV AH,1INT 21HCMP AL,39HJBE L2SUB AL,07HL2:SUB AL,30HMOV Y,ALMOV AH,1INT 21HA:CMP AL,41HJNE BXOR AL,ALMOV AL,XADD AL,YMOV W,ALJMP L3B:CMP AL,42HJNE CXOR AL,ALMOV AL,XSUB AL,YMOV W,ALCMP AL,0JG L3NEG ALMOV W,ALJMP L3C:CMP AL,43HJNE DXOR AL,ALMOV AL,XMUL YMOV W,ALJMP L3D:XOR AX,AXMOV AL,XDIV YMOV W,ALL3:MOV DL,ALMOV CL,4SHR DL,CLCMP DL,9JNA L4ADD DL,07H L4:ADD DL,30HMOV AH,02HINT 21HMOV DL,WAND DL,0FHCMP DL,9JNA L5ADD DL,07H L5:ADD DL,30HMOV AH,02HINT 21HMOV AH,4CHINT 21HCODE ENDSEND START四、实验结果:实验六结果实验七结果五、实验心得:(1)通过实验使我知道了和熟悉了汇编程序设计的步骤1.建立数学模型遇到一个题目,首先要进行全面的分析,根据问题提出的条件,特点,找出规律,找出问题的数学模型或者制定解决问题的规律。
2.绘制程序流程图流程图能够把比较抽象的问题变得而形象化,并且有助于理清楚思路,便于程序的编制,在程序的易读性和易维护性上有很大的帮助。
3.合理分配存储空间和寄存器汇编语言能够直接的调用存储器和寄存器。
程序运行时,大两量的数据,中间结果或最后的结果都存放在存储器中,且运行的程序目标代码在存储器中,节约空间是一个好的程序应该注意的问题。
4.编制程序根据语法指令编制程序5.人工检查用人工的方式检查程序是否有错,并及时的改正。
6.上机调试只有通过上机才能验证程序是否正确,经过反复的运行调试,才能得到正确的程序。
(2)掌握了分支程序的结构及分支程序的设计,调试方法和数据传送及算术和逻辑运算指令的用法。
汇编语言程序设计实验网络*** ***实验二循环与子程序程序设计一、实验目的1) 加深对循环结构的理解。
2)掌握循环程序的设计方法。
3)学习子程序的定义和调用方法。
4)掌握子程序、子程序的嵌套、递归子程序的结构。
5) 掌握子程序设计、编制及调试。
6) 熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。
二、实验内容1)编制在屏幕上显示九九乘法表的程序。
2)编制在屏幕上显示用*组成的三角形的程序。
三、实验代码实验一DATA SEGMENTS2 DB ?S1 DB ?X DB 1Y DB 1S DB 0AHFCH=2AHFDH=3DHFKG=20HFHH=0AHFHC=0DHDATA ENDSSTACK1 SEGMENT STACKDB 20H DUP(0)STACK1 ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1 START:MOV AX,DATAMOV CL,9LL1:PUSH CX ;将CL压入堆栈段MOV CL,YLL2:CALL L1 ;调用子程序L1INC XLOOP LL2MOV X,1INC YMOV DL,FHH ;输出换行和回车MOV AH,2INT 21HMOV DL,FHCMOV AH,2INT 21HPOP CX ;从堆栈段中取出CLLOOP LL1MOV AH,4CH ;程序结束INT 21HL1 PROC ;计算X*Y=Z并且输出X*Y=Z的子程序ADD DL,30H MOV AH,2 INT 21H MOV DL,FCH MOV AH,2 INT 21H MOV DL,Y ADD DL,30H MOV AH,2 INT 21H MOV DL,FDH MOV AH,2 INT 21H MOV AL,X MUL YDIV SMOV S1,AH ADD AL,30H MOV DL,AL MOV AH,2 INT 21HADD S1,30HMOV DL,S1MOV AH,2INT 21HMOV DL,FKG ;输出空格MOV AH,2INT 21HRETL1 ENDP ;子程序结束CODE ENDSEND START实验二DATA SEGMENTN DB ?FCH=2AHFDH=3DHFKG=20HFHH=0AHFHC=0DHDATA ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAMOV AX,DATAMOV DS,AXMOV AH,1 ;输入一位16进制数确定输出行数INT 21H CMP AL,39H JBE L1 SUB AL,07HL1:SUB AL,30H MOV N,ALXOR BX,BXMOV DL,FCHMOV CL,NMOV DL,FHH ;输出换行和回车MOV AH,2INT 21HMOV DL,FHCMOV AH,2INT 21HLOP:PUSH CXINC BLMOV CL,BLMOV DL,FCHLOP2:MOV AH,02HINT 21HLOOP LOP2MOV DL,0AHMOV AH,02HINT 21HMOV DL,FHCMOV AH,02HINT 21HCMP BL,9JZ L2LOOP LOPL2:MOV AH,4CH ;程序结束INT 21HCODES ENDSEND START四、实验结果:实验一结果实验二结果五、实验心得五、循环程序由初始化部分、循环部分、调整部分、控制部分组成1〉两种方式,一种是先判断在执行,另一种是先执行再判断。
2〉两种控制循环的方式a〉计数控制循环一般使用LOOP指令,要先将循环的次数放入CX中,在多重循环的计数控制中要注保存和复原上一次循环的断点信息,在保留和复原时可以使用堆栈进行处理。
自认为可以理解为一根盘绕了确定的圈数的绳子,又进入的头,又出去的尾。
b〉条件控制循环一般使用JMP指令使程序跳到这一段的开头,用CMP在循环中进行比较判断,再根据程序要求,选择适当的转移条件,跳出循环。
自认为可以理解为一圆形的导轨,并在导轨上设置一个初口,在符合条件时就在导轨上脱离,否则,将会在导轨上一直的转下去。
3〉再循环中可以同时使用两者,当即已知循环的次数限制范围,但又要求在符合条件时结束循环是,就要同时使用两者。
六、子程序的使用大大的简化了程序设计的思路,在完成一个程序时,可以简单的把一个程序划分为几个完整的几部分,使每一部分独立的完成特定的一部分和计算任务。
子程序的使用还可以大大的减小程序的体积,在一程序中,如果需要多次反复的是用某一段代码的话,就可以将这段代码设定为子程序,以后想使用时,只要一CALL再一RET 就OK啦。
我认为使用子程序的关键在于明白子程序的机理,明白子程序是如何保存和恢复断点的信息的,只有真正的理解了这一点才能更好地利用好子程序。
子程序的参数传递的方式有很多种,但是在堆栈段传递参数时,应该注意使用带立即数的返回的方式,在利用寄存器BP访问堆栈段来取得参数。
汇编语言程序设计实验网络*** ***实验三算术运算与代码转换程序设计一、实验目的1)掌握算术运算程序的设计方法。
2)掌握代码转换程序的设计方法。
3)进一步掌握各种程序结构。
4)熟练掌握和使用用DEBUG调试程序。
二、实验内容1)编制两个多字节整数加法和减法程序,并将结果按十六进制形式显示在屏幕上。
2)编写程序计算从键盘输入两个不超过四位的十进制数的和、差、积、商,并以十进制形式输出。