控制台输出就象dos下的输出,可不是图形界面。象ping/ipconfig/ftp等命令都是这类程序。
回忆过去,在dos下进行文件操作时,常用到“文件把柄”的概念,使用文件把柄操作时,非常方便,操作时,只要知道把柄号就可以,而不用操心文件的位置。dos下,设备也都有自己的专用把柄,这些把柄是: 逆风者 0000H标准输入设备 (stdin) 0001H标准输出设备 (stdout) 0002H标准错误设备 (stderr) 0003H标准辅助设备 (stdaux) 0004H标准打印设备 (stdprn)
stdin和stdout可以被再定向,dos下常用的“输入改向”和“输出改向”就是这个意思。
下面的dos功能调用中将向屏幕输出信息: mov ah,40h;写到文件或设备 mov bx,1;标准输出设备 lea dx,OutData;DS:DX->要输出的数据 mov cx,Count;要输出字符的个数 int 21h ;执行dos功能调用
利用同样的道理,在windows下,也可向屏幕输出信息。这要用到两个Api函数,一个是GetStdHandle,另一个是WriteFile,在Win32 developer's References中它们是这样定义的: ------------------------------------------------------------ HANDLE GetStdHandle( DWORD nStdHandle// input, output, or error device );
The GetStdHandle function returns a handle for the standard input, standard output, or standard error device.
nStdHandle->Specifies the device for which to return the handle. This parameter can have one of the following values: Value | Meaning -------------------- --------------------------- STD_INPUT_HANDLE| Standard input handle STD_OUTPUT_HANDLE | Standard output handle STD_ERROR_HANDLE| Standard error handle
If the function succeeds, the return value is a handle of the specified device. ------------------------------------------------------------ BOOL WriteFile( HANDLE hFile, // handle to file to write to LPCVOID lpBuffer, // pointer to data to write to file DWORD nNumberOfBytesToWrite,// number of bytes to write LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written LPOVERLAPPED lpOverlapped // pointer to structure needed for overlapped I/O );
=============================================================
;下面我们看一个程序,作用是显示一个字符串信息!
.386 .model flat,stdcall option casemap:none
include windows.inc
include kernel32.inc include user32.inc
includelib kernel32.lib includelib user32.lib
.data messdb 'How are you !',0;要显示的信息
.data? StdOutdd ?;存放标准输出的把柄 CharOut dd ?;记录实际输出的字符数
.code start: invoke GetStdHandle,STD_OUTPUT_HANDLE ;获取标准输出的把柄 mov StdOut,eax;保存把柄号
lea eax,mess invoke lstrlen,eax;求字符串的长度
lea ecx,CharOut invoke WriteFile,StdOut,addr mess,eax,ecx,NULL;写文件
invoke ExitProcess,NULL ;程序结束 end start -------------------------------------------------------------- 编译链接,下面给出详尽的信息,供分析参考: D:\MASM7>dir /ad
Volume in drive D has no label Volume Serial Number is 18F0-186B Directory of D:\MASM7
.〈DIR〉02-12-0317:36 . .. 〈DIR〉02-12-0317:36 .. LIB〈DIR〉 02-12-0317:38 LIB INCLUDE〈DIR〉02-12-0317:38 INCLUDE 0 file(s)0 bytes 4 dir(s) 2,411,925,504 bytes free
D:\MASM7>ml /coff /I include 4.asm /link /subsystem:console /libpath:lib Microsoft (R) Macro Assembler Version 6.14.8444 └─ 控制台程序 Copyright (C) Microsoft Corp 1981-1997.All rights reserved.
Assembling: 4.asm Microsoft (R) Incremental Linker Version 5.12.8078 Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
本文章更多内容:1 - 2 - 下一页>> |