汇编实验
汇编语言实验4详细讲解

汇编语言实验4详细讲解一、引言汇编语言是一种底层的计算机语言,它直接操作计算机的硬件。
在汇编语言实验4中,我们将深入了解汇编语言的一些重要概念和技巧。
本文将详细讲解汇编语言实验4的内容,帮助读者更好地理解和应用汇编语言。
二、实验目的汇编语言实验4的主要目的是学习和掌握在汇编语言中使用条件和循环结构的方法。
通过实验,我们将能够编写能够根据条件执行不同操作的程序,并实现循环执行一定次数的功能。
三、实验内容1. 条件结构条件结构是根据条件的真假来执行不同的操作。
在汇编语言中,我们可以使用条件跳转指令来实现条件结构。
条件跳转指令根据条件寄存器的值来决定是否跳转到指定的地址执行。
常用的条件跳转指令有JZ、JNZ、JC、JNC等。
2. 循环结构循环结构是重复执行一段代码的结构。
在汇编语言中,我们可以使用循环指令来实现循环结构。
循环指令根据计数器的值来判断是否继续执行循环体,并在每次循环结束后更新计数器的值。
常用的循环指令有LOOP、LOOPE、LOOPZ、LOOPNE、LOOPNZ等。
四、实验步骤1. 定义和初始化计数器在循环结构中,我们首先需要定义一个计数器,并对其进行初始化。
计数器可以使用DX寄存器或AX寄存器来保存。
2. 执行循环体在循环结构中,我们需要执行的代码放在循环体中。
循环体的代码将会被重复执行,直到计数器的值为0或满足其他条件。
3. 更新计数器的值在每次循环结束后,我们需要更新计数器的值。
可以使用INC或DEC指令对计数器进行加1或减1操作。
4. 判断是否继续执行循环在每次循环结束后,我们需要判断是否继续执行循环。
可以使用循环指令来实现此功能。
根据计数器的值或其他条件来判断是否继续执行循环。
五、实验示例下面是一个简单的实验示例,演示了如何使用条件和循环结构来实现一个简单的程序:```MOV CX, 10 ; 初始化计数器为10MOV AX, 0 ; 将AX寄存器清零LOOP_START:ADD AX, CX ; 将CX的值加到AX中LOOP LOOP_START ; 循环执行,直到CX的值为0MOV BX, AX ; 将AX的值保存到BX寄存器中```在上面的示例中,我们首先将CX寄存器初始化为10,然后将AX 寄存器清零。
汇编语言程序设计实验要求

汇编语言程序设计实验要求一、实验目的1.理解计算机的基本组成结构和运行原理;2.掌握汇编语言的基本语法和应用;3.学会使用汇编语言设计并实现简单的程序;4.培养分析和解决问题的能力。
二、实验内容根据实验的具体要求,设计并实现汇编语言程序,要求程序的功能和执行效果符合实验要求。
三、实验要求1.完成实验报告,并按照实验报告模板的要求编写。
2.实验过程中能提出并解答问题的,要及时记录下来。
3.实验过程中发现的问题要及时上报和解决。
4.保持实验室设备的安全性和完好性。
四、实验步骤1.紧密结合课程内容,理清实验的基本思路和需求。
2.设计程序的框架和算法,明确每个步骤的功能和实现方法。
3.编写汇编语言程序的代码,注意代码的规范性和可读性。
4.进行程序的编译和调试,确保程序能够正确运行并得到正确的结果。
5.运行程序,观察程序的执行过程和结果是否符合设计要求。
五、实验评分标准1.实验报告的撰写质量(包括格式、内容、语言表达等)占总分的30%。
2.汇编语言程序的设计和实现质量占总分的50%。
3.程序的运行效果和正确性占总分的20%。
六、实验注意事项1.在编写汇编语言程序时,要注意程序的可读性和可维护性。
2.在程序的编译和调试过程中,要保持对程序的追踪和记录。
3.注意程序的输入和输出的正确性和合法性。
4.在实验过程中,要积极与实验指导教师和同学之间进行交流和讨论。
以上就是汇编语言程序设计实验的要求。
通过这门实验课程的学习和实践,我们能够更加深入地了解计算机体系结构和汇编语言的基本原理和应用,从而为我们今后的学习和工作打下坚实的基础。
希望同学们在实验中能够认真学习和探索,通过实践提高自己的动手能力和问题解决能力。
汇编语言实验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. 字符串拼接程序首先,需要从键盘输入两个字符串。
ARM汇编实验报告

ARM汇编实验报告一、实验目的本次实验旨在通过编写ARM汇编程序,加深对ARM架构和指令集的理解,并掌握ARM汇编程序的设计和调试技巧。
二、实验内容本次实验分为两个部分,分别是基础部分和进阶部分。
1.基础部分基础部分要求编写一个ARM汇编程序,实现输入一个整数n,并输出从1到n的所有奇数的和。
具体要求如下:(1)使用汇编语言实现。
(2)使用r0寄存器保存输入的整数n。
(3)使用r1和r2寄存器保存计算中的临时变量。
(4)使用r3寄存器保存输出的结果。
(5)使用ldr指令从内存中加载数据,str指令将数据保存到内存中。
(6)使用循环实现计算。
(7)使用swi指令终止程序。
2.进阶部分进阶部分要求实现一个排序算法,将从键盘输入的n个整数进行排序,并输出排序后的结果。
具体要求如下:(1)使用汇编语言实现。
(2)使用r0寄存器保存排序的整数个数n。
(3)使用r1寄存器保存指向数组的指针。
(4)使用r2和r3寄存器保存计算中的临时变量。
(5)使用ldr指令从内存中加载数据,str指令将数据保存到内存中。
(6)使用循环实现排序算法。
(7)使用swi指令终止程序。
三、实验步骤1.基础部分实现:(1)将输入的整数n保存到r0寄存器中。
(2)初始化r1和r3寄存器,将计算所需的临时变量置为0。
(3)使用ldr指令读取r0寄存器的值到r2寄存器。
(4)使用循环实现奇数求和的计算,将结果保存到r3寄存器。
(5)使用str指令将r3寄存器的值保存到内存中。
(6)使用swi指令终止程序。
2.进阶部分实现:(1)将输入的整数n保存到r0寄存器中。
(2)使用ldr指令将数组的首地址保存到r1寄存器。
(3)使用循环结构实现排序算法。
(4)使用str指令将排序后的结果保存到内存中。
(5)使用swi指令终止程序。
四、实验结果经过编写和调试,基础部分程序可以正确输入整数n,并输出从1到n的所有奇数的和。
进阶部分程序可以正确输入整数n,并对输入的n个整数进行排序,并输出排序后的结果。
汇编语言程序设计实验小结

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

单片机汇编实验报告1. 实验目的本实验旨在通过编写单片机汇编程序,掌握单片机的基本操作,理解汇编语言和单片机的工作原理。
2. 实验器材•STC89C52单片机开发板•串口线•电脑3. 实验原理单片机是一种集成了处理器、存储器、输入输出设备等功能的微型计算机系统。
通过编写汇编语言程序,可以利用单片机的内部寄存器和外部接口,实现各种功能。
4. 实验步骤步骤一:准备工作1.将STC89C52单片机开发板与电脑通过串口线连接。
2.打开开发板电源,确保电源工作正常。
步骤二:编写汇编程序1.打开汇编语言编辑器,例如Keil C51。
2.创建一个新的汇编语言项目,命名为“experiment.asm”。
3.编写汇编程序,实现所需的功能。
例如,可以编写一个简单的程序,使LED灯闪烁。
步骤三:编译和烧录程序1.选择适当的编译选项,将汇编程序编译为二进制文件。
2.将生成的二进制文件烧录到单片机中。
可以使用烧录软件或者编程器完成这一步骤。
步骤四:连接外部电路1.根据需要,连接外部电路到单片机的GPIO引脚。
例如,如果需要控制LED灯,可以将LED的阳极连接到单片机的某个输出引脚,将LED的阴极连接到单片机的地。
步骤五:运行实验1.将开发板连接到电源,确保电源正常工作。
2.按下开发板上的复位按钮,使单片机开始执行程序。
3.观察实验现象,并记录下实验结果。
5. 实验结果与分析通过以上步骤,我们成功编写并烧录了一个简单的汇编程序到单片机中。
在运行实验时,LED灯按照程序的要求进行闪烁。
这表明我们的实验设计和编程是正确的。
6. 实验总结在本次实验中,我们通过编写汇编程序,学习了单片机的基本操作和工作原理。
通过实际操作,我们更好地理解了汇编语言的编写和单片机的工作方式。
同时,我们还学会了使用烧录软件将程序烧录到单片机中,并通过外部电路观察实验结果。
7. 实验改进在以后的实验中,我们可以尝试更复杂的功能,例如通过单片机控制电机或者LCD显示屏等。
汇编实验的原理

汇编实验的原理汇编语言是一种机器语言的抽象表示,它是一种低级语言,用于告诉计算机如何执行特定的指令。
在计算机科学和工程中,汇编语言通常被用来编写低级程序,这些程序能够直接操作计算机的硬件。
汇编实验的原理可以分为以下几个方面:1. 汇编语言的基本原理:汇编语言是一种符号表示的机器语言,它使用简单的符号和指令来表示特定的操作。
这些符号和指令可以被翻译成机器语言,然后由计算机执行。
对于不同的CPU,汇编语言的指令集不同,需要根据具体的CPU 架构来编写不同的汇编程序。
2. 汇编语言的指令集:汇编语言的指令集包括数据传送指令、算术运算指令、逻辑运算指令、控制转移指令等。
这些指令可以对计算机中的寄存器、内存、I/O 设备等进行操作,实现各种功能。
3. 汇编语言的编程方法:汇编语言的编程方法通常包括两种:基于寄存器的编程和基于内存的编程。
基于寄存器的编程主要是以寄存器为中心,直接对寄存器进行操作;基于内存的编程主要是以内存为中心,需要通过地址来操作内存单元。
4. 汇编语言的程序设计:汇编语言可以用于编写各种程序,包括操作系统、驱动程序、嵌入式系统等。
通过汇编语言,程序员可以更加精细地控制计算机的硬件,实现高效的程序设计和优化。
汇编实验通常包括以下内容:1. 汇编语言的基本语法和指令集:学习汇编语言的第一步是了解其基本语法和指令集。
在实验中,学生需要学习如何使用汇编语言的各种指令来进行数据操作、算术运算、逻辑运算等。
2. 汇编语言的程序设计:学生需要学习如何使用汇编语言来编写程序。
在实验中,他们可以编写一些简单的程序,例如实现加减乘除运算、排序算法等。
3. 汇编语言的调试和优化:学生需要学习如何调试和优化汇编语言程序。
在实验中,他们可以使用调试工具来检查程序的执行过程,分析程序的性能,并对程序进行优化。
4. 汇编语言的应用实例:学生可以学习一些实际的应用实例,如操作系统内核、设备驱动程序等。
在实验中,他们可以尝试编写一些简单的应用程序,了解汇编语言在实际应用中的使用。
汇编语言_实验三_编程、编译、连接、跟踪

汇编语⾔_实验三_编程、编译、连接、跟踪四、实验结论1. 练习1第⼀步,在记事本中输⼊实验要求中提供的代码,结果如下:将其以⽂件名t1.asm另存为到E:/masm。
第2步,为⽅便后续操作,此处先准备⼀个批处理⽂件:同样将其放⼊E盘masm路径下,重命名为process.bat。
(1)进⼊并配置好DSBox环境,使⽤process t1对t1.asm进⾏编译、连接并运⾏:屏幕上出现36.(2)将修改line 4和line 6中寄存器dl增加的值,发现line 4中写⼊的数值是屏幕上显⽰的第⼀位数字1,line 9中的数值是屏幕上第⼆位数字。
(3)使⽤debug命令对⽣成的t1.exe进⾏调试。
①⾸先,使⽤r命令查看寄存器的值:注意到,此处CX的值是0016H,DS的值为075AH,CS的值为076AH,刚好满⾜CS=DS+10H。
②使⽤d命令查看程序段前缀的前两个字节,发现前两个字节的确是CD 20:3.反汇编t1.exe,查看所得代码,由于CX=0016H,所以此处我们查看从CS开始的0015H个字节的代码:刚好是t1.asm中的内容。
④使⽤t命令和p命令进⾏单步调试直⾄程序结束,观察结果:2. 练习2第⼀步,编写汇编源程序:第⼆步,(1)对源程序进⾏编译、连接、运⾏,运⾏结果如下:看到屏幕出现酒红⾊的36,嗯,这说明我们的程序有好好的编译连接和运⾏了……(等等,说好的err呢?)(2)好吧,我们进继续按照实验要求中将原代码line 7的0433H改为0432H,将line 10中毒的0436H改为0439H,重新进⾏编译、链接、运⾏,得到结果如图:(3)我们继续尝试修改填⼊显存单元中的数值,将源代码中line7的0433h改为0333h, line10 的 0436h改为0336h, 然后重新汇编、连接,并运⾏,结果如下:此时屏幕左上⾓出现了绿⾊的36。
3. 延伸思考与分析(1)在实验⼀中,我们已知地址A0000~BFFFF被⽤来当做显存地址空间,向地址为A0000~BFFFF的内存单元中写⼊数据,就是向显存中写⼊数据,这些数据会被显⽰卡输出到显⽰器上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二循环程序实验1、从键盘输入字符,如果字符是数字(0-9)则响铃n次,如果不是数字,则重新输入,ctrl+C 键强行终止CODE SEGMENTASSUME CS:CODESTART:MOV AH,01HINT 21HCMP AL,03HJZ EXITCMP AL,30HJB STARTCMP AL,39HJA STARTAND AL,0FHCBWMOV CX,AXbeep:MOV AH,02HMOV DL,07HINT 21HMOV SI,8000Hdelay:MOV DI,0F000Hloopdi:DEC DIJNZ loopdiDEC SIJNZ delayLOOP beepEXIT:MOV AH,4CHINT 21HCODE ENDSEND START2、编写一个程序,从键盘接收一个小写字母然后找出它的前导字符和后继字符,在按顺序实现这是三个字符。
CODE SEGMENTASSUME CS:CODESTART: MOV AH,01Ha1: INT 21HCMP AL,'a'JB a1CMP AL,'z'JA a1DEC ALMOV DL, ALMOV CX, 3DISPLAY:MOV AH, 02HINT 21HINC DLLOOP DISPLAYMOV AH,4CHINT 21HCODE ENDSEND START3、编写程序,将一个包含20个数据的数组m分成两个组:正数组和负数组,并分别把这两个数组的数据个数存在ZSGS和FSGS单元中。
DA TA SEGMENTDA T1 DB 25H,82H,22H,0F4H,0E5H,0E2H,11H,15H,21H,16HZSQ DB 10 DUP(?)FSQ DB 10 DUP(?)ZSGS DB 0FSGS DB 0DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DATAMOV DS,AXMOV BX,0MOV SI,0MOV DI,0MOV CX,10A1:MOV AL,DA T1[BX]AND AL,ALJS FSCLMOV ZSQ[SI],ALINC SIINC [ZSGS]JMP NEXTFSCL:MOV FSQ[DI],ALINC DIINC [FSGS]NEXT:INC BXLOOP A1MOV AH,4CHINT 21HCODE ENDSEND START实验三1、学生成绩名次排序DA TA SEGMENTGRADE DB 88,75,95,63,98,78,87,73,90,60RANK DB 10 DUP(?)DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART: MOV AX,DATAMOV DS,AXMOV DI,10MOV BX,0LOOP1: MOV AL,GRADE[BX]MOV DL,0MOV CX,10LEA SI,GRADENEXT: CMP AL,[SI]JGE NOCOUNTINC DLNOCOUNT: ADD SI,1LOOP NEXTINC DXMOV RANK[BX],DLINC BXDEC DIJNZ LOOP1MOV AH,4CHINT 21HCODE ENDSEND START2、在BUFF起始的单元中,有一组数据,数组的个数放在cnt单元中,试把数组中的数据按从小到大排序。
DA TA SEGMENTBUFF DB 18,5,20,1,35,4,6,14,7,52CNT DW 10DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART: MOV AX,DATAMOV DS,AXMOV DI,0WAI: MOV BX,1DEC CNTJE EXITMOV CX,CNTMOV AL,BUFF[DI]NEI: CMP BUFF[DI+1],ALJNS CONTXCHG AL,BUFF[DI+1]MOV BUFF[DI],ALMOV BX,0CONT: INC DICMP BX,0JE W AIEXIT: MOV AH,4CHINT 21HCODE ENDSEND START实验四宏的调用DA TA SEGMENTJUP DW 0,A1,A2,A3,A4MENU DB 0DH,0AHDB '**','**','**','**','**','**','**','**',0DH,0AHDB '1.PROGRAMA',0DH,0AHDB '2.PROGRAMB',0DH,0AHDB '3.PROGRAMC',0DH,0AHDB '4.PROGRAMD',0DH,0AHDB '0.EXIT',0DH,0AHDB 'PLEASE SELECT 0-4:','$'DA TA ENDSCRLF MACROMOV DL,0DHMOV AH,2INT 21HMOV DL,0AHMOV AH,2INT 21HENDMINPUT MACRO ORGMOV DL,ORGMOV AH,02HINT 21HJMP A0ENDMCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DA TAMOV DS,AXA0:LEA DX,MENUMOV AH,09HINT 21HMOV AH,01HINT 21HCMP AL,'0'JB A0CMP AL,'5'JA A0CMP AL,'0'JE EXITAND AL,0FHSHL AL,1CBWMOV SI,AXCRLFCALL JUP[SI] A1 PROC NEARINPUT 'A'RETA1 ENDPA2 PROC NEARINPUT 'B'RETA2 ENDPA3 PROC NEARINPUT 'C'RETA3 ENDPA4 PROC NEARINPUT 'D'RETA4 ENDPEXIT PROC NEARMOV AH,4CHINT 21HRETEXIT ENDPCODE ENDSEND START实验五子程序设计编程实现,把上节编好的程序作为子程序,用菜单程序进行统一管理,按0退出。
DA TA SEGMENTJUP DW 0,A1,A2,A3,A4MENU DB 0DH,0AHDB '1.PROGRAMA',0DH,0AHDB '2.PROGRAMB',0DH,0AHDB '3.PROGRAMC',0DH,0AHDB '4.PROGRAMD',0DH,0AHDB '0.EXIT',0DH,0AHDB 'PLEASE SELECT 0-4:','$'DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DA TAMOV DS,AXA0:LEA DX,MENUMOV AH,09HINT 21HMOV AH,01HINT 21HCMP AL,'0'JB A0CMP AL,'4'JA A0CMP AL,'0'JE EXITAND AL,0FHSHL AL,1CBWMOV SI,AXCALL JUP[SI]A1 PROC NEARMOV DL,'A'MOV AH,02HINT 21HJMP A0RETA1 ENDPA2 PROC NEARMOV DL,'B'MOV AH,02HINT 21HJMP A0RETA2 ENDPA3 PROC NEARMOV DL,'C'MOV AH,02HINT 21HJMP A0RETA3 ENDPA4 PROC NEARMOV DL,'D'MOV AH,02HINT 21HJMP A0RETA4 ENDPEXIT: MOV AH,4CHINT 21HCODE ENDSEND START实验六窗口在屏幕上开出一个窗口,要求:1、输入字符在窗口最底行,满行换行,上滚一行。
2、回车换行,上滚一行。
3、按esc退出,(ctrf+c,03h)LOCATE MACRO WIN_LRR,WIN_ULC MOV AH,02HMOV BH,0MOV DH,WIN_LRRMOV DL,WIN_ULCINT 10HENDMCLEAR MACRO AL1,CH1,CL1,DH1,DL1,BH1 MOV AH,6MOV AL,AL1MOV CH,CH1MOV CL,CL1MOV DH,DH1MOV DL,DL1MOV BH,BH1INT 10HENDMCODE SEGMENTMAIN PROC FARASSUME CS:CODESTART:CLEAR 0,0,0,80,80,70HCLEAR 0,3,5,23,75,40HCLEAR 0,4,22,22,53,1EHA1:LOCATE 22,22MOV CX,32GETCHAR:MOV AH,1INT 21HCMP AL,1BHJZ EXITCMP AL,13JNZ A2CALL CRLFA2:LOOP GETCHARCLEAR 1,4,22,22,53,1EHJMP A1EXIT:MOV AH,4CHINT 21HRETMAIN ENDPCRLF PROCMOV DL,0DHMOV AH,2INT 21HMOV DL,0AHMOV AH,2INT 21HCLEAR 1,4,22,22,53,1EHLOCATE 22,22RETCRLF ENDPCODE ENDSEND START实验七发声编制音乐程序,通过在数据区存储的频率洗漱和节拍数,通过调用发音子程序发出音乐。
要求:自己找一首歌,八个普音符转变为频率系数和节拍系数。
至少三十个音符。
PUBLIC GENSOUNDCODE SEGMENTASSUME CS:CODEGENSOUND PROC FARPUSH AXPUSH BXPUSH CXPUSH DXPUSH DIMOV AL,0B6HOUT 43H,AL,MOV DX,12HMOV AX,348CHDIV DIOUT 42H,ALMOV AL,AHOUT 42H,ALIN AL,61HMOV AH,ALOR AL,03HOUT 61H,AL;PUSH SI;MOV SI ,5WAIT1: MOV CX,2800DELAY: LOOP DELAY;DEC SI;JNZ W AIT1;POP SIDEC BXJNZ WAIT1MOV AL,AHOUT 61H,ALPOP DIPOP DXPOP CXPOP BXPOP AXRETGENSOUND ENDPCODE ENDSENDMUSIC.ASMEXTRN GENSOUND:FARSTACK SEGMENT PARA STACK 'STACK'DB 64 DUP('STACK...')STACK ENDSDA TA SEGMENT PARA 'DATA'FREQ DW 330,392,330,294,330,392,330,294,330DW 330,392,330,294,262,294,330,392,294DW 262,262,220,196,196,220,262,294,330,262 DW -1TIME DW 3 DUP(50),25,25,50,25,25,100DW 2 DUP(50,50,25,25),100DW 3 DUP(50,25,25,),100DA TA ENDSCODE SEGMENT PARA 'CODE'ASSUME CS:CODE,SS:STACK,DS:DATAMUSIC PROC FARMOV AX,DA TAMOV DS,AXLEA SI,FREQLEA BP,DS:TIMEFREQ: MOV DI,[SI]CMP DI,-1JE ENDSMMOV DX,DS:[BP]CALL GENSOUNDADD SI,2ADD BP,2JMP FREQENDSM: MOV AX,4C00HINT 21HMUSIC ENDPCODE ENDSEND MUSIC两个文件连接时:LINK 文件1+文件2。