首页 > 汇编语言 > 汇编语言MS-Windows编程
阅读:2,482
汇编语言WriteConsole和WriteConsoleOutputCharacter函数:控制台输出
本节将为大家讲解如何直接调用 Win32 函数在控制台输出,如 WriteConsole 和 WriteConsoleOutputCharacter。直接调用要求了解更多细节,但是它也提供了比 Irvine32 链接库过程更大的灵活性。
字符串不一定以空字节结束。函数原型如下:
数据结构
有些 Win32 控制台函数使用的是预定义的数据结构,包括 COORD 和 SMALL_RECT。COORD 结构包含的是控制台屏幕缓冲区内字符单元格的坐标。坐标原点(0, 0)位于左上角单元格:
COORD STRUCT
X WORD ?
Y WORD ?
COORD ENDS
SMALL_RECT STRUCT
Left WORD ?
Top WORD ?
Right WORD ?
Bottom WORD ?
SMALL_RECT ENDS
WriteConsole 函数
函数 WriteConsole 在控制台窗口的当前光标所在位置写一个字符串,并将光标留着字符串末尾右边的字符位置上。它按照标准 ASCII 控制字符操作,比如制表符、回车和换行。字符串不一定以空字节结束。函数原型如下:
WriteConsole PROTO,
hConsoleOutput:HANDLE,
lpBuffer:PTR BYTE,
nNumberOfCharsToWrite:DWORD,
lpNumberOfCharsWritten:PTR DWORD,
lpReserved:DWORD
示例程序:Console1
下面的程序通过向控制台窗口写字符串演示了函数 GetStdHandle、ExitProcess 和 WriteConsole:; Win32 控制台示例 #1 (Consolel.asm) ; 本程序调用如下 Win32 控制台函数: ; GetStdHandle, ExitProcess, WriteConsole INCLUDE Irvine32.inc .data endl EQU <0dh,0ah> ; 行结尾 message LABEL BYTE BYTE "This program is a simple demonstration of " BYTE "console mode output, using the GetStdHandle " BYTE "and WriteConsole functions.", endl messageSize DWORD ($-message) consoleHandle HANDLE 0 ; 标准输出设备句柄 bytesWritten DWORD ? ; 输出字节数 .code main PROC ; 获得控制台输出句柄 INVOKE GetStdHandle, STD_OUTPUT_HANDLE mov consoleHandle,eax ; 向控制台写一个字符串 INVOKE WriteConsole, consoleHandle, ; 控制台输出句柄 ADDR message, ; 字符串指针 messageSize, ; 字符长度 ADDR bytesWritten, ; 返回输出字节数 0 ; 未使用 INVOKE ExitProcess,0 main ENDP END main程序生成输出如下所示:
WriteConsoleOutputCharacter 函数
函数 WriteConsoleOutputCharacter 从指定位置开始,向控制台屏幕缓冲区的连续单元格内复制一组字符。原型如下:
WriteConsoleOutputCharacter PROTO,
hConsoleOutput:HANDLE, ;控制台输出句柄
lpCharacter :PTR BYTE, ;缓冲区指针
nLength: DWORD, ;缓冲区大小
dwWriteCoord: COORD, ;第一个单元格的坐标
lpNumberOfCharsWritten: PTR DWORD ;输出计数器