《汇编语言程序大作业 .pdf》由会员分享,可在线阅读,更多相关《汇编语言程序大作业 .pdf(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、汇编语言程序大作业名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - 程序简介本程序的功能简单, 是可以根据用户从键盘的不同输入,回显在显示器上不同的结果。其实现的功能是当用户从键盘输入01 至 12 之间的数时(一年12 个月) ,程序能给用户返回其相应的月份的英文缩写符;程序的运行过程介绍1)当从编程环境按下运行按钮之后,屏幕上会显示如下一个窗口:图(1)提示使用者输入01 至 12 之间的任一个两位数字,这里可以随意输入01至
2、 12 之间的一个两位数字;2)这里从键盘输入如下图所示的数字名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - 接着按下回车键, 则会显示用户所输入的数字的相应的月份的英文缩写,如下图所示:程序功能分析:本程序功能简单, 仅有输入输出功能, 即从键盘上输入一些数字并回车之后给使用者提示相应的信息,下面介绍程序中相应功能是如何实现的:第一,根据常规本程序没有涉及到子程序的概念,仅仅有照常的数据段和代码段而且同时把数据段定义为附加段;
3、第二,在代码段里共有四个部分分别为主程序代码部分键盘输入部分 设置部分和输出部分;下面分别介绍代码段里的各个部分代码段里的主程序部分:main proc far push ds ; 为返回而把 ds保存到堆栈段sub ax,ax ; 清空ax寄存器的内容push ax ; 把0(清空后的 ax的内容)推入堆栈段mov ax,DATASG ; mov ds,ax; 把ax作为中间变量给数据段寄存器送入内存中数据段的首地址mov es,ax ; 同时把该首地址送给附加段 call input ; 调用子程序 input (输入子程序) call locate ; 调用子程序 locate (设置子
4、程序) call display ; 调用子程序 display (输入子程序) ret ; 返回main endp ;main 主程序结束代码段里的键盘输入部分:input proc near push dx ; 为保护 dx而把其内容推入堆栈段名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - lea dx,DSPLY1 ; 为了让使用者知道程序一开始要输入什么,这里将把内存中数据段里的 DSPLY1 变量的首地址送给 dx寄存
5、器 (专业的说法就是把 DSPLY1的偏移地址送给了 dx数据寄存器)mov ah,09h ; 为了能显示 DSPLY1 变量里的字符串,故把 09送给ah并之后中断一次int 21h ;DOS 中断mov ah,0ah ; 换行lea dx,MONIN ; 把MONIN 的偏移地址送给寄存器 dx int 21h ;DOS 中断mov ah,MONIN +2 ; 把MONIN 作为首地址后再加 2以后的存储单元内容送 ah mov al,MONIN+3 ; 把MONIN 作为首地址后再加 3以后的存储单元内容送 alxor ax,3030h ; 清空ax的相应位置cmp ah,00 ;ah
6、和00进行比较(主要确定键盘所输入的数字是否在01-09之间)jz return ; 若ah的内容确实为 0则跳到 return 标签处sub ah,ah ; 若ah的内容不为零则清空 ah add al,10 ; 之后al 的内容相加 10存入al return: pop dx ; 重新从堆栈段弹出 dx ret ; 返回input endp 设置部分locate proc near push si ; 保存si 寄存器的内容(推入堆栈段)push di ; 保存di 寄存器的内容(推入堆栈段)push cx ; 保存cx寄存器的内容(推入堆栈段)lea si,MONTAB ; 把MONTA
7、B的偏移地址送给 si 寄存器dec al ;al 的内容减一(为建立一个表)mul THREE ;ax 和数据段中的 THREE 变量进行相乘add si,ax ; 之后si 和ax的内容进行相加mov cx,03 ; 把03送入cx寄存器cld ; 为循环的方向做确定(定义方向为从左到右进行扫描)lea di,ALFMON ; 把数据段中变量 ALFMON的偏移地址送给 di 寄存器rep movsb ; 进行以字节为单位的扫描pop cx ; 从堆栈段弹出 cx pop di ; 从堆栈段弹出 di pop si ; 从堆栈段弹出 si ret ; 返回locate endp 输出部分d
8、isplay proc near 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - push dx ; 为保护 dx的内容而把 dx lea dx,DSPLY2 ; 为了解释最后显示的结果,故把建立在数据段里的DSPLY2 变量的首地址送给了 dx寄存器,也就是把 DSPLY2 的偏移地址送给了 dx寄存器mov ah,09h ; 为了能够显示字符串故把 09h送给了 ah,并之后中断了一次int 21h ;DOS 中断lea d
9、x,ALFMON ; 把ALFMON的偏移地址送给 dx寄存器mov ah,09 ; 为了屏幕上显示字符串int 21h pop dx ; 从寄存器弹出 dx ret display endp 下面介绍 数据段的定义 :DATASG SEGMENT PARA DATA THREE DB 3 MONIN DB 3,4 DUP ( ?) ALFMON DB? , $ MONTAB DBJAN , FEB , MAR, APR , MAY, JUN , JUL , AUG, SEP , OCT, NOV, DECDSPLY1 DBPlaese input two numbers(01-12): $
10、DSPLY2 DBYour input month is: $ DATASG ENDS 本程序的缺点是没办法连续地输入来确定不同的月份,而且是简单的基本输入输出功能的程序,尽管如此本人还是设计出了此程序。程序流程图:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - 程序源代码TITLE MONTH (EXE) DATASG SEGMENT PARA DATA THREE DB 3 MONIN DB 3,4 DUP(?) ALFMO
11、N DB ?,$ MONTAB DB JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC display1 db Please input two numbers:(01-12)$ display2 db Your input month is: $ DATASG ENDS CODESG SEGMENT PARA CODE ASSUME CS:CODESG,DS:DATASG,ES:DATASG main proc far push ds ;为返回而把 ds 保存到堆栈段sub ax,ax ;清空 ax 寄存器的内容push ax ;把 0(清空后的
12、 ax 的内容)推入堆栈段开始询问 Plaese input two numbers(01-12):从键盘接受两位数字数字转换为相应的英文缩写字母显示相应的月份的英文缩写字母名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - - - mov ax,DATASG mov ds,ax ;把 ax 作为中间变量给数据段寄存器送入内存中数据段的首地址mov es,ax ;同时把该首地址送给附加段 call input ;调用子程序input (输入
13、子程序) call locate ;调 用 子 程 序locate (设置子程序)call display ;调用子程序 display (输入子程序)ret ; 返回main endp ;main主程序结束input proc near push dx ;为保护 dx 而把其内容推入堆栈段lea dx,display1 ;为了让使用者知道程序一开始要输入什么,这里将把内存中数据段里的 display1变量的首地址送给 dx 寄存器 (专业的说法就是把display1的偏移地址送给了dx 数据寄存器)mov ah,09h ;为了能显示 display1变量里的字符串,故把09 送给 ah 并之
14、后中断一次int 21h ;DOS中断mov ah,0ah ;换行lea dx,MONIN ;把MONIN的偏移地址送给寄存器dx int 21h ;DOS中断mov ah,MONIN+2 ; 把 MONIN 作为首地址后再加 2 以后的存储单元内容送ah mov al,MONIN+3 ;把 MONIN作为首地址后再加 3 以后的存储单元内容送al xor ax,3030h ;清空 ax 的相应位置名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - -
15、 - - - - cmp ah,00 ;ah和 00 进行比较(主要确定键盘所输入的数字是否在01-09 之间)jz return ;若 ah的内容确实为 0 则跳到 return标签处sub ah,ah ;若 ah的内容不为零则清空 ah add al,10 ;之后 al 的内容相加 10 存入 al return: pop dx ;重新从堆栈段弹出dx ret ;返回input endp locate proc near push si ; 保存 si 寄存器的内容(推入堆栈段)push di ; 保存 di 寄存器的内容(推入堆栈段)push cx ;保存 cx 寄存器的内容(推入堆栈段
16、)lea si,MONTAB ;把 MONTAB 的偏移地址送给 si 寄存器dec al ;al的内容减一(为建立一个表)mul THREE ;ax和数据段中的THREE 变量进行相乘add si,ax ;之后 si 和 ax 的内容进行相加mov cx,03 ;把 03 送入 cx 寄存器cld ;为循环的方向做确定(定义方向为从左到右进行扫描)lea 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - - di,ALFMON ;把
17、数据段中变量 ALFMON 的偏移地址送给 di 寄存器rep movsb ; 进行以字节为单位的扫描pop cx ; 从堆栈段弹出 cx pop di ;从 堆 栈 段 弹出 di pop si ;从堆栈段弹出 si ret ;返回locate endp display proc near push dx ;为保护 dx 的内容而把 dx lea dx,display2 ;为了解释最后显示的结果, 故把建立在数据段里的display2变量的首地址送给了dx 寄存器,也就是把display2的偏移地址送给了dx 寄存器mov ah,09h ;为了能够显示字符串故把09h 送给了 ah,并之后中断了一次int 21h ;DOS中断lea dx,ALFMON ;把 ALFMON 的偏移地址送给 dx 寄存器mov ah,09 ;为了 屏幕 上显示字符串int 21h ;DOS 中断pop dx ;从寄存器弹出 dx ret display endp CODESG ENDS END main 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -
限制150内