汇编语言实验7-模块化程序设计
- 格式:doc
- 大小:104.50 KB
- 文档页数:13
汇编语言实验报告Assembly Language Programming Lab Reports______________________________________________________________________________班级: _________ 姓名:___________ 学号:___________ 实验日期:_____________学院: _____计算机与通信工程学院____ 专业:_______计算机科学与技术___________实验顺序:___实验七____ 实验名称:____________模块化程序设计________________ 实验分数:_______ 考评日期:________ 指导教师:______________________________________________________________________________一.实验目的1、掌握宏定义的相关内容。
(1)伪指令: MACRO,ENDM。
(2)掌握宏定义时的哑元,变元,&分割符的使用。
变元可以是操作数,操作码,操作码的一部分和&联合使用,存储单元,字符串。
(3)掌握宏调用时的实元和宏的展开。
2.掌握宏运算(1)&替换运算符(2)<>传递运算符(3)!转义运算符号(4)%表达式运算符(5);;宏注释符3、其它宏功能(1)宏标号LOCAL(2)宏删除purge(3)宏嵌套,宏展开中的数字1代表插入的程序是宏定义实体中的。
宏嵌套在展开时里层被嵌套调用的宏会显示嵌套调用的层次,待验证。
(4)宏库的建立和调用______________________________________________________________________________二.实验环境操作系统:windows xp编译程序:masm 5.0______________________________________________________________________________三.实验原理宏库的建立和调用______________________________________________________________________________四.实验步骤及结果分析1、宏库的建立及调用(1)宏库:;8-2.mac 宏库;1input macro ; 宏input,键盘输入一个字符mov ah,01Hint 21hendm;2output macro opr1 ; 宏output,显示一个字符mov dl,opr1mov ah,02hint 21hendm;3retsys macro ; 宏retsys,结束、返回DOSmov ah,4chint 21hendm;4key_str macro opr1 ; 宏key_str,键盘输入一串字符mov dx,offset opr1mov ah,10int 21hendm;5display macro opr1 ; 宏display,显示一串字符lea dx,opr1mov ah,9int 21hendm;6divis macro x ;转换显示为十进制mov cx,x ;x=10000,1000,100,10,1div cx ;ax除以cx,商在ax,余数在dxmov bx,dx ;保存余数mov si,axmov dl,dectab[si] ;查表显示mov ah,2 ;显示ax中部分商int 21hmov ax,bxmov dx,0endm(2)主程序:;8-6.asm 模块化程序。
模块化程序设计模块化程序设计什么是模块化程序设计在软件开辟中,模块化程序设计是一种将软件系统划分为独立的模块或者组件的方法。
每一个模块都有自己的功能和责任,可以通过定义模块之间的接口来实现模块之间的通信和协作。
通过模块化程序设计,我们可以更加灵便地开辟、测试和维护软件系统。
为什么需要模块化程序设计1. 提高代码的复用性模块化程序设计可以将功能相似的代码封装在独立的模块中,这样可以使得这部份代码可以被多个程序共享和复用。
通过复用模块,可以减少代码的重复编写,提高开辟效率。
2. 提高代码的可维护性当一个软件系统被划分为多个模块时,每一个模块的功能和责任都较为清晰明确。
这样,当需要修改系统的某个功能时,只需要关注与该功能相关的模块,而不需要修改整个系统的代码。
这样可以提高代码的可维护性,降低修改代码时的风险和工作量。
3. 提高开辟效率将一个复杂的软件系统划分为多个模块后,每一个模块可以由不同的开辟人员独立开辟。
这样可以并行开辟不同模块,提高开辟效率。
同时,不同模块之间的接口定义也可以促进开辟人员之间的协作和沟通,减少开辟冲突。
4. 降低系统的耦合度模块化程序设计可以将系统中的各个模块解耦。
模块之间通过明确定义的接口进行通信,模块之间的依赖关系减少。
这样,当需要修改系统的某个模块时,对其他模块的影响较小,可以降低系统的耦合度,增强系统的灵便性。
实现模块化程序设计的方法1. 使用函数模块化在不少编程语言中,函数是实现模块化程序设计的基本单位。
我们可以将相关功能的代码封装在一个函数中,并通过函数的参数和返回值来实现多个函数之间的通信和协作。
例如,在Python中,我们可以定义一个计算圆面积的函数:pythondef calculate_area(radius):return 3.14 radius 22. 使用类模块化除了函数,类也是一种常用的模块化设计方法。
通过将相关的属性和方法封装在类中,可以更好地组织和管理代码。
汇编语⾔实验报告模块化程序设计汇编语⾔实验报告Assembly Language Programming Lab Reports______________________________________________________________________________ 班级:姓名:学号:实验⽇期:学院:专业:实验顺序:原创:___ 实验名称:模块化程序设计实验分数:_______ 考评⽇期:________ 指导教师:______________________________________________________________________________ ⼀.实验⽬的1、掌握宏定义的相关内容。
(1)伪指令: MACRO,ENDM。
(2)掌握宏定义时的哑元,变元,&分割符的使⽤。
变元可以是操作数,操作码,操作码的⼀部分和&联合使⽤,存储单元,字符串。
(3)掌握宏调⽤时的实元和宏的展开。
2.掌握宏运算(1)&替换运算符(2)<>传递运算符(3)!转义运算符号(4)%表达式运算符(5);;宏注释符3、其它宏功能(1)宏标号LOCAL(2)宏删除purge(3)宏嵌套,宏展开中的数字1代表插⼊的程序是宏定义实体中的。
宏嵌套在展开时⾥层被嵌套调⽤的宏会显⽰嵌套调⽤的层次,待验证。
(4)宏库的建⽴和调⽤4、结构伪操作(1)结构定义结构名 STRUG结构体结构名 ENDS(2)结构预置(3)结构引⽤5、重复汇编和条件汇编。
6、多模块结构程序设计(1)全局符号定义PUBLIC(2)外部符号说明EXTRN(3)段属性与段组合(4)参数传递7、宏指令和⼦程序的区别(1)⼯作⽅式的区别,在多次调⽤时,使⽤宏指令占⽤较⼤空间但速度较快。
使⽤⼦程序占⽤空间⼩但执⾏时间长。
(2)参数传递的⽅便性。
(3)参数的多样性和灵活性,宏指令的实参数可以是常数,寄存器,内存变量,操作码或操作码的⼀部分,操作数的⼀部分等,⼦程序是不可以⽐拟的。
实验7 用函数实现模块化程序设计班级电信132 学号201315100209 姓名许春欢一、实验目的①掌握定义函数的方法;②掌握函数实参与形参的对应关系以及“值传递”的方式;③掌握函数的嵌套调用和递归调用的方法;④掌握全局变量和局部变量动态变量、静态变量的概念和使用方法。
⑤学习对多文件程序的编译和运行。
二、实验内容用函数实现以下程序并调试。
1、写一个函数,求10个学生的平均成绩。
#include <stdio.h>#define N 10void main( ){float a(float y[ ],int M);int i;float cj[N],pjcj;printf("输入%d个学生的成绩:\n",N);for(i=0;i<N;i++)scanf("%f",&cj[i]);pjcj=a(cj,N);printf("平均成绩是%5.2f\n",pjcj);}float a(float y[ ],int M){int i;float pj,sum=0;for(i=0;i<10;i++)sum=sum+y[i];pj=sum/M;return(pj);}2、写一个函数,用“起泡法”对输入的10个数字由小到大排序。
#include<stdio.h>#include<string.h>int str[10];int main(){ void sort(int str[]);int i,str[10];printf("input 10 nubers:\n");for(i=0;i<10;i++)scanf("%d",&str[i]);printf("\n");sort(str);printf("string sorted:\n");for(i=0;i<10;i++)printf("%3d",str[i]);printf("\n");return 0;}void sort(int str[]){int i,j,t;for(j=0;j<9;j++)for(i=0;i<9-j;i++)if(str[i]>str[i+1]){t=str[i];str[i]=str[i+1];str[i+1]=t;}}3、求方程ax2+bx+c=0的根,用三个函数分别求当b2-4ac大于0、等于0和小于0时的根,并输出结果。
汇编语言实验报告Assembly Language Programming Lab Reports______________________________________________________________________________班级: _________ 姓名:___________ 学号:___________ 实验日期:_____________学院: _____计算机与通信工程学院____ 专业:_______计算机科学与技术___________实验顺序:___实验七____ 实验名称:____________模块化程序设计________________ 实验分数:_______ 考评日期:________ 指导教师:______________________________________________________________________________一.实验目的1、掌握宏定义的相关内容。
(1)伪指令: MACRO,ENDM。
(2)掌握宏定义时的哑元,变元,&分割符的使用。
变元可以是操作数,操作码,操作码的一部分和&联合使用,存储单元,字符串。
(3)掌握宏调用时的实元和宏的展开。
2.掌握宏运算(1)&替换运算符(2)<>传递运算符(3)!转义运算符号(4)%表达式运算符(5);;宏注释符3、其它宏功能(1)宏标号LOCAL(2)宏删除purge(3)宏嵌套,宏展开中的数字1代表插入的程序是宏定义实体中的。
宏嵌套在展开时里层被嵌套调用的宏会显示嵌套调用的层次,待验证。
(4)宏库的建立和调用______________________________________________________________________________二.实验环境操作系统:windows xp编译程序:masm 5.0______________________________________________________________________________三.实验原理宏库的建立和调用______________________________________________________________________________四.实验步骤及结果分析1、宏库的建立及调用(1)宏库:;8-2.mac 宏库;1input macro ; 宏input,键盘输入一个字符mov ah,01Hint 21hendm;2output macro opr1 ; 宏output,显示一个字符mov dl,opr1mov ah,02hint 21hendm;3retsys macro ; 宏retsys,结束、返回DOSmov ah,4chint 21hendm;4key_str macro opr1 ; 宏key_str,键盘输入一串字符mov dx,offset opr1mov ah,10int 21hendm;5display macro opr1 ; 宏display,显示一串字符lea dx,opr1mov ah,9int 21hendm;6divis macro x ;转换显示为十进制mov cx,x ;x=10000,1000,100,10,1div cx ;ax除以cx,商在ax,余数在dxmov bx,dx ;保存余数mov si,axmov dl,dectab[si] ;查表显示mov ah,2 ;显示ax中部分商int 21hmov ax,bxmov dx,0endm(2)主程序:;8-6.asm 模块化程序。
对输入的多个带符号数做相加运算,并用二进制和十六进制显示,再用十进制显示include 8-2.mac ;宏库data segmentsumm dw 0sign db 0mess1 db 0dh,0ah,'input dec=$'mess2 db 0dh,0ah,'summ binary=$'mess3 db 0dh,0ah,'summ HEX=$'mess4 db 0dh,0ah,'summ decimal=$'coup dw ?bin db '01' ;二进制ASCII码hex db '0123456789ABCDEF' ;十六进制ASCII码data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,ax;主程序main proc fardisplay mess1 ;宏display,显示提示1mov bx,0mov cx,0call subr1add summ,bx ;求累加和;显示累加和display mess2 ;宏display,显示提示2lea bx,binmov cl,1mov ch,16mov coup,0001hcall subr2 ;显示二进制结果display mess3 ;宏display,显示提示3lea bx,hexmov cl,4mov ch,4mov coup,000fhcall subr2 ;显示十六进制结果display mess4 ;宏display,显示提示4call subr3 ;显示十进制结果jmp mainout1:retsys ;宏retsys,返回DOSmain endp;子程序1:键盘输入、形成十进制subr1 proc nearmov sign,0see0:input ;宏,键盘输入十进制数cmp al,0dh ;回车?jz exitcmp al,'-'jnz see1mov sign,'-' ;保存负号jmp see2see1:cmp al,'0' ;其它字符?jl out1 ;转out1cmp al,'9'jg out1and ax,000fh ;去掉ascii码xchg ax,bx ;形成十进制数mov cx,10mul cx ;乘以10add bx,axsee2:jmp see0exit:cmp cx,0 ;先键入了回车,退出jz out1cmp sign,'-'jnz see3neg bx ;是负数,求补,变为补码see3: ;寄存器BX传参retsubr1 endp;subr2,子程序2:显示subr2 proc nearmov di,summ ;存储单元summ传参look1:rol di,cl ;循环左移cl位mov si,diand si,coup ;保留最低m位mov dl,[bx][si] ;查表显示高位、低位output dl ;宏,显示dec chjnz look1 ;显示n位retsubr2 endp;subr3,子程序3:显示十进制结果subr3 proc nearmov ax,summ ;存储单元summ传参and ax,ax ;判断符号位jns let0 ;是正数转LET0neg ax ;负数求补mov si,axoutput '-' ;宏,显示负号mov ax,silet0:mov cx,0mov bx,10 ;将ax变为十进制数let1:mov dx,0inc cx ;统计余数个数idiv bx ;除以10push dx ;压栈,保存余数cmp ax,0jnz let1let2: ;显示结果,个数在cx中pop ax ;将余数弹入axadd ax,0030h ;调整为ascii码output al ;宏,显示loop let2retsubr3 endpcode endsend start(3)LST文件:Microsoft (R) Macro Assembler Version 5.00 5/28/18 09:23:04 Page 1-1 ;8-6.asm 模块化程序。
include 8-2.mac ;宏库C ;8-2.mac 宏库C ;1C input macro ; 宏input,键盘输入一个字符C mov ah,01HC int 21hC endmC ;2C output macro opr1 ; 宏output,显示C mov dl,opr1C mov ah,02hC int 21hC endmC ;3C retsys macro ; 宏retsys,结果C mov ah,4chC int 21hC endmC ;4C key_str macro opr1; 宏key_str,键盘输入一串字符 C mov dx,offset opr1C mov ah,10C int 21hC endmC ;5C display macro opr1 ; 宏display,显示一串字符 C lea dx,opr1C mov ah,9C int 21hC endmC ;6C divis macro x ;转换显示为十进制C mov cx,x ;x=10000,1000,100,10,1C div cx ;ax除以cx,商在ax,余数在dxC mov bx,dx ;保存余数C mov si,axC mov dl,dectab[si] ;查表显示C mov ah,2 ;显示ax中部分商C int 21hC mov ax,bxC mov dx,0C endmMicrosoft (R) Macro Assembler Version 5.00 5/28/18 09:23:04 Page 1-20000 data segment0000 0000 summ dw 00002 00 sign db 00003 0D 0A 69 6E 70 75 74 mess1 db 0dh,0ah,'input dec=$'20 64 65 63 3D 240010 0D 0A 73 75 6D 6D 20 mess2 db 0dh,0ah,'summ binary=$'62 69 6E 61 72 79 3D24001F 0D 0A 73 75 6D 6D 20 mess3 db 0dh,0ah,'summ HEX=$'48 45 58 3D 24002B 0D 0A 73 75 6D 6D 20 mess4 db 0dh,0ah,'summ decimal=$'64 65 63 69 6D 61 6C3D 24003B ???? coup dw ?003D 30 31 bin db '01' ;二进制ASCII码003F 30 31 32 33 34 35 36 hex db '0123456789ABCDEF' ;十六进制ASCII??37 38 39 41 42 43 4445 46004F data ends0000 code segmentassume cs:code,ds:data0000 start:0000 B8 ---- R mov ax,data0003 8E D8 mov ds,ax;主程序0005 main proc fardisplay mess1 ;宏display,显示提示1 0005 8D 16 0003 R 1 lea dx,mess10009 B4 09 1 mov ah,9000B CD 21 1 int 21h000D BB 0000 mov bx,00010 B9 0000 mov cx,00013 E8 005D R call subr10016 01 1E 0000 R add summ,bx ;求累加和;显示累加和display mess2 ;宏display,显示提示2 001A 8D 16 0010 R 1 lea dx,mess2001E B4 09 1 mov ah,90020 CD 21 1 int 21h0022 8D 1E 003D R lea bx,bin0026 B1 01 mov cl,10028 B5 10 mov ch,16002A C7 06 003B R 0001 mov coup,0001h0030 E8 009A R call subr2 ;显示二进制结果display mess3 ;宏display,显示提示3 0033 8D 16 001F R 1 lea dx,mess30037 B4 09 1 mov ah,90039 CD 21 1 int 21h003B 8D 1E 003F R lea bx,hex003F B1 04 mov cl,40041 B5 04 mov ch,40043 C7 06 003B R 000F mov coup,000fhMicrosoft (R) Macro Assembler Version 5.00 5/28/18 09:23:04 Page 1-30049 E8 009A R call subr2 ;显示十六进制结果display mess4 ;宏display,显示提示4 004C 8D 16 002B R 1 lea dx,mess40050 B4 09 1 mov ah,90052 CD 21 1 int 21h0054 E8 00B3 R call subr3 ;显示十进制结果0057 EB AC jmp main0059 out1:retsys ;宏retsys,返回DOS0059 B4 4C 1 mov ah,4ch005B CD 21 1 int 21h005D main endp;子程序1:键盘输入、形成十进制005D subr1 proc near005D C6 06 0002 R 00 mov sign,00062 see0:input ;宏,键盘输入十进制数0062 B4 01 1 mov ah,01H0064 CD 21 1 int 21h0066 3C 0D cmp al,0dh ;回车?0068 74 21 jz exit006A 3C 2D cmp al,'-'006C 75 08 jnz see1006E C6 06 0002 R 2D mov sign,'-' ;保存负号0073 EB 14 90 jmp see20076 see1:0076 3C 30 cmp al,'0' ;其它字符?0078 7C DF jl out1 ;转out1007A 3C 39 cmp al,'9'007C 7F DB jg out1007E 25 000F and ax,000fh ;去掉ascii码0081 93 xchg ax,bx ;形成十进制数0082 B9 000A mov cx,100085 F7 E1 mul cx ;乘以100087 03 D8 add bx,ax0089 see2:0089 EB D7 jmp see0008B 83 F9 00 exit:cmp cx,0 ;先键入了回车,退出008E 74 C9 jz out10090 80 3E 0002 R 2D cmp sign,'-'0095 75 02 jnz see30097 F7 DB neg bx ;是负数,求补,变为补码0099 see3: ;寄存器BX传参0099 C3 ret009A subr1 endp;subr2,子程序2:显示009A subr2 proc near009A 8B 3E 0000 R mov di,summ ;存储单元summ传参009E look1:009E D3 C7 rol di,cl ;循环左移cl位Microsoft (R) Macro Assembler Version 5.00 5/28/18 09:23:04 Page 1-4 00A0 8B F7 mov si,di00A2 23 36 003B R and si,coup ;保留最低m位00A6 8A 10 mov dl,[bx][si] ;查表显示高位、低位output dl ;宏,显示00A8 8A D2 1 mov dl,dl00AA B4 02 1 mov ah,02h00AC CD 21 1 int 21h00AE FE CD dec ch00B0 75 EC jnz look1 ;显示n位00B2 C3 ret00B3 subr2 endp;subr3,子程序3:显示十进制结果00B3 subr3 proc near00B3 A1 0000 R mov ax,summ ;存储单元summ传参00B6 23 C0 and ax,ax ;判断符号位00B8 79 0C jns let0 ;是正数转LET000BA F7 D8 neg ax ;负数求补00BC 8B F0 mov si,axoutput '-' ;宏,显示负号00BE B2 2D 1 mov dl,'-'00C0 B4 02 1 mov ah,02h00C2 CD 21 1 int 21h00C4 8B C6 mov ax,si00C6 let0:00C6 B9 0000 mov cx,000C9 BB 000A mov bx,10 ;将ax变为十进制数00CC let1:00CC BA 0000 mov dx,000CF 41 inc cx ;统计余数个数00D0 F7 FB idiv bx ;除以1000D2 52 push dx ;压栈,保存余数00D3 3D 0000 cmp ax,000D6 75 F4 jnz let100D8 let2: ;显示结果,个数在cx中00D8 58 pop ax ;将余数弹入ax00D9 05 0030 add ax,0030h ;调整为ascii码output al ;宏,显示00DC 8A D0 1 mov dl,al00DE B4 02 1 mov ah,02h00E0 CD 21 1 int 21h00E2 E2 F4 loop let200E4 C3 ret00E5 subr3 endp00E5 code endsend startMicrosoft (R) Macro Assembler Version 5.00 5/28/18 09:23:04 Symbols-1Macros:N a m e LinesDISPLAY . . . . . . . . . . . . 3DIVIS . . . . . . . . . . . . . 9INPUT . . . . . . . . . . . . . 2KEY_STR . . . . . . . . . . . . 3OUTPUT . . . . . . . . . . . . . 3RETSYS . . . . . . . . . . . . . 2Segments and Groups:N a m e Length Align Combine ClassCODE . . . . . . . . . . . . . . 00E5 PARA NONEDATA . . . . . . . . . . . . . . 004F PARA NONESymbols:N a m e Type Value AttrBIN . . . . . . . . . . . . . . L BYTE 003D DATACOUP . . . . . . . . . . . . . . L WORD 003B DATAEXIT . . . . . . . . . . . . . . L NEAR 008B CODEHEX . . . . . . . . . . . . . . L BYTE 003F DATALET0 . . . . . . . . . . . . . . L NEAR 00C6 CODELET1 . . . . . . . . . . . . . . L NEAR 00CC CODELET2 . . . . . . . . . . . . . . L NEAR 00D8 CODELOOK1 . . . . . . . . . . . . . L NEAR 009E CODEMAIN . . . . . . . . . . . . . . F PROC 0005 CODE Length = 0058MESS1 . . . . . . . . . . . . . L BYTE 0003 DATAMESS2 . . . . . . . . . . . . . L BYTE 0010 DATAMESS3 . . . . . . . . . . . . . L BYTE 001F DATAMESS4 . . . . . . . . . . . . . L BYTE 002B DATAOUT1 . . . . . . . . . . . . . . L NEAR 0059 CODESEE0 . . . . . . . . . . . . . . L NEAR 0062 CODESEE1 . . . . . . . . . . . . . . L NEAR 0076 CODESEE2 . . . . . . . . . . . . . . L NEAR 0089 CODESEE3 . . . . . . . . . . . . . . L NEAR 0099 CODESIGN . . . . . . . . . . . . . . L BYTE 0002 DATASTART . . . . . . . . . . . . . L NEAR 0000 CODESUBR1 . . . . . . . . . . . . . N PROC 005D CODE Length = 003DSUBR2 . . . . . . . . . . . . . N PROC 009A CODE Length = 0019SUBR3 . . . . . . . . . . . . . N PROC 00B3 CODE Length = 0032SUMM . . . . . . . . . . . . . . L WORD 0000 DATAMicrosoft (R) Macro Assembler Version 5.00 5/28/18 09:23:04Symbols-2@FILENAME . . . . . . . . . . . TEXT test161 Source Lines187 Total Lines34 Symbols51056 + 449104 Bytes symbol space free0 Warning Errors0 Severe Errors(4)运行结果:____________________________________________________________________________五.实验心得疑问建议通过本次实验,学习了宏的定义和调用,并且从LST文件中了解到了宏调用的过程和方式,并运用宏实现了进制转换。