代码来自于《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
分享到:
相关推荐
其实,任何汇编语言都是和操作系统密切相关的,不管是DOS汇编、Win32汇编,还是Linux汇编,都是基于特定的操作系统的,如果一定要绕过操作系统,那么就不会有DOS汇编和Win32汇编的区别了,但是这样的话我们不是在学...
本课程设计是在学完教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。 设计题目:打字计时...
单片机(汇编语言)秒表课程设计设计全文共14页,当前为第1页。单片机(汇编语言)秒表课程设计设计全文共14页,当前为第1页。 单片机(汇编语言)秒表课程设计设计全文共14页,当前为第1页。 单片机(汇编语言)秒表课程...
该文件包含:程序、代码、实验报告。 实验要求:1.从键盘输入闹铃时间(如2分钟) 2.程序开始记时,并在屏幕上显示时间(如00:00:01)并实时刷新 3.时间到,则发出闹铃声,声音维持数秒;同时时间停止刷新 4.能...
加强对单片机和汇编语言的认识,充分掌握和理解设计各部分的工作原理、设计过程、模块化编程等多项知识。学会用单片机模拟实现具体应用,使个人设计能够真正使用。提高利用已学知识分析和解决问题的能力,把理论知识...
显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器 Java编写的HTML浏览器源代码,一个很简单甚至不算是浏览器的HTML浏览器,使用方法: 可...
包括系统具体的硬件设计方案,软件流程图和部分汇编语言 程序等方面。在负载范围内, 只需通过简单的级联就可以对显示屏进行扩展,是一种成本低廉的图文显示方案。 2 方案设计 按照系统设计的功能的要求,采用动态扫描...
14、改善“程序_禁止重复运行”当标识为空时,默认为自身路径,代码由易友【@wjt741106】提供。 15、改善“普通填表类-就绪判断_源码关键字”添加区分大小写参数。 MD5: 3C01272B9E2DAFDEF08D20C191E3C265 精易模块...
计算机科学与技术专业毕业设计选题参考 一、毕业设计选题范围 计算机专业毕业设计选题范围包括:...多路径路由算法的研究与分析 "86.Linux内核代码分析 " "87.网络管理协议分析 "88.免疫算法在信息安全领域的研
计算机科学与技术专业毕业设计选题参考 一、毕业设计选题范围 计算机专业毕业设计选题范围包括:...多路径路由算法的研究与分析 "86.Linux内核代码分析 " "87.网络管理协议分析 "88.免疫算法在信息安全领域的研
计算机科学与技术专业毕业设计选题参考 计算机科学与技术专业毕业设计选题参考 一、毕业设计选题范围 计算机专业毕业设计选题范围包括:...多路径路由算法的研究与分析 "86.Linux内核代码分析 " "87.网络管理协议分