设计题目: 系统日期时间显示在屏幕右上角
班 级: ***************
学 号: *******
姓 名: *****
指导教师: ******
二00九年十二月25日
前言
走进了21世纪,汇编在还很多的场合下都是很重要的一门编程语言,也是高级语言和低级语言的介段的一门语言,汇编语言是最接近于机器语言的编程语言。如果说机器语言是计算机操作的本质,那么汇编语言就是最接近本质的语言 。汇编语言操作直接面向硬件,所以,我们在使用汇编语言的时候,我们能够感知计算机的运行过程和原理,从而能够对计算 机硬件和应用程序之间的联系和交互形成一个清晰的认识。这也是最能够锻炼编程者编程思维逻辑的,只有这样,学习者才能 形成一个软、硬兼备的编程知识体系,这是任何高级语言都无法给予的!相对于繁复的高级语言,汇编语言指令集合更简约, 指令操作更直接,从汇编开始学习更符合循序渐进的学习原理, 汇编的操作由于跟硬件紧密相关,所以,很多硬件设施的嵌入式编程使用的都是使用的汇编语言,因为汇编语言更直接 ,更有效率!我们现在的数码产品很多,而这些数码产品赖以生存的芯片,主板等,都包含了嵌入式程序,而这些程序中,汇编语言的使用是相当重要的。
本次课程设计为显示日期时间,我们必须要了解汇编的一些循环指令,因为日期时间是以不断变化,而且到那种场合下都能显示正确的日期和时间我们不能把虚伪的造出来,在真正确编程的基础下才能显示我们所要的日期时间,还有把显示的系统日期和时间要显示在屏幕的右上角,这又是要用到汇编来设计屏幕的坐标,我们必须把屏幕上横列坐标的正确显示位置要抓好,这样才能把我们的实验更精确,更进一步的提高编程能力和培养我们的思维能力。
目录
一、实验目的 …………………………………………………3
二、程序设计思路及框图………………………………3
三、程序调试……………………………………………5
四、运行过程及截图……………………………………8
五、源程序清单…………………………………………9
六、心得体会……………………………………………12
七、参考资料……………………………………………14
一、实验目的
1、熟练掌握汇编语言程序的设计、调试方法。
2、掌握系统日期时间的调用。
3、对于了解计算机系统的组成结构与工作原理、体验底层编程的经验、更深入地学习程序设计方法很有意义,会更加通透地理解例如数据结构、计算机组成原理、操作系统等课程中所学的知识。
4、也为学习计算机接口、单片机及其他计算机控制类课程打下坚实的基础。
5、以面向应用、深入浅出、重视实践、方便教学为。宗旨,顺应人们实践-理论-实践的认识规律。
二、设计思路及框图
1、初始化显存的偏移地址;
2、取当前系统日期:功能号为2AH,返回值送入CX,DX寄存器中;年存入CX,月存入DH,日存入DL;
3、取当前系统时间:功能号为2CH,返回值送入CX,DX寄存器中;时存入CX, 分存入DH,秒存入DL;
4、每读取完年 月 日 时 分 秒 的每一个字段时就调用一个相应的标号;
5、若日期,时间调用完后,要退出系统,则只能按Q或q退出。
6、按Q或q退出系统,按其他键不起用。
7、框图(流程图)如下:
初始化显存偏移地址 |
读取日期 |
读取时间 |
显示相关符号 |
Al=10h(Q键的扫描码) |
返回系统 |
开始 |
否
结束
|
三、程序调试
1、运行环境(软、硬件环境)
硬件:8086以上CPU,内存256M以上。
软件:WINDOWS操作系统,MASM,LINK汇编编译链接软件。
(WIN-MASM)
2、调试中遇到的问题
(1)、汇编程序要求标点符号为半角方式,否则编译失败。可在输入:,时切换到半角方式,或者在大写状态输入标点符号,这是容易犯而不易发现的错误。
(2)、要求用字寄存器的指令使用了字节寄存器.如PUSH,POP指令的操作数寄存器必须是字寄存器。
(3)、存器重复调用
如主程序中设定了R4=5,表示主程序循环执行5次,而其中的一个延时子程序又用到R4,使R4的值发生紊乱,造成程序无法正常执行。月日和时间显示格式不对
(4)、无退出提示。
按Q或q退出
3、问题解决方案
在(AX)/(BL)之后,即执行DIV BL,其商送(AL),余数送(AH),如6月存放与(DH)中,除以(BL)之后,商为0,余数为6。分别存放在AL和AH之中,加上3030H之后,AX中的内容为3630H。由于定义TIMEDIS为字节型,故存放时30H存放在低字节,36H存放在高位字节,显示时,‘0’字符在第一个显示,‘6’字符在第二个显示,才会显示‘06’。所以,SI指针应指向第一个‘0’,即第一个字节空间。同理,显示日和时间的时候也需要注意出现这种情况。
由连接程序产生的执行文件可在DOS操作系统中运行。DOS操作系统在装入执行文件之前,先在存储器用户存储区的第一个地址开始,建立一个256字节的程序段前缀PSP,然后将执行文件调入内存。
序段前缀PSP可看作执行文件的一个特殊段,当执行文件程序装入后,段寄存器DS的值为该特殊段的段地址,根据偏移量其各个地址的内容如下:
00H--01H 装INT 20H的软中断指令。
02H--03H 内存容量,以16字节为单位。
04H--08H FAR JMP,转移到DOS的功能调用入口。
09H--0CH 程序结束地址。
0DH--10H CTRL-BREAK退出地址。
11H--14H 错误出口地址。
5CH--6BH 文件控制块1--FCB1
6CH--7BH 文件控制块2--FCB2
80H--FFH 命令行缓冲区和磁盘数据传输区
当执行文件装入内存后,执行文件放在PSP段之后。此时按源程序的次序分别为堆栈段、数据段、附加段及代码段等逻辑段。我们可通过DEBUG程序将此执行文件调入并进行观察。在DEBUG程序调入P21.EXE文件之后,检查各寄存器的内容如下:
AX=0000 BX=0000 CX=024B DX=0000 SP=0200 BP=0000 SI=0000 DI=0000
DS=1150 ES=1150 SS=1160 CS=1182 IP=0000 NV UP EI PL NZ NA PO NC
从上述寄存器的内容中可以发现:
1、源程序中对程序的起始地址进行了定位,CS寄存器指向该地址所在的段,此时IP指向该单元。如源程序中未对程序的起始地址进行定位,起始地址定于程序段前缀的首地址,即CS寄存器指向程序段前缀PSP,IP寄存器指向0000H。
2、时SS寄存器指向堆栈段,SP为该堆栈的长度,即指向堆栈段的末地址加1的单元。
3、S、ES寄存器指向程序段前缀PSP。
从程序段前缀PSP的第一个单元开始的100H个单元为程序段前缀PSP,其后为堆栈段、数据段、附加段及代码段。DS、ES(PSP)定位于1150H,SS定位于1160H,由于在例1-12中堆栈段长度为200H,实际数据段和附加段的地址为1180H和1181H,而代码段的地址为1182 H。
指令ASSUME将段寄存器的名字与逻辑段的名字联系起来,即告诉汇编程序在以下的程序中,程序段、堆栈段、数据段、附加段寄存器应和哪一个逻辑段相联系。但ASSUME指令仅仅将段寄存器的名字与逻辑段的名字联系起来,并未将这些逻辑段的实际地址赋予段寄存器。因此,在ASSUME指令之后,必须用MOV指令对段寄存器进行赋值。
在程序中设置堆栈段是为了在使用PUSH、POP、CALL指令以及中断程序时,能对堆栈进行操作。如程序中因无需堆栈操作而不设堆栈段时,或漏设堆段时,宏汇编程序就不知道堆栈段使用哪个逻辑段,由于这种情况不影响机器码的产生,在汇编时不产生错误,而在连接时将发出警告。如果我们对具有此类错误的执行文件不予理采而加以运行时,并不一定会影响程序的正常运行。 此时如程序不进行堆栈操作,则对程序的运行不会产生影响。但如程序需进行堆栈操作,由于SP指针减1,变为FFFFH,而SS段地址指向等于数据段的段地址,因此堆栈操作极有可能在数据段或代码段进行。为安全起见,堆栈段的设置是必须的。
四、运行过程截图
(1)双击WIN-MASM,打开WIN-MASM;
(2)在界面中输入调试成功的代码,如下图所示,
(3)在程序调试完成后先保存(Ctrl+S),然后编译连接并运行(F9)可以把程序运行如果编译没有任何错误
图(1)
(4)、编译成成功后回出现用户提示信息(恭喜,
图(2)
五、源程序清单
源程序代码为:
assume cs:code
code segment
start:
mov bx,0b800h
mov es,bx
mov di,160*0+1*124 ;初始化显存的偏移地址,
push di ;此处为第12行第30列。
mov al,10 ;为了有规律可循,初始al的值为10(十进制)
rdate: ;读取日期
dec al
cmp al,7
jb rtime ;当读完‘日’后,就跳至标号rtime处
call show
add di,6
jmp short rdate
rtime: ;读取时间
sub al,2
cmp al,0feh ;为无符号数相减
je sign ;当读完‘秒’后,就跳至标号sign处
call show
add di,6
jmp short rtime
sign: ;显示相关符号
pop di
add di,4 ;定位第一个'/'符号在显存的偏移地址
mov byte ptr es:[di],'/'
add di,6
mov byte ptr es:[di],'/'
add di,12 ;跳过日期与时间之间的空格
mov byte ptr es:[di],':'
add di,6
mov byte ptr es:[di],':'
in al,60h
cmp al,10h ;Q键的扫描码
je quit ;按下q或Q则退出
jmp start ;否则继续读取时间(循环读取达到动态显示的作用)
quit: mov ax,4c00h
int 21h
show: push ax
push cx
;push bx
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
add ah,30h
add al,30h
;mov bx,0b800h
;mov es,bx
mov byte ptr es:[di],ah
mov byte ptr es:[di+2],al
;pop bx
pop cx
pop ax
ret
code ends
end start
六、设计总结
本次课程设计为《系统日期时间显示在屏幕右上角》,我们要了解汇编的基本用法及功能,而且在我们必须要了解汇编的一些循环指令,因为日期时间是以不断变化,只能用循环语句来控制,而且到哪种场合下运行程序都能显示正确的日期和时间我们不能把虚伪的造出来,还有在把显示的系统日期和时间要显示在屏幕的右上角,我们还要把调坐标和显示日期和时间时日期与时间的之间的符号等…
经过这次课程设计,我收获的很多,以前我不知道对有些指令和代码的用法和表示的含义,但这次我在课程设计中我们互相讨论,互相学习,坚持不懈的自己动手试几次,就能把一些自己想得到目标也并不是很难,但我对汇编的一些指令和代码的疑问也更多了现在一般都用在硬件层,对硬件直接控制,其他的都用高级的语言编写了,因为汇编写程序容易出错,而且太过于复杂和代码有点长了,虽然引入了其他的有类似其它语言的一些代码,但是相比高级语言可以解决的问题都不用汇编了。好像现在的计算机已经增加了对还是的语言支持了,就是开集的引导程序已经不用汇编了。
在本次课程设计中我收获的很多,我不管以后要不要学汇编的编程,但我对汇编的兴趣和学汇编的好处是常常存在的,我就把以后的生或中像本次实验那样学到的东西要灵活地用得到,在各种不同的场合中用我们所学过的不同的知识来解决不同的问题
六、参考文献
1、汇编语言程序设计(第二版)
2、雷印胜 秦然 贾萍编著的《汇编语言程序设计》第二版
大连理工大学出版社。
3、潘弘喆 曲维新编著的《汇编语言程序设计习题解答》
大连理工大学出版社。
4、参考网站:
http://hi.baidu.com/xun1573/blog/category/%BB%E3%B1%E0%D3%EF%D1%D4