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)
页面执行时间:7.718毫秒