`
qdujunjie
  • 浏览: 108705 次
  • 性别: Icon_minigender_1
  • 来自: Mars
社区版块
存档分类
最新评论

汇编语言显示系统时间代码分析(14)

阅读更多

 

代码来自于《Intel汇编语言程序设计》(第四版)第10章----结构和宏。

 

如果要显示系统时间,MS-Windows为我们提供了两个函数,用来设置光标位置的控制台函数和现实系统时间的函数。使用这两个函数之前,需要首先定义两个预定义的结构:

 

 

COORD STRUCT

           X WORD ?

           Y WORD ?

COORD ENDS

 

SYSTEMTIME STRUCT

       wYear WORD ?

       wMonth WORD ?

       wDayOfWeek WORD ?

       wDay WORD ?

       wHour WORD ?

       wMinute WORD ?

       wSecond WORD ?

       wMillisecond WORD ?

SYSTEMTIME ENDS

 

在原书中这两个结构体在SmallWin.inc文件中定义,而SmallWin.inc文件位于编译器的INCLUDE目录中,Irvine32.inc引用了SmallWin.inc文件。

 

我们来看看一下返回当前系统时间并在指定的屏幕位置显示的程序清单:

 

TITLE Structures                                (ShowTime.asm)

INCLUDE Irvine32.inc

.data

sysTime SYSTEMTIME <>

XYPos COORD <10,5>

consoleHandle DWORD ?

colonStr BYTE ":",0

 

.code

main PROC

; Get the standard output handle for the Win32 Console.

        INVOKE GetStdHandle , STD_OUTPUT_HANDLE

        mov consoleHandle, eax

; Set the cursor position and get the system time.

        INVOKE SetConsoleCursorPosition , consoleHandle , XYPos

        INVOKE GetLocalTime , ADDR sysTime

; Display the system time ( hh : mm : ss).

        movzx eax,sysTime.wHour                     ; hours

        call WriteDec

        mov edx,offset colonStr                          ; ":"

        call WriteString

        movzx eax,sysTime.wMinute                   ; Minutes

        call WriteDec

        mov edx,offset colonStr                          ; ":"

        call WriteString

        movzx eax,sysTime.wSecond                  ; Seconds

        call WriteDec

 

        call Crlf

        call Crlf

        call WaitMsg                                            ; "Press Enter..."

        exit

main ENDP

END main

 

 

程序中使用的定义来自于SmallWin.inc。

 

STD_OUTPUT_HANDLE EQU -11

SYSTEMTIME STRUCT . . . (参考以上的定义)

COORD STRUCT . . . (参考以上的定义)

GetStdHandle PROTO,

      nStdHandle:DWORD

 

GetLocalTime PROTO,

      lpSystemTime:PTR SYSTEMTIME

 

SetConsoleCursorPosition PROTO,

      nStdHandle:DWORD,

      coords:COORD

 

 

 

首先,要想获取系统时间,可以调用MS-Windows的GetLocalTime函数并向他传递SYSTEMTIME结构的地址:

 

.data

sysTime SYSTEMTIME <>

.code

INVOKE GetLocalTime , ADDR sysTime

 

此时,函数GetLocalTime 将把系统时间返回保存至sysTime中。

 

然后,就可以返回某一时间值,例如:

 

movzx eax,sysTime .wYear

call WriteDec

 

便返回了年的时间,并且打印出来。

 

 

当Win32程序想要产生屏幕输出时,需要调用GetStdHandle函数返回标准的控制台输出句柄(一个整数):

 

.data

consoleHandle DWORD ?

.code

INVOKE GetStdHandle , STD_OUTPUT_HANDLE

mov consoleHandle,eax

 

此时,调用GetStdHandle 函数,并传递STD_OUTPUT_HANDLE常量,将返回标准控制台的句柄到eax中。

 

得到标准输出句柄之后,接着要设置屏幕光标位置,可以调用MS-Windows的SetConsoleCursorPosition函数,这个函数需要一个控制台句柄和一个COORD结构变量作为参数:

 

.data

XYPos COORD <10,5>

.code

INVOKE SetConsoleCursorPosition,consoleHandle,XYPos

 

 

 在代码中使用的指令MOVZX (move with zero-extend)指令用于将源操作数的内容拷贝到目的操作数中,并将该值零扩展至16位或32位。该指令仅适用于无符号整数,例如:

 

mov        bx,0A69Bh

movzx    eax,bx          ; EAX = 0000A69Bh

movzx    edx,bl           ; EDX = 0000009Bh

movzx    cx,bl              ; CX = 009Bh

 

 

 

分享到:
评论

相关推荐

    windows环境下32位汇编语言程序设计

    其实,任何汇编语言都是和操作系统密切相关的,不管是DOS汇编、Win32汇编,还是Linux汇编,都是基于特定的操作系统的,如果一定要绕过操作系统,那么就不会有DOS汇编和Win32汇编的区别了,但是这样的话我们不是在学...

    汇编语言课程设计 打字计时练习

    本课程设计是在学完教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。 设计题目:打字计时...

    单片机(汇编语言)秒表课程设计设计.docx

    单片机(汇编语言)秒表课程设计设计全文共14页,当前为第1页。单片机(汇编语言)秒表课程设计设计全文共14页,当前为第1页。 单片机(汇编语言)秒表课程设计设计全文共14页,当前为第1页。 单片机(汇编语言)秒表课程...

    大学生汇编语言综合设计:小闹钟程序

    该文件包含:程序、代码、实验报告。 实验要求:1.从键盘输入闹铃时间(如2分钟) 2.程序开始记时,并在屏幕上显示时间(如00:00:01)并实时刷新 3.时间到,则发出闹铃声,声音维持数秒;同时时间停止刷新 4.能...

    仿真+代码+报告 四组灯(红黄绿)对应十字路口的四个方向,用两位的数码管显示剩余的时间 利用proteus画出仿真图

    加强对单片机和汇编语言的认识,充分掌握和理解设计各部分的工作原理、设计过程、模块化编程等多项知识。学会用单片机模拟实现具体应用,使个人设计能够真正使用。提高利用已学知识分析和解决问题的能力,把理论知识...

    JAVA上百实例源码以及开源项目源代码

    显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器  Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法:  可...

    单片机系统课程设计16×16-LED点阵.doc

    包括系统具体的硬件设计方案,软件流程图和部分汇编语言 程序等方面。在负载范围内, 只需通过简单的级联就可以对显示屏进行扩展,是一种成本低廉的图文显示方案。 2 方案设计 按照系统设计的功能的要求,采用动态扫描...

    精易模块[源码] V5.15

    14、改善“程序_禁止重复运行”当标识为空时,默认为自身路径,代码由易友【@wjt741106】提供。 15、改善“普通填表类-就绪判断_源码关键字”添加区分大小写参数。 MD5: 3C01272B9E2DAFDEF08D20C191E3C265 精易模块...

    计算机科学与技术专业毕业设计选题参考(2).doc

    计算机科学与技术专业毕业设计选题参考 一、毕业设计选题范围 计算机专业毕业设计选题范围包括:...多路径路由算法的研究与分析 "86.Linux内核代码分析 " "87.网络管理协议分析 "88.免疫算法在信息安全领域的研

    计算机科学与技术专业毕业设计选题参考(1).doc

    计算机科学与技术专业毕业设计选题参考 一、毕业设计选题范围 计算机专业毕业设计选题范围包括:...多路径路由算法的研究与分析 "86.Linux内核代码分析 " "87.网络管理协议分析 "88.免疫算法在信息安全领域的研

    (精品计算机科学与技术专业毕业设计选题参考.doc

    计算机科学与技术专业毕业设计选题参考 计算机科学与技术专业毕业设计选题参考 一、毕业设计选题范围 计算机专业毕业设计选题范围包括:...多路径路由算法的研究与分析 "86.Linux内核代码分析 " "87.网络管理协议分

Global site tag (gtag.js) - Google Analytics