【报告】汇编语言程序设计报告
计算机组成原理与汇编实验报告

计算机组成原理与汇编实验报告姓名:学号:学院:信息科学与工程学院班级:实验1 存储器实验实验目的⏹掌握静态存储随机存储器RAM的工作特性⏹掌握静态存储随机存储器RAM的读写方法实验设备74LS273(一片),静态存储器MEMORY 6116(一片),与门(一片),与非门(一片),单脉冲(一片),开关若干,灯泡若干实验原理在微机系统中,常用的静态RAM 有6116、6264、62256 等。
在本实验中使用的是6116。
6116 为2K╳8 位的静态RAM,其逻辑图3.1如下:图3.1 6116逻辑图其中A0~10 为11 根地址线,I/O0~7 为8 根数据线,CS 为片选端,OE 为数据输出选通端,WR 为写信号端。
其工作方式见下表3-1:表3-1工作方式表实验所用的半导体静态存储器电路原理如图3.2 所示,实验中的静态存储器一片6116(2K×8)构成,其数据线接至数据总线,地址线由地址锁存器(74LS273)给出。
地址灯AD0—AD7 与地址线相连,显示地址线内容。
数据开关经一三态门(74LS245)连至数据总线,分时给出地址和数据。
图3.2 存储器实验原理图因地址寄存器为8 位,接入6116 的地址A7—A0,而高三位A8—A10 接地,所以其实际容量为256 字节。
6116 有三个控制线:CE(片选线)、OE(读线)、WE(写线)。
当片选有效(CE=0)时,OE=0时进行读操作,WE=0时进行写操作。
本实验中将OE 常接地,在此情况下,当CE=0、WE=0 时进行读操作,CE=0、WE=1 时进行写操作,其写时间与T3 脉冲宽度一致。
控制信号SW-B 为低电平有效,控制信号LDAR 为高电平有效。
实验步骤1. 选择实验设备:根据实验原理图,将所需要的组件从组件列表中拖到实验设计流程栏中。
搭建实验流程:将已选择的组件进行连线(鼠标从一个引脚的端点拖动到另一组件的引脚端,即完成连线)。
软件实验一 报告

软件实验一:汇编编程一、实验目的掌握用汇编语言设计、编写、调试和运行程序的的方法。
二、实验内容1、学生实验:分别编程实现两个16位无符号数相加,结果存放在40H41H中;两个16位的无符号数相减,结果存放在30H31H中。
相加程序思路:①输入加数高8位,加数低8位,被加数高8位,被加数低8位;②将加数低8位和被加数低8位相加,结果存入41H;③将加数高8位、被加数高8位和进位相加,结果存入40H。
相减程序思路:①输入减数高8位,减数低8位,被减数高8位,被减数低8位;②将减数低8位和被减数低8位相减,结果存入31H;③将减数高8位、被减数高8位相减,结果存入30H。
2、学生实验:编程实现X (X≥40)Y= 2X (20<X<40)0(X≤20)实验程序如下:ORG 0000HLJMP MAINORG 0030HMAIN:CMP40: CJNE R2,#40,NEXT0 ;X与40比较,结果由CY读出NEXT0: JNC BIGGER40 ;判断C的值,C为0时则X大于或者等于40,跳到BIGGER40 JC CMP20 ;判断C的值,C不为0时则X小于40,跳到CMP20CMP20: CJNE R2,#21,NEXT1 ;X与21比较,结果由CY读出NEXT1: JNC BIGGER20 ;判断C的值,C为0时则X大于或者等于21(即X大于20),跳到BIGGER20JC SMALLER20 ;判断C的值,C不为0时则X小于20,跳到SMALLER20 BIGGER40: MOV A,R2 ;X>=40时,将X的值赋给存放Y的值的R3MOV R3,ASJMP $BIGGER20: MOV A,R2 ;20<X<40时,将X的值乘以2再赋给存放Y的R3 MOV B,#02MUL ABMOV R3,ASJMP $SMALLER20: CLR A ;X<20时,将0赋给YMOV R3,ASJMP $3、学生实验:编写80个数相加,结果存放在30H31H中。
汇编代码.386将十进制按位转换成为二进制互相转化实验报告

汇编代码.386将十进制按位转换成为二进制互相转化实验报告全文共四篇示例,供您参考第一篇示例:引言汇编语言是一种底层的计算机语言,它直接面向计算机的硬件和指令集架构。
在计算机科学领域中,对汇编语言的理解和掌握是非常重要的,因为它可以帮助程序员更深入地理解计算机系统的工作原理。
本文将围绕着汇编语言中的十进制到二进制的转换,展开一项实验报告,通过编写汇编代码.386实现十进制和二进制的相互转换,并对实验结果进行分析和总结。
实验目的1. 了解汇编语言中的数据处理、位操作等基本概念和指令;2. 掌握利用汇编语言将十进制数字转换为二进制数,并将二进制数转换为十进制数的方法;3. 加深对计算机底层原理的理解,提高汇编语言编程能力。
实验过程1. 十进制转为二进制我们使用汇编语言编写代码,将给定的十进制数字转换为二进制数。
我们可以选择一个整数N作为输入,然后使用位操作指令将其转换为对应的二进制数。
在汇编语言中,可以使用移位操作来实现这一转换。
我们可以将整数N的每一位通过移位操作得到对应的二进制位,直到整个数转换完成。
2. 二进制转为十进制接下来,我们利用汇编语言编写代码,实现将给定的二进制数转换为十进制数的功能。
对于一个二进制数,我们可以通过相应的位操作和乘法操作将其转换为对应的十进制数。
具体来说,我们可以取得二进制数的每一位,并将其乘以相应位数的权值,然后求和得到十进制数。
实验结果在实验过程中,我们成功地编写了汇编代码.386来实现十进制和二进制的相互转换。
通过实际的测试和验证,我们得到了正确的转换结果。
这证明了我们的汇编代码在功能上是正确的,能够准确地进行十进制和二进制之间的转换。
实验总结通过这次实验,我们深入探讨了汇编语言中的数据处理和位操作等基本概念。
我们不仅了解了如何使用汇编语言进行十进制和二进制的转换,还加深了对计算机底层原理的理解。
我们也发现了汇编语言在实现这种功能上的高效性和灵活性。
结论本次实验通过汇编代码.386将十进制按位转换成为二进制,并实现了二进制到十进制的互相转化。
川师汇编实验报告

实验编号: 2 四川师大《汇编语言》实验报告2016 年 9月 21 日计算机科学学院 2015 级3班实验名称寻址方式实验姓名:邓小卫学号:2015110309 指导老师:__吴贞东__ 实验成绩:一.实验目的及要求熟悉8086各种寻址方式熟悉DEBUG各命令的使用方法二.实验内容3.2根据要求写出相应的汇编语言指令1.把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器2.用寄存器BX和SI的基执变址寻址方式把寄存器中的一个字节与AL寄存器的内容相加,并把结果送到AL寄存器中。
3.用寄存器BX和位移量0B2H寄存器相对寻址方式把寄存器中的一个字和(CX)相加,并把结果送回寄存器、4.用位移量为0524H的直接寻址方式把存储器中的一个字与数2A59H相加,并把结果送回该存储单元中。
5.把数0B5H与(AL)相加,并把结果送回AL中。
3.3 写出把首地址为BLOCK的字数组的第6个送到DX寄存器的指令。
要求使用以下几种寻址方式:1.寄存器间接寻址2.寄存器相对寻址3.基址变址寻址3.4 现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=12H,(20101)=34H ,(20102)=56H,(20103)=78H,(21200)=2AH,(21203)=4CH,(21202)=B7H,(212030)=65H,试着说明下列各条指令执行完后AX寄存器的内容。
1.MOV AX,1200H2.MOV AX,BX3.MOV AX,[1200H]4.MOV AX[BX]5.MOV AX,1100[BX]6.MOV AX,[BX][SI]7.MOV AX,1100[BX][SI]三.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)3.2根据要求写出相应的汇编语言指令1.把BX寄存器和DX寄存器的内容相加,结果存入DXMOV DX,5MOV BX,5ADD DX,BX2.用寄存器BX和SI的基执变址寻址方式把寄存器中的一个字节与AL寄存器的内容相加,并把结果送到AL寄存器中。
汇编语言实验7实验报告

汇编语言实验7实验报告一、实验目的本次实验旨在通过汇编语言编写程序,实现对字符串的操作和输出。
二、实验内容1. 编写一个汇编程序,要求从键盘输入一个字符串,并将其逆序输出到屏幕上;2. 编写一个汇编程序,要求从键盘输入两个字符串,并将它们拼接起来后输出到屏幕上。
三、实验过程1. 字符串逆序输出程序首先,需要从键盘输入一个字符串。
为了方便起见,我们可以先规定字符串的最大长度为100。
接着,我们需要定义两个变量:```buffer db 100 ; 用于存储输入的字符串length dw ? ; 存储输入的字符串长度```其中,db代表定义字节型变量,dw代表定义双字节型变量。
然后,我们需要使用INT 21H中断来读取用户输入的字符串。
具体而言,我们可以使用下面这段代码:```mov ah, 0Ah ; 设置INT 21H功能号为0Ahmov dx, offset buffer ; 将buffer的地址传给DX寄存器int 21h ; 调用INT 21H中断```该代码会将用户输入的字符串存储在buffer中,并且将其长度存储在length变量中。
接着,我们需要将该字符串逆序输出到屏幕上。
为了实现这个功能,我们可以使用栈来存储字符串中的每个字符,并逐个弹出来输出。
具体而言,我们可以使用下面这段代码:```mov si, offset buffer + 1 ; 将si寄存器指向字符串的第一个字符mov cx, length ; 将cx寄存器设置为字符串长度dec cx ; 字符串长度需要减1reverse:push byte ptr [si] ; 将当前字符压入栈中inc si ; 指向下一个字符loop reverse ; 循环直到所有字符都被压入栈中mov ah, 02h ; 设置INT 21H功能号为02h,表示输出一个字符print:pop dx ; 弹出栈顶元素int 21h ; 输出该字符loop print ; 循环直到所有字符都被弹出并输出完毕```2. 字符串拼接程序首先,需要从键盘输入两个字符串。
汇编语言心得体会

汇编语言心得领会【篇一:汇编语言学习心得】汇编学习心得08 网工(一)班李锐0804031002此外,在 c 语言中不到10 个语句构成的程序,用汇编语言却要好几十行甚至上百行。
这不得不让我们对汇编产生一种惧怕感。
事实上,这是完整不用要的。
一旦对它的原理掌握后,编写程序就简单多了。
此外,学习汇编语言能让我们更为认识计算机内部的组织构造,对我们计算机专业的学生来说,学习汇编也是提高综合能力的要点环节。
汇编的学习不不过是学习其语法,而更多的是学习计算机基本的体系构造。
此中碰到好多新的观点,名字。
如寄存器、中止、寻址方式等。
这些观点在刚接触汇编这门课的时候难以理解,但在以后的学习中经过老师的解说,自己亲手编程的方式也就逐渐清楚了然。
我们在学习从前都需要明确什么是汇编语言。
计算机能够直接辨别的数据是由二进制数0 和 1 构成的代码。
机器指令就是用二进制代码构成的指令,一条机器指令控制计算机达成一个基本操作。
为了战胜机器语言的弊端,人们采纳助记符表示机器指令的操作码,用变量取代操作数的寄存地点等,这样就形成了汇编语言。
经过一个学期的学习,我也慢慢摸出了汇编学习的规律。
第一,学习这门语言时假如能联系上从前学过的其余高级语言的知识,则会起到优秀的成效。
比如 c 语言程序的运转逻辑构造有次序(按语句挨次履行)、分支构造(if...then...else...) ,循环构造(for...next) 三种构造,也经过 c 语言认识并掌握了什么是子程序,什么是调用。
事实上,汇编语言中有关程序构造,子程序等等的知识都是跟 c 语言十分相像的,不过在编程时用到的语言不一样:汇编语言完整面向机器,需要指明数据在寄存器、内存中的流向。
第二,学习汇编语言,首要问题是学习80x86 指令系统。
假如能将指令系统中的各个助记符、格式等都能完整掌握并灵巧运用,大多半工作就已经达成了。
指令系统确立了cpu 所能达成的功能,是用汇编语言进行程序设计的最基本部分。
汇编语言程序设计实验小结

汇编语言程序设计实验小结本次汇编语言程序设计实验旨在通过实践,加深对汇编语言编程的理解和掌握,并通过编写和调试汇编程序,提升实际应用能力。
在本次实验中,我学到了许多关于汇编语言程序设计的知识和技巧,也遇到了一些挑战和问题。
以下是我对这次实验的小结。
在实验开始之前,我进行了充分的学习和准备。
通过阅读教材和参考资料,我了解了汇编语言的基本概念、指令集和编程规范。
同时,我还学习了调试工具的使用方法,以便在编写程序时能够进行实时调试,提高效率和准确性。
在实验过程中,我遇到了一些困难和挑战。
其中之一是理解和运用汇编语言的指令集。
由于汇编语言是一种低级语言,指令的数量和种类相对较多,需要深入了解每个指令的功能和使用方法。
为了解决这个问题,我通过查阅资料和请教老师,逐步掌握了常用指令的用法,并能够根据实际需求选择合适的指令进行编程。
另一个困难是调试程序时出现的错误。
由于汇编语言是一种底层语言,对程序员的要求较高,一旦出现错误,往往需要仔细检查每一步的操作和数据处理过程。
在实验中,我遇到了一些错误,例如指令书写错误、寄存器使用错误等。
为了解决这些问题,我采取了逐步调试的方法,通过观察变量的值、输出结果的正确性等来定位错误的位置,并逐步修改代码,最终成功解决了问题。
在实验过程中,我也发现了汇编语言编程的一些优点和特点。
首先,汇编语言可以直接访问底层硬件资源,使得程序的执行效率较高。
其次,汇编语言的灵活性较高,可以实现一些高级语言难以实现的功能。
例如,通过汇编语言编写的程序可以直接操作内存,实现对特定位置的数据读取和存储。
再次,汇编语言的指令集相对简单,易于学习和理解。
因此,掌握汇编语言编程对于深入理解计算机体系结构和底层工作原理非常有帮助。
通过本次实验,我不仅学到了汇编语言程序设计的知识和技巧,还培养了分析和解决问题的能力。
在以后的学习和工作中,我将继续学习和掌握汇编语言编程,将其应用于实际项目中,提高程序的性能和效率。
北京理工大学汇编语言实验报告实验三字符串操作实验

北京理工大学汇编语言实验报告实验三字符串操作实验实验三字符串操作实验一、实验目的1)熟悉串操作指令的功能与应用;2)掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序;3)了解汇编语言字符串处理基本流程;二、实验软硬件环境1)硬件环境:惠普64位一体化计算机及局域网; 2)软件环境:windows 8,红蜘蛛管理系统,MASM for Win dows三、实验相关知识1)字符串操作流程SI寄存器保存源串首地址;DI寄存器保存目的串首地址;CX寄存器保存字符串长度;CLD或STD指令设置字符串处理方向;2)重复前缀指令重复次数由计数寄存器CX中存放的值决定,指令每重复执行一次,计数器CX中值减1,当CX 中值减至0时,停止重复执行,继续执行下一条指令。
寄存器的E内容条件为复前罡重复与操作直配合工作的字符串处理指令有MOVSSTOS^ LODS当REPE/REP判断计数寄存器的内容CX是否为0或ZF=O(即比较的两个操作数不等)亠只要满足一个则重复执行结束,否则继续执行。
可以与REPE/REP配合工作的串指令有CMP和SCAS0或體茴比较P判个操数数相等的内容要满足一个则重复执行结束,否则继续执行。
可以与REPE/REP配合工作的串指令有CMPS口SCAS3)字符串操作指令lodsb、lodsw :把DS:SI 指向的存储单元中的数据装入AL或AX然后根据DF标志增减SI ;stosb、stosw :把AL 或AX 中的数据装入ES:DI指向的存储单元,然后根据DF标志增减DI ;movsb movsw把DS:SI 指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据DF 标志分别增减SI和DI ;scasb、scasw:把AL或AX中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI ;cmpsb cmpsw把DS:SI指向的存储单元中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI ;rep :重复其后的串操作指令。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【关键字】报告汇编语言程序设计报告计算机学院2011/6/7题目要求分支程序设计:1、编写程序,键入学生成绩(百分制),按A、B、C、D显示在屏幕上。
子程序设计:2、给定一个数组存放5个小写字母,用地址表传递方法编写子程序,将其转换成大写字母,并显示在屏幕上。
循环程序设计:3、设有一段文字,编写一段程序查找字母a出现的次数,并显示在屏幕上。
DOS功能调用:4、在图形方式下,在屏幕中央绘制一个用“*”表示的等腰三角形。
5、编写一个生成ASCII码表的程序,并显示在屏幕上。
6、根据提示输入任意年份,编写判断闰年的程序,如果是闰年,则在屏幕上显示“Y”,否则显示“N”。
7、显示杨辉三角形。
要求:(1)从键盘接收正整数n;(2)屏幕显示杨辉三角形,显示n行信息;编程思路:1.在数据段设置提示信息,成绩ABCD的显示信息,并预留空间。
利用DOS中断,取得输入的字符,输入字符的ASCII值在30H-39H之间为‘0-9’,不是则报错,值存入SCORE中,将SCORE的高位分别与9,8,7,6相比,跳转到设置好的代码区,输出对应成绩(A,B,C,D).若为3位数,则跳到A区,输出A.2. 在数据段设置ADDRESS存放数据偏移量和COUNT计数器利用DOS中断,取得输入的字符串存入DX中,偏移量存入STRING,并存入ADDRESS中。
COUNT存入ADDRESS+2地址中,调用子程序TURN,利用SI指针与ADDRESS配合将每个字母由大写转为小写。
3. 在数据段设置STRING用于存放键盘输入字符,COUNT存放字符个数,利用DOS中断,输入字符串存入STRING.编写CHECK模块用于检查输入的字符是否为a,循环执行CHECK模块,为a 则BL+1,不为a,SI+1继续检查,直至CX=0,最后输出结果。
4.堆栈段预留128字节空间存放*.设置SI控制空格数,BX为输出*个数.设置3层循环,分别输出空格数,*数,回车.首先将保护CX行数,将其压入栈中,外层循环按CX列数,输出每行之前的空格数,之后根据BX输出*,此时一行输入完,输出回车换行后,BX+2即*数+2,CX出栈,加入外循环,输出下一行信息。
5.初始化时设置行列数,第一个字符的ASCII值,设置两层循环,首先CX入栈保护输出行数,外层循环控制输出行数,内循环输出列个数对应的字符数,将要输入的字符存入DL,每输出完一次DL+1,SI值即列数给CX,当CX=0时,输出回车换行,CX出栈,加入外循环准备下一行的输出。
6.数据段设置提示信息,W存放输入年份的数值M,BUF存放年份字符串。
利用DOS中断,取得输入的年份字符串存入BUF中,字符个数存入CL,调用DATACATE把年份字符串转为16进制数值,在调用IFYEARS子模块判断其是否为闰年,输出相应信息。
DATACATE子模块总体设计思想,首先BUF+2给SI,利用循环,和SI指针从高位向低位逐个字符减去30H转为16进制数,将值存入W中。
IFYEARS 子模块总体设计思想,将W值给AX,判断能否被100整除,能则在判是否整除400,能则为闰年,不能则不是闰年。
若不能整除100,判是否整除4,能则为闰年,不能则不是,输出相应信息。
7.数据段设置BUF用于存放三角中的数。
总体思想:基于组合数计算杨辉三角,即c(m,n)的输出。
设置两层循环控制输出的行列,一重循环系数m,范围1-n,二重循环系数n,范围1-m。
利用DOS中断,将输入n存入num中。
主程序:内循环调用store将每行三角中的每个值存入buf中,调用外循环加入下一行。
子程序store:由ch,cl传递参数m,n,求组合数C(m,n),并转换为10进制数存入buf中,再写入一个空格。
子程序multiply:由bh,bl传递参数p,q,求乘积p(p-1)(p-2)...(p-q+1),并由dx传出。
流程图:1. 分支程序设计:2. 子程序设计:3. 循环程序设计:4. DOS功能调用:5.ASCII表输出6.判断闰年7.杨辉三角输出源程序:1.DATASTRINGSARBRCRDSCOREDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV DX,OFFSET STRING;MOV AH,9INT 21H;提示输入成绩,显示字符串,DS:DX=串首址MOV DX,OFFSET SCORE;返回SCORE所在段偏移量MOV AH,0AHINT 21H;输入4个成绩MOV DX,OFFSET SMOV AH,9INT 21H;CMP AL, 30HJB ERRORCMP AL, 39HJA ERRORMOV BL,[SCORE+1]CMP BL,03HJZ AARMOV BL,[SCORE+2]CMP BL,39HJZ AARMOV BL,[SCORE+2]CMP BL,38HJZ EIGHTMOV BL,[SCORE+2]SUB BL,37HJZ BBRMOV BL,[SCORE+2]CMP BL,36HJZ CCRJMP DDR ;不及格EIGHT:MOV BL,[SCORE+3] ;80分段的判断SUB BL,35HJAE AARJMP BBRERROR :MOV AH, 09 ;错误提示MOV DX, OFFSET MESSAGEINT 21HJMP STARTAAR: MOV DX,OFFSET RAJMP EXITBBR: MOV DX,OFFSET RBJMP EXITCCR: MOV DX,OFFSET RCJMP EXITDDR: MOV DX,OFFSET RDJMP EXITEXIT:MOV AH,9INT 21HMOV AH,4CHINT 21HCODE ENDSEND START2.DATA SEGMENTADDRESS DW 0,0STRING DB 6HDB ?DB 6H DUP(?),'$'COUNT DW 0ENT DB 13,10,'$'DATA ENDSSTACK1 SEGMENT PARA STACKDW 20H DUP(0)STACK1 ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1START: MOV AX,DATAMOV DS,AXMOV DX,OFFSET STRINGMOV AH,0AHINT 21HMOV ADDRESS,OFFSET STRING ; ADDRESS存放偏移量MOV BX,OFFSET STRINGMOV DH,0MOV DL,[BX+1] ;将字符个数存入COUNTMOV COUNT,DXMOV ADDRESS+2,OFFSET COUNT ;ADDRESS+2里存的为COUNTCALL TURN ;小写转大写模块MOV DX,OFFSET ENTMOV AH,9INT 21HMOV DX,OFFSET STRING+2MOV AH,09HINT 21HMOV AH,4CHINT 21HTURN PROC NEARPUSH SIPUSH BXPUSH DIPUSH CXMOV BX,OFFSET ADDRESSMOV SI,[BX]ADD SI,02HMOV DI,[BX+2] ;BX+2 里存入的为字符个数MOV CX,[DI]L: SUB byte ptr [SI],20HINC SILOOP L ;利用指针循环(CX控制)转变POP CXPOP DIPOP BXPOP SIRETENDPCODE ENDSEND START3.DATA SEGMENTSTRING DB 100DB ?DB 100 DUP(?)COUNT EQU $-STRINGDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV DX,OFFSET STRINGMOV AH,0AHINT 21HMOV SI,OFFSET STRING + 2MOV BL,0MOV CX,COUNTMOV DH,61HCHECK: CMP [SI],DHJNE NEXTINC BLNEXT: INC SILOOP CHECKADD BL,30HMOV DL,0AHMOV AH,02HINT 21HMOV DL,0DHMOV AH,02HMOV DL,BLMOV AH, 02HINT 21HMOV AH,4CHINT 21HCODE ENDSEND START 4.STACK SEGMENTDB 128(?)STACK ENDSCODE SEGMENTASSUME CS:CODESTART:MOV SI,5;控制空格数MOV BX,1;BX控制输出*MOV CX,4;OUTLOOP: PUSH CX;保护列数MOV CX,SIMOV DL,20H;输出空格SPL: MOV AH,2HINT 21HLOOP SPLMOV CX,BXMOV DL,2AH;输出*STL: MOV AH,2HINT 21HLOOP STLMOV DL,0DH;输出回车MOV AH,02HINT 21HMOV DL,0AH;换行MOV AH,02HINT 21HDEC SIADD BX,2;多一行*数加2POP CXLOOP OUTLOOP;进下一行MOV AH,4CHINT 21HCODE ENDSEND START5.CODE SEGMENTASSUME CS:CODESTART: MOV SI,10H0 ;列数16MOV CX,7 ;行数7MOV BL,20H ;第一个字符的ASCII代码LOOP1: PUSH CX ;入栈保护循环数,控制行数MOV CX,SI;CX为每行输出个数LOOP2: MOV DL,BLMOV AH,2INT 21H;在屏幕上显示第一个字符MOV DL,20HMOV AH,2INT 21H;在屏幕上显示第一个ASCII代码INC BL;BL加1即ASCII代码加1LOOP LOOP2;循环,准备显示下一个ASCII码字符MOV DL,0AHMOV AH,2HINT 21H ;一行显示完,输出一个回车符MOV DL,0DHMOV AH,2INT 21H ;输出一个换行符POP CX ;一行输完,cx出栈LOOP LOOP1 ;循环,准备显示下一行ASCII码字符MOV AH,4CHINT 21HCODE ENDSEND START6.DATA SEGMENTINFON DB 0DH,0AH,'Please input a year: $'Y DB 0DH,0AH,'This is a leap year! $'N DB 0DH,0AH,'This is not a leap year! $'W DW 0 ;用于保存输入的年份的数值BUF DB 8DB ?DB 8 DUP(?)DATA ENDSSTACK SEGMENT STACKDB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME DS:DATA,SS:STACK,CS:CODESTART: MOV AX,DATAMOV DS,AXLEA DX,INFON ;在屏幕上显示提示信息MOV AH,9 ;显示字符串INT 21HLEA DX,BUF ;从键盘输入年份字符串MOV AH,0AH ;0AH功能调用从键盘接受字符串到内存的输入缓存区INT 21HXOR CH,CH ;ch要清0,否则循环次数有误.MOV CL, BUF+1 ;把输入的字符的个数保存在cl中CALL DATACATE ;调用datacate子程序把表示年份的字符串转换为数值CALL IFYEARS ;调用ifyears子程序判断闰年JC A1 ;进位标志1 为闰年LEA DX,NMOV AH,9INT 21HJMP EXITA1: LEA DX,YMOV AH,9INT 21HEXIT: MOV AH,4CHINT 21HDATACATE PROC NEAR ;把表示年份的字符串转换为数值PUSH CXDEC CXLEA SI,BUF+2TT1: INC SILOOP TT1POP CX ;从高位向低位逐个MOV AX,1L1: PUSH AXMOV DH,30HMOV BX,10MOV DL,[SI] ;字符减去30H后即可转换为十六进制数XOR DH,DHMUL DXADD W,AXPOP AXMUL BXDEC SILOOP L1RETDATACATE ENDPIFYEARS PROC NEARPUSH BXPUSH CXPUSH DXMOV AX,WMOV DX,0MOV BX,100DIV BXCMP DX,0JE NEXT ;能被400整除,判能否被400整除XOR DX,DXMOV AX,WMOV BX,4DIV BXCMP DX,0JE LAB2JMP LAB1NEXT:XOR DX,DXMOV AX,WMOV BX,400DIV BXCMP DX,0JE LAB2JMP LAB1LAB1: CLC ;进位标志置0JMP LAB3LAB2: STCLAB3: POP DXPOP CXPOP BXRETIFYEARS ENDPCODE ENDS7.data segmentbuf db 200 dup()endscode segmentstart:lea di,bufmov ch,00h ;ch为一重循环系数m,范围1-9loop_m:mov cl,00h ;cl为二重循环系数n,范围1-mmov al,0ahstosbmov al,0dhstosbinc chloop_n:call storeinc clcmp cl,chjbe loop_ncmp ch,09hjb loop_mmov [di],'$'finish:lea dx,bufmov ah,09hint 21hmov ah,4chint 21h;子程序store:由ch,cl传递参数m,n,求组合数C(m,n) ;并转换为10进制数存入buf中,再写入一个空格store proc nearpush axpush bxpush cxpush dx;将n和m-n中较小者赋给cl,减小运算量mov bl,chsub bl,clcmp cl,bljbe nextmov cl,blnext:jne next1;n为0或n=m时直接往buf中写入1mov al,01hadd al,'0'stosbmov al,' 'stosbpop dxpop cxpop bxpop axretnext1: ;n!=0且n!=m时调用子过程计算mov bh,chmov bl,cl;调用子过程multiply求分子call multiplymov ax,dxmov bh,cl;调用子过程multiply求分母call multiplydiv dl ;此时计算结果在al中mov ah,0mov dl,64hdiv dl ;百位在al中,十位个位在ah中cmp al,0je next2add al,'0'mov [di],alinc dinext2:mov al,ahmov ah,0mov dl,0ahdiv dl ;十位在al中,个位在ah中cmp al,0je next3add al,'0'stosbnext3:add ah,'0'mov [di],ahinc distosbpop dxpop cxpop bxpop axretstore endp;子程序multiply:由bh,bl传递参数p,q;求乘积p(p-1)(p-2)...(p-q+1),并由dx传出multiply proc nearpush axpush bxpush cxmov cx,0mov cl,blmov bl,bhmov bh,0mov ax,1mov dx,0loop_mult:mul bxdec bxloop loop_multmov dx,axpop cxpop bxpop axretmultiply endpcode endsend start输出屏幕截图:1. 分支程序设计:输出成绩A,B,C,D2. 子程序设计:小写变大写3. 循环程序设计:输出a出现的次数4. DOS功能调用:输出等腰”*”三角形5.输出ACSII表6.判断闰年7. 输出杨辉三角汇编自学课程心得:接触汇编语言之前,我们在计算机组成原理课程中就已经有所了解了,但也只是略微明白一些如jmp,mov这样的指令,极度缺乏系统性的学习。