您的位置:首页 > 其它

学 Win32 汇编[3]: 控制台下的几种输出方式

2010-04-03 14:25 746 查看
在熟悉指令、伪指令和汇编语法的过程中, 首先需要的是输出显示的手段.

我刚开始学习时使用的是控制台输出, 最后发现既然是 Win32 汇编还是用 Debug 输出更好.

下面是之前尝试出的控制台输出的几种办法:

1、使用 MASM 提供的 StdOut 函数;

2、使用系统 API:

3、使用微软 C 标准库 msvcrt.dll 中的 printf 函数.

使用 MASM 的 StdOut 函数:
; Test3_1.asm
; 测试代码前应先建立一个控制台工程: 文件 -> 新建工程 -> Console App ...

.386
.model flat, stdcall

include masm32.inc
include kernel32.inc
includelib masm32.lib
includelib kernel32.lib

.data
szText db "Hello World!", 0

.code
start:
invoke StdOut, addr szText
ret ;ret 是用于子程序返回的指令, 这里用它代替 ExitProcess(在没有生成 Win32 窗口时是可以的)
end start


使用系统 API 函数:
; Test3_2.asm

.386
.model flat, stdcall

include windows.inc
include kernel32.inc
includelib kernel32.lib

.data
szText db 'Hello World!', 0

;定义两个 DWORD 类型的变量, 分别是用于输出句柄和字符串长度
.data?
hOut dd ?
len  dd ?

.code
start:
; 获取控制台输出设备的句柄, 其返回值会放在 eax 寄存器
invoke GetStdHandle, STD_OUTPUT_HANDLE
; 把获取到的句柄给变量 hOut
mov hOut, eax
; 通过 lstrlen 函数获取字符串长度, 返回值在 eax
invoke lstrlen, addr szText
; 把获取到的字符串长度给变量 len
mov len, eax
; 输出到控制台, 参数分别是: 句柄、字符串地址、字符串长度; 后面是两个指针暂用不到
invoke WriteFile, hOut, addr szText, len, NULL, NULL
ret
end start

; 另外前面用到的 StdOut 也基本就是这样实现的, 源码在: masm32\m32lib\stdout.asm


使用微软 C 标准库中的 printf 函数; msvscrt.inc 把它声明做 crt_printf
; Test3_3.asm

.386
.model flat, stdcall

include msvcrt.inc
includelib msvcrt.lib

.data
szText db 'Hello World!', 0

.code
start:
invoke crt_printf, addr szText
ret
end start


三种方法相比之下, 应推荐使用 C 函数 crt_printf; 因为它可以方便输出更多数据类型, 如:
; Test3_4.asm

.386
.model flat, stdcall

include msvcrt.inc
includelib msvcrt.lib

.data
szFmt db 'EAX=%d; ECX=%d; EDX=%d', 0

.code
start:
mov eax, 11
mov ecx, 22
mov edx, 33
invoke crt_printf, addr szFmt, eax, ecx, edx
ret
end start
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: