汇编语言实验5
- 格式:doc
- 大小:37.00 KB
- 文档页数:3
汇编语言实验报告1~7实验一:数据传输指令、算术指令、逻辑指令的使用实验内容:利用汇编语言,编写一个程序,实现两个整数相加,并将结果存入第三个变量中实验步骤:1. 声明三个变量a、b、c2. 将10存入a,将20存入b3. 将a的值传入al,将b的值传入bl4. 使用add指令将al和bl相加,将结果存入al5. 将al的值传入c6. 显示c的值实验结果:a db 10mov al,aadd al,blint 21hmov ax,4c00h实验二:分支指令的使用实验内容:利用汇编语言,编写一个程序,实现当输入的值为正数时,输出"I'm positive!";当输入的值为负数时,输出"I'm negative!";当输入的值为零时,输出"I'm zero!"1. 定义一个变量num2. 接收用户输入,并将其存储在num中3. 用test指令判断num的值4. 当num=0时,执行输出"I'm zero!"的指令7. 退出程序num db ?lea dx, promptsub al, '0'test num, numjz zerojs negjmp positiveneg:output:zero_msg db 'I am zero!$'prompt db 'Please enter a number:', 0dh, 0ah, '$'1. 定义变量i、sum,分别表示累加的数字和累加和2. 将i赋初值1,sum赋初值03. 进入循环5. 使用inc指令将i加16. 使用cmp指令将i与10比较,如果i小于等于10,继续循环,否则退出循环7. 输出结果mov bx, iloopStart:inc bx实验四:过程调用的使用2. 循环遍历1到100之间的每个数3. 用一个for语句嵌套一个for语句判断该数是否为质数4. 用两个自定义的子程序is_prime和output输出结果call is_primeskip:cmp i, 100prime_loop:div blretje newlinejmp done实验目的:掌握字符串操作指令的使用实验内容:利用汇编语言,编写一个程序,将字符串"SJTU"改为字符串"MIT"1. 定义字符串SJTU和MIT2. 定义两个变量i和len,分别表示字符串的下标和长度3. 使用movsb将SJTU的值传到MIT中4. 输出MITSJTU db 'SJTU'lea si, SJTUstringLoop:实验内容:利用汇编语言,编写一个程序,实现将输入的字符串写入一个文件中,然后再读取该文件中的字符串并输出2. 打开文件3. 将字符串写入文件中4. 关闭文件6. 读取文件内容8. 输出读取的字符串fileName db 'test.txt'content db 32 dup(?)mov cx, word ptr [content]实验内容:利用汇编语言,编写一个程序,在系统按下Ctrl+C时,输出一条信息并退出1. 声明函数handleCtrlC2. 获取中断21的地址,将其存储到文件头中org 100hmov [old_int_21h], es:bxmov dx, offset handleCtrlCend开始:。
汇编语言程序设计实验报告汇编语言程序设计实验报告引言:汇编语言是计算机中最基本的语言,通常用于处理硬件相关问题。
在这个实验中,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
以下是我们的实验报告。
正文:1. 实验环境我们使用的实验环境是Intel 8086微处理器与高级汇编语言。
微处理器使用的是PCB-512主板,而高级汇编语言是MASM。
2. 实验目的我们的实验目的主要是学习汇编语言的基础知识和编程技巧,包括了汇编语言的寄存器、指令、内存管理等方面的知识。
我们的另一个目的是掌握汇编语言的常用编程技巧,能够独立完成一些简单的汇编程序。
3. 实验内容我们的实验内容主要包括以下几点:(1)学习汇编语言的基础知识,包括寄存器、指令、内存管理等方面的知识。
(2)掌握汇编语言的常用编程技巧,包括数据输入输出、运算、跳转等基本操作。
(3)实践用汇编语言编写程序,如计算器、菜单等实用程序。
(4)了解8086微处理器的结构和原理。
4. 实验过程在这个实验过程中,我们完成了以下几个程序:(1)计算器计算器是一个简单的程序,主要用于实现两个数之间的加、减、乘、除等基本运算。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
(2)菜单菜单是一个实用程序,主要用于展示一个简单的菜单并实现用户选择相关功能的功能。
我们使用了汇编语言中的跳转指令、输入输出指令等实现了这个程序。
5. 实验结果在我们的实验中,我们成功完成了上述两个程序。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
6. 实验总结在这个实验过程中,我们学习汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
我们通过编写计算器和菜单等简单实用程序,加深了对汇编语言的理解和认识。
我们认为这个实验对我们今后的学习和工作都有很大的帮助。
结论:通过这个实验,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
汇编语⾔(王爽第三版)实验5编写、调试具体多个段的程序实验5 编写、调试具体多个段的程序⼀。
将下⾯的程序编译连接,⽤Debug加载、跟踪,然后回答问题。
assume cs:code,ds:data,ss:stackdata segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdata endsstack segmentdw 0,0,0,0,0,0,0,0stack endscode segmentstart: mov ax,stackmov ss,axmov sp,16mov ax,datamov ds,axpush ds:[0]push ds:[2]pop ds:[2]pop ds:[0]mov ax,4c00hint 21hcode endsend start程序分析:由于是初次接触,我们逐步讲解,废话多点。
(1)此程序考察的是内存中数据段和栈段的定义。
程序共定义了1个数据段,data段,⾸先明确,在程序运⾏开始(标号start处),这个数据段就已经被定义好了,并且分配了内存空间,并赋值了。
⼀个栈段,stack。
同理这个数据段在没有被⼈⼯定义为栈结构时,也被定义好了。
并且分配了内存空间,并赋值了。
将此程序编译并连接后,使⽤debug调试,(这⾥需要注意,以下的段地址可能由于系统不同⽽有差异,主要是理解概念。
)E:\assembly>debug eee.exe-rAX=0000 BX=0000 CX=0042 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000DS=0B55 ES=0B55 SS=0B65 CS=0B67 IP=0000 NV UP EI PL NZ NA PO NC0B67:0000 B8660B MOV AX,0B66程序分析:我们什么也没执⾏,此时我们在data段定义的数据在哪?在ds:0100H处(原来讲过,程序最开始时ds:00~ds:100H是留给程序与操作系统通讯使⽤的psp内存段,参见书中p92);也就是说我们在ds:100H、0B55:100H或0B65:00处可以看见这些定义的数据。
指导教师:杨洪斌第一章汇编语言程序设计上机要求与目的1.1 概述上机实验总学时为20学时,其中综合性和设计性实验至少为8学时。
1.2 实验要求1、上机前作好充分准备,包括程序框图、调试步骤、测试方法、对运行结果的分析等。
2、上机时要遵守实验室的规章制度,爱护实验设备。
要熟悉与实验相关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等)的使用方法。
在程序的调试过程中,有意识地学习及掌握DEBUG程序的各种操作命令,以便掌握程序的调试方法及技巧。
3、为了更好地进行上机管理,要求实验者按以下形式命名实验文件:学号.扩展名4、程序调试完后,须由实验辅导教师在机器上检查运行结果。
5、每个实验完成后,应写出实验报告。
1.3 实验报告实验报告的要求如下:①封面。
封面应包括:课程名称、实验序号、名称、专业、班级、姓名。
②实验报告编写要规范。
应包括:实验名称、目的、内容、原理、实验步骤、实验记录、数据处理(或原理论证、或实验现象描述、或结构说明等)。
③实验报告应附有实验原始记录和源程序清单。
1.4 加强实践能力的培养实验目的不光是为了验证书本理论,更重要的是对实践能力的培养。
其中包括:实际调试程序的能力,例如修改程序参数的能力,查看结果的能力,设置断点调试运行的能力等;开发汇编语言应用程序的能力,例如应用有关汇编软件的能力,进行系统调用和BIOS功能调用的能力,进行模块程序设计的能力等。
对某一问题用不同的程序实现的能力,部分实验题我们提供了参考程序(或程序段),目的是让每个实验者参照样板程序将实验成功地实现,在掌握其方法后,自己改变程序或本分改变程序加以实现。
实验一用表格形式显示字符1.实验目的通过循环控制编程方式用表格形式显示ASCII字符表。
2.实验要求按15行×16列的表格形式显示ASCII码为10H—100H的所有字符,即以行为主的顺序及ASCII码递增的次序显示对应的字符。
每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII为0)隔开。
《汇编语言》实验报告实验名称:汇编语言实验报告实验目的:通过实验了解汇编语言的基本概念、语法结构和程序设计方法,掌握汇编语言的编写方法。
实验时间:2024年1月1日实验地点:实验室一、实验背景汇编语言是计算机硬件和软件之间的桥梁,通过汇编语言可以直接操作计算机的底层硬件。
汇编语言是一种低级语言,使用汇编语言可以实现对计算机内存、寄存器等硬件资源的直接操作,从而实现程序的功能。
本实验通过编写汇编语言程序,加深对汇编语言的理解。
二、实验过程1. 确定实验环境:使用DOSBox模拟DOS环境进行汇编程序编写和调试。
2. 编写第一个汇编程序:编写一个简单的汇编程序,将字符串“Hello, World!”输出到屏幕上。
3.程序分析:a.定义要输出的字符串,将字符串存储在数据段中。
b.设置段寄存器,将数据段地址加载到DS寄存器中。
c.设置显示模式和光标位置。
d.将字符串逐个字符输出到屏幕上。
e.关闭显示模式。
4. 编译运行:使用汇编语言的编译器将汇编程序转换成机器码,并在DOSBox中运行程序。
5.调试程序:根据程序运行结果和分析,调试程序中存在的错误,并进行改正。
三、实验结果与分析经过多次编写和调试,我们成功实现了将字符串“Hello, World!”输出到屏幕上的功能。
通过程序分析和调试过程,加深了对汇编语言的理解和掌握。
四、实验总结通过本次实验,我们深入了解了汇编语言的基本概念、语法结构和程序设计方法。
通过实际编写汇编语言程序,对汇编语言的编写方法有了更加深入的认识。
同时,通过调试程序的过程,我们也提高了自身的问题解决能力和分析能力。
在今后的学习和工作中,我们将继续学习和深入研究汇编语言,提高自己的编程能力和创新思维能力。
总体而言,本次实验给我们带来了很大的收获,我们以后将更加努力地学习汇编语言,提高自己的编程水平,为以后的学习和工作做好充分的准备。
本科实验报告实验名称:子程序设计实验实验五子程序设计实验(设计性实验)一、实验要求和目的1.熟悉汇编语言程序设计结构;2.熟悉汇编语言子程序设计方法;3.熟悉利用汇编语言子程序参数传递方法;4.熟悉汇编语言字符串处理基本指令的使用方法;5.掌握利用汇编语言实现字符串的输入输出程序设计方法;6.掌握数制转换程序实现方法。
二、软硬件环境1、硬件环境:计算机系统windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。
三、实验涉及的主要知识A)子程序知识要点:1、掌握子程序的定义语句;过程名PROC [near/far] 过程体RET过程名ENDP2.子程序结构形式一个完整的子程序一般应包含下列内容:1. )子程序的说明部分在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法.说明时,应含如下内容:.子程序名:命名时要名中见意..子程序的功能:说明子程序完成的任务;.子程序入口参数:说明子程序运行所需参数及存放位置;.子程序出口参数:说明子程序运行结果的参数及存放位置;.子程序所占用的寄存器和工作单元;.子程序调用示例;2、)掌握子程序的调用与返回在汇编语言中,子程序的调用用CALL,返回用RET指令来完成。
.段内调用与返回:调用子程序指令与子程序同在一个段内。
因此只修改IP;.段间调用与返回:调用子程序与子程序分别在不同的段,因此在返回时,需同时修改CS:IP。
3.)子程序的现场保护与恢复保护现场:在子程序设计时,CPU内部寄存器内容的保护和恢复。
一般利用堆栈实现现场保护和恢复的格式:过程名PROC[NEAR/FAR]PUSH AXPUSH BX..PUSH DX...POP DX...POP AXRET过程名ENDP4.子程序的参数传递方法1.寄存器传递参数这种方式是最基本的参数传递方式。
2.存储器单元传(变量)递参数这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元中;子程序运行时到约定存储位置读取参数;子程序执行结束后将结果也放在约定存储单元中。
汇编语言程序实验实验目的【1】运用数值运算,通过编程及调试,熟悉8086|8088运算指令及DEBUG动态调试程序的方法【2】通过非数值运算编程,进一步掌握编程技巧和方法,这部分可以多做一些,题题目也较多【3】初步熟悉DOS系统和BIOS功能调用,其实前面要求中也包含着部分内容,比如数值运算包含显示功能调用一、实验原理【1】8086内部结构简介以下是微处理器的简要内部结构图其内部大概是有寄存器组,运算器,控制器,通过总线连接而成其中,标志寄存器用来指示运算结果的某些性质在编程中会反复用到这些寄存器,各个寄存器的作用如上表已经列出,表中的四个寄存器AX,BX,CX,DX都可以分别成为两个8位的寄存器,如AX可以拆开用成AH和AL,分别表示高八位和低八位【2】8086指令系统一条指令有操作吗,目的操作数和源操作数组成,指令简要分为以下几类(1)数据传送类,如MOV,LEA,XCHG等(2)算术逻辑类,如ADD,ADC,SUB,SBB等(3)移位与旋转类,(4)跳转类指令,又细分为段内,段间跳转,跳转范围不同(5)伪指令,伪指令只是对指令的说明,其本身不占内存单元【3】汇编语言的基本语法一般要把每段的信息都交代,由于8086的系统是分段的,因此程序的数据与代码都应放在相应的段中,段按性质可分为代码段,数据段,堆栈段等,一个程序至少要有一个代码段具体的说明后面结合程序再作介绍【4】DEBUG命令介绍在DOS环境下可以用DEBUG命令对程序进行调试,DEBUG命令具体有以下几条,简介其各条指令的功能(1)A 汇编命令,从此命令往下逐行汇编(2)P和T命令单步执行命令,也就是跟踪命令,只是T命令跟踪到循环体中去(3)D 内存显示命令(4)R 寄存器显示命令(5)Q 推出DEBUG的命令当然还有不少,这里就不一一列举了,熟悉以上的准备知识,下面就可以着手编程了。
二、实验内容针对实验目的,每一个要求都选做不少于两个题目,共完成以下的实验内容【1】数值运算类,完成20个8位无符号二进制数的求和【2】完成减法运算,例如123456-789123【3】非数值运算类,统计一百个数中正负数和零的个数【4】代码转换,完成组合BCD码与二进制码的转换【5】排序,将80个数按升序排列【6】BIOS功能调用,将运算结果显示出来【7】回显,键入一个数字或字符,回显在屏幕上【8】画一个矩形废话少说,直接上程序1.加法程序,以下程序实现20个8位无符号数的相加,并显示结果【设计思想】:将20个数放入一段内存,使用LOOP循环20次,每次取出一个数,不断和之前AX之中的和数相加【难点解决】:由于是第一个程序,那些格式都要熟悉,本程序就一个循环,难点是显示部分,要不断右移,逐位显示;加法程序全文如下DATA SEGMENT ;数据段TAB DW 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 ;随便自定义20个数DATA ENDS ;数据段结束CODE SEGMENTASSUME CS:CODE,SS:STACK,DS:DATASTART: MOV AX,DATA ;代码段开始MOV DS,AXMOV AX,0MOV CX,20 ;CX放20,用于控制循环次数LEA SI,TAB ;SI存放TAB首地址MOV BX,0 ;BX寄存器清零SUM: MOV AX,[SI] ;开始相加,AX取得第一个加数ADD BX,AXINC SI ;SI加1,指向下一个数INC SILOOP SUM ;一次相加结束,LOOP循环PUSH BX ;相加结束,结果存于BX中LOP2: MOV CL,04 ;CL控制移位位数AND BL,0F0H ;取BL高四位SHR BL,CLMOV DL,BL ;DL存放数据用于显示ADD DL,30H ;转换成ASC2码CMP DL,3AH ;如果数字大于9,转化时再加7JB NEXTADD DL,7NEXT: MOV AH,2 ;2号功能调用,显示高位INT 21HPOP BXLOP1: MOV DL,BL ;做同样的事情,显示BL低4位AND DL,0FHADD DL,30HCMP DL,3AHMOV AH,2INT 21HMOV AH,4CH ;程序正常结束INT 21HCODE ENDSEND START2、减法程序,实现减法并显示结果,123456-789123【设计思想】(1)首先判断两个数那个大,大的减小则结果为正,否则为负,但程序始终使用大的减小的(2)低位数字在前,两位两位相减,结果存于开辟的数据段中【难点解决】难点在于显示,判断部分也不是很麻烦程序如下,有些不重要的部分就不写了,浪费时间DATA SEGMENT 'DATA' ;数据段定义ORG 0100HDATA1 DB 56,34,12 ;注意高位是在后面的,前面的反而是低位DATA2 DB 23,91,78RESULT DB 'H', 6 DUP(0),'$'DATA ENDSCODE SEGMENT 'CODE'ASSUME DS:DATA ASSUME CS:CODESTART: MOV AX,DATAMOV DS,AXMOV CX,3 ;控制循环LEA DI,DATA1 ;DI取得DATA1的首地址LEA SI,DATA2 ;SI取得DATA2的首地址ADD DI,2ADD SI,2 ;SI ,DI自加2,获得最高位地址用于比较PUSH AXPUSH BX ;AX,BX压栈以保存原值MOV AX,[DI]MOV BX,[SI] ;判断SI,是否比DI数大SUB AX,BX ;如果大于,则互换指针,并且输出负号JNB LOOOPMOV AH ,2MOV DL,‘—’INT 21HLOOOP:LEA BX,RESULT ;如果DI中本来就是大数,直接减CLC ;进位清零LP: MOV AL,[DI]SBB AL,[SI] ;开始减法运算MOV [BX],AL ;结果存于BX所指内存中INC DI ;地址都自加1INC SIINC BXLOOP LP ;循环3次,完成所有减法MOV CX,0204HPUSH CXLOP1: LEA BX,RESULT ;运算结果存于RESULT中,一下实现显示MOV AX,[BX]ROL AX,CLMOV DL,ALAND DL,0FHADD DL,30HCMP DL,3AH ;这与第一个一样,逐位显示JB NEXT1ADD DL,7NEXT1: MOV AH,2INT 21HDEC CHCMP CH,0JNZ LOP1POP CXMOV AH,4CH ;程序正常退出INT 21HCODE ENDSEND START这个程序还是要注意算法,一开始都不注意,上来直接减,其实不管怎么算,都是大数减小数,检查时老师提出了这一点3、统计,非数值运算类,统计一百个数中正负数,0的个数【设计思路】通过比较判断,用两个选择结构,实现对三个变量的逐个加1 【难点解决】关键是做到不遗漏,不重复的分类,每次只有一个自加,自家完后必须直接跳到本次循环最后DATA SEGMENT 'DATA'TAB DB 1,2,3,4,0,0,0,-2,0,-4 ;随便定义一些数DATA ENDSCODE SEGMENT 'CODE'ASSUME DS:DATAASSUME CS:CODESTART: MOV AX,DATAMOV DS,AXMOV AX,0MOV DX,0MOV CX ,10LEA SI,TABSU: MOV BL,[SI]ADD BL,BLJNZ LOP3 ;判断是否为0,不是就跳转INC AL ;存放0JMP EDLOP3: ADD BL,0JS LOP1 ;判断是否为正数,不是就跳转INC DH ;正数个数JMP EDLOP1: INC DL ;负数个数JMP EDED: INC SILOOP SU ;完成一次循环PUSH DXMOV DL,AL ;以上完成统计,下面完成结果显示ADD DL,30H ;输出0的个数MOV AH,2INT 21HPOP DXPUSH DXMOV AX,DX ;输出正数个数MOV DL,AHADD DL,30HMOV AH,2INT 21HPOP DXMOV AX,DXMOV DL,AL ;输出负数个数ADD DL,30HMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND START就是显示三个统计结果时没有间隔,两位16进制数紧挨着,说明一下4、代码转换,完成组合BCD码到二进制数的转换【设计思路】如提示所给的,利用(((A×10)+B)×10)+C)×10)+D的算法【难点解决】程序实现一个十进制转化为二进制,其实是16进制,程序经过一些拆开乘10的运算,保持原数大小不变,但存到寄存器中的数默认已经是16进制的了,要逐位找到A,B,C,D还要循环控制乘以10,程序如下,组合BCD码转换DATA SEGMENTDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV BX,0MOV SI,0AH ;SI中放的是10,用来相乘MOV CL,4 ;用来控制移位位数MOV CH,3 ;控制循环次数MOV AX,9649H ;赋给要转化的数LP: ROL AX,CL ;AX中的数左移4位PUSH AX ;保存现在的AX值AND AX,0FH ;取AX最低位ADD AX,BXMUL SI ;乘以10MOV BX,AX ;值暂时保存在BX中POP AXDEC CH ;CH减1,循环了一次JNZ LP ;如果循环三次完成,跳转到LP位置ROL AX,CL ;这是个位的数,不用乘10了AND AX,0FHADD AX,BXMOV BX,AX ;BX中存放的是转化过的数MOV AX,0 ;以上已经转化完成,下面是显示的程序了MOV CX,0404HPUSH CXLOP1: ROL BX,CL ;这个程序在每一个程序最后的显示部分都会有MOV DL,BL ;就是一个逐位显示的程序AND DL,0FHADD DL,30HCMP DL,3AH ;判断ASCII码,显示的入口参数是ASCII码JB NEXTADD DL,7NEXT: MOV AH,2INT 21HDEC CHCMP CH,0JNZ LOP1 ;判断是否显示完成POP CXMOV AH,4CHINT 21H ;系统功能调用,程序结束CODE ENDSEND START5、排序,实现对10个数的降序排列其实就是很熟悉的冒泡法排序,具体思路不用再罗嗦了,直接上程序STACK SEGMENT STACK ;定义堆栈段DW 300 DUP(?)STACK ENDSDATA SEGMENT ;数据段定义TAB DB 01H,31H,08H,24H,99H,0A2H,67H,0ACH,2BH,5CHTAB1 DB 'H,','$'DATA ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV CL,9 ;外循环次数为9LOP1: MOV CH,9LEA SI,TAB ;分别取地址LEA DI,TABLOP2: MOV AL,[SI]INC SIMOV AH,[SI] ;实现交换MOV BL,ALMOV BH,AHSUB BH,ALJC NETJMP NET1NET: XCHG AH,ALMOV [DI],ALINC DIMOV [DI],AHJMP NET2NET1: MOV [DI],ALINC DIMOV [DI],AHJMP NET2NET2: DEC CHTEST CH,0FFHJNZ LOP2DEC CLTEST CL,0FFHJNZ LOP1PRIT: LEA SI,TABMOV CH,10LOP3: MOV DL,[SI]INC SIMOV CL,04HMOV BL,DLROL BL,CLMOV DL,BLAND DL,0FHADD DL,30HCMP DL,3AHJB NEXTADD DL,7NEXT: MOV AH,2 ;2号功能调用INT 21HROL BL,CLMOV DL,BLAND DL,0FHADD DL,30HCMP DL,3AHJB NEXT1ADD DL,7NEXT1:MOV AH,2INT 21HMOV AX,SEG TAB1MOV DS,AXMOV DX,OFFSET TAB1 ;入口参数MOV AH,9 ;9号功能调用INT 21HDEC CHTEST CH,0FFHJNZ LOP3MOV AH,4CHINT 21HCODE ENDSEND START6、字符回显,系统功能调用,实现输入字符在屏幕上显示出来【设计思路】即使用2个系统功能调用,很简单的,没什么难得,特别是在写完前面那些程序之后,结合程序注释说明我的程序;加法程序STACK SEGMENT STACK ;堆栈段定义STACK ENDSDATA SEGMENT ;数据段定义,虽然说明也么有DATA ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK,DS:DATASTART: ;代码段开始MOV AX,DATAMOV DS,AXMOV AH,08 ;8号系统功能调用INT 21H ;键入的字符存放于AL中MOV DL,AL ;以下完成显示部分ADD DL,30HCMP DL,3AHJB NEXTADD DL,7NEXT:MOV AH,2INT 21HMOV AH,4CH ;程序正常退出INT 21HCODE ENDSEND START7、画一个矩形其实也就是调用功能,利用循环控制不断划线,程序如下显示彩色矩形DATA SEGMENTLINE DW 0 ;矩形块左上角的行ROW DW 0 ;矩形块左上角的列PIX DB 0 ;矩形块的颜色DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART: ;主程序MOV AX , DATAMOV DS , AXMOV AH , 0MOV AL , 4INT 10H ;设置320×200彩色图形方式MOV AH,0BHMOV BH,01MOV BL,01INT 10HMOV CX, 4L1:CALL DISP_RECTcall delayinc PIX ;每循环一次,点的颜色加1ADD ROW , 30 ;改变下一个方块的显示位置LOOP L1MOV AH , 4CHINT 21H ;返回DOS;显示矩形块的子程序,矩形块的显示位置由DATA段中的LINE、ROW变量指定,;颜色由PIX变量指定,矩形块的大小是固定的,为10个点宽,100个点高。
南昌大学实验报告五学生姓名:学号:专业班级:实验类型:■验证□综合□设计□创新实验日期:2009.12.02 实验成绩:一.实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。
二.实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
三.实验环境PC微机DOS操作系统或Windows 操作系统MASM.EXE,LINK.EXE,或宏汇编集成环境四.实验步骤1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。
特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。
3.检查程序执行的结果是否正确。
五.实验结果实验程序:1. DATA SEGMENTBUF DB 0ABH,0CDH,0DEH,01H,02H,03HDB 3AH,4BH,5CH,6FHDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV CX,10LEA BX,BUFAGAIN:MOV AL,[BX]CALL HEXASCINC BXLOOP AGAINMOV AH,4CHINT 21HHEXASC PROC NEARMOV DL,ALPUSH CXMOV CL,4SHR DL,CLPOP CXCALL DISP ;显示高位HEX数MOV DL,ALAND DL,0FHCALL DISPRETHEXASC ENDPDISP PROPCMP DL,9JBE NEXTADD DL,7NEXT:ADD DL,30HMOV AH,2INT 21H ;显示RETDISP ENDPCODE ENDSEND START2.统计并显示某键入字符的个数的程序:;COUNTER.ASMDATA SEGMENTCHAR DB ‘b’BUF DB 50H,? ,50H DUP(?)DATA ENDSMCODE SEGMENTASSUME CS:MCODE,DS:DATA START:MOV AX,DATAMOV DS,AXLEA DX,BUFMOV AH,9INT 21HLEA SI BUFMOV CL,[SI+1]MOV CH,0 ;CX中为字符串长度INC SIINC SI ;SI指向串首址TABLEMOV AL,CHARMOV AH,0 ;AX中为待查字符PUSH SIPUSH CXPUSH AX ;参数送堆栈CALL CHECKPOP AX :统计个数在AL中MOV DL,CHARMOV AH,2INT 21HMOV DL,ALAND DL,0FHCMP DL,9JBE NEXTADD DL,7NEXT:ADD DL,30HMOV AH,2INT 21H ;显示统计个数MOV AH,4CHINT 21HM CODE ENDSSCODE SEGMENTASSUME CS:SCODECHECK PROC FARPUSH BPMOV BP,SPMOV SI,[BP+10]MOV CX,[BP+8]MOV AX,[BP+6]XOR AH,AHAGAIN:CMP AL.[SI]JNE NEXT1INC AHNEXT1:INC SILOOP AGAINMOV AL,AHMOV [BP+10],AXPOP BPRET 4CHECK ENDPEND START六.实验总结从这个实验中,学会了用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化,检查程序执行的结果是否正确,以及修改程序中的错误等。
子程序设计2.6显示学生名次表rank编制一个程序,要求接受键盘输入的一个班的学生成绩,并存放于一个50字的grade数组中,其中grade+i保存学号为I+1的学生成绩。
然后根据grade中的学生成绩,把学生成绩依次填入50字的rank数组中,其中rank+i的内容是学号为i+1的学生的名次。
再按学号顺序把名次从终端上显示出来。
本题要做的主要工作和例2.2的内容是完全一样的,只是增加了由用户键入学生成绩及输出学生名次两个部分的内容,因此这三个部分可以用子程序结构来完成。
子程序结构划分的层次图如图2.17所示,可以看出,main为主要模块,其下一层的三个模块为程序的三大部分。
现将各模块说明如下:1.模块名:main 为总模块输入:从键盘输入一个班的学生成绩输出:显示一个班的学生成绩功能:根据输入的学生成绩,计算并显示学生名次。
算法如下:一个学生名次等于成绩高于该学生的人数+1.2.模块名:input输入:以学号为序型键盘输入一个班的学生成绩。
各个成绩之间用逗号隔开,最后以回车符号结束。
输出:把一个班的学生成绩存入grade数组。
功能:接受一个班的学生成绩。
调用子模块decibin把键盘输入的一个十进制数转换为二进制数。
调用子模块crlf完成回车,换行功能。
3.模块名:rankp输入:从grade数组取得一个班的学生成绩。
输出:以学号为序计算出该班每个学生的名次存入rank数组。
功能:计算一个班的学生成绩。
算法为:一个学生的名次等于成绩高于该生的学生人数加1.4,。
模块名;output输入:把rank数组取得一个班的学生名次。
输出:把一个班的学生名次以学号为序在总端上显示出来。
功能:先是一个班的学生名次。
调用子模块decibin把键盘输入的一个十进制数转换为二进制数。
调用子模块crlf完成回车,换行功能。
5:模块名:decilin输入:从键盘输入一个十进制数。
输出:把该数转换成二进制数并存入BX寄存器中。
汇编语言程序设计实验报告班级:计科1班学号:姓名:实验日期2015.11.10 成绩实验五 I/O程序设计制声响程序,从键盘输入(1~9)数字N 后,能发出N次声音,响声间隔1秒钟,并且每次显示一个串“The bell is ring”。
程序框图:程序清单:DATA SEGMENTA DB 'Please INPUT:$'BUF DB 'The bell is ring!$'FK DW 60000LON DW 5000DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA DX,A ;取A的首地址L1: MOV AH,9 ;显示字符串(9号功能)INT 21HMOV AH,1 ;从键盘输入一个字符(1号功能)INT 21HCMP AL,3AH ;AL≧3AHJGE L1 ;则转L1CMP AL,30H ;AL≦30HJLE L1 ;则转L1SUB AL,30H ;AL减去30HXOR AH,AHMOV CL,ALCALL CRLH ;调用CRLH子程序MOV DI,CXMOV CH,0MOV CX,DIL3:LEA DX,BUF ;取BUF首地址MOV AH,9 ;显示字符串(9号功能)INT 21HCALL SOUND ;调用SOUND子程序CALL CRLHCALL DELAY ;调用DELAY子程序LOOP L3MOV AH,4CHINT 21HSOUND PROCPUSH BXPUSH CXMOV BX,FKMOV CX,LONIN AL,61H ;将61H端口号送到ALAND AL,0FCH ;AL˄0FCHK1:XOR AL,2OUT 61H,ALMOV BX,FKK2:DEC BX ;BX-1JNZ K2 ;≠0则转K2DEC CX ;CX-1JNZ K1 ;≠0则转K1POP CXPOP BXRETSOUND ENDPCRLH PROCMOV DL,0AH ;换行MOV AH,2 ;显示一个字符(2号功能)INT 21HMOV DL,0DH ;回车MOV AH,2 ;显示一个字符(2号功能)INT 21HRETCRLH ENDPDELAY PROCPUSH AXPUSH DXMOV AX,30000LL1:MOV DX,60000LL2:DEC DX ;DX-1JNZ LL2 ;≠0则转D2DEC AX ;AX-1JNZ LL1 ;≠0则转D1POP AXPOP DXRETDELAY ENDPCODE ENDSEND START运行结果:运行结果图实验总结:。