HITEA 版 (精华区)
发信人: hfl (凤凰·风中轻舞), 信区: HITEA
标 题: Win32汇编语言(七)
发信站: 哈工大紫丁香 (2002年04月02日21:24:43 星期二), 站内信件
七、控制台Win32汇编语言程序
学习过Win32SDK编程的读者一定知道控制台Win32应用程序,控制台Win32应用程序
运行在控制台(MS-DOS窗口)下,与DOS下的C语言程序十分相似,程序入口点是
main函数,使用标准C语言I/O函数进行I/O,也可以调用API。实际上控制台
Win32应用程序与普通Win32应用程序没有本质上的区别,标准C语言I/O函数实际
上还是调用了API,在控制台上进行I/O。控制台Win32汇编语言程序与C语言程序
有一定的差别,需要获取控制台I/O句柄,然后使用控制台I/O句柄进行I/O(与
文件句柄I/O相似),笔者以MASM 6.11中自带的控制台Win32汇编语言程序实例(
HELLO.ASM)为例,程序如下:
.386
.MODEL flat, stdcall
STD_OUTPUT_HANDLE EQU -11
GetStdHandle PROTO NEAR32 stdcall,
nStdHandle:DWORD
WriteFile PROTO NEAR32 stdcall,
hFile:DWORD, lpBuffer:NEAR32, nNumberOfBytesToWrite:DWORD,
lpNumberOfBytesWritten:NEAR32, lpOverlapped:NEAR32
ExitProcess PROTO NEAR32 stdcall,
dwExitCode:DWORD
.STACK 4096
.DATA
msg DB "Hello, world.", 13, 10
written DD 0
hStdOut DD 0
.CODE
_start:
INVOKE GetStdHandle,
STD_OUTPUT_HANDLE ; Standard output handle
mov hStdOut, eax
INVOKE WriteFile,
hStdOut, ; File handle for screen
NEAR32 PTR msg, ; Address of string
LENGTHOF msg, ; Length of string
NEAR32 PTR written, ; Bytes written
0 ; Overlapped mode
INVOKE ExitProcess,
0 ; Result code for parent process
PUBLIC _start
END
汇编连接本程序的命令如下:
ml /c /coff /Cp hello.asm
link /subsystem:console /entry:_start hello.obj kernel32.lib
连接命令中/subsystem:console选项表示连接器生成控制台Win32应用程序。在MS-
DOS窗口(控制台)下运行汇编连接后生成的HELLO.EXE文件,将会像MS-DOS程序一
样显示出“Hello, world.”字符串。
本程序调用了GetStdHandle函数获取标准控制台输出设备句柄,然后调用
WriteFile函数向标准控制台输出设备句柄写字符串,完成控制台字符串输出,最
后调用了ExitProcess函数终止程序的执行。
--
吃在肚子里的才是饭
穿在身上的才是衣
送给爱人的才是花
真心疼你的才是妻
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.253]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.683毫秒