文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 555
阅读 7
收藏 0

在熟悉指令、伪指令和汇编语法的过程中, 首先需要的是输出显示的手段.

我刚开始学习时使用的是控制台输出, 最后发现既然是 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

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2010/04/03/1703689.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
[Beautifulzzzz的博客目录] 快速索引点这儿O(∩_∩)O~~,红色标记的是不错的(⊙o⊙)哦~

3D相关开发 [direct-X] 1、direct-X最小框架 [OpenGL] 1、环境搭建及最小系统 [OpenGL] 2、企业版VC6.0自带的Win32-OpenGL工程浅析 51单片机 [51单片机] 1602液晶显示控制代码 [51单片机] 1...

史迪奇2号
2017/08/01
0
0
win32汇编和x64汇编?

win32汇编升到winx64汇编,转型容易吗?我指的是会win32汇编,还学x64汇编吗?我是初学,能不能直接学x64汇编语言,请推荐本书?

IIOWE
2014/10/01
833
3
为什么破解要学win32汇编?

听说破解要学win32汇编,写壳也要用win32汇编?为什么呢?不学不能学破解吗?

IIOWE
2014/10/02
2.3K
13
Win32汇编开发环境介绍和RadAsm简明教程

Win32汇编开发环境介绍和RadAsm简明教程 现在很多朋友都在学习汇编语言,一方面汇编语言是大学计算机课程的必修课,另一方面则是为了从其它语言转到汇编语言来,无论什么原因,我认为学习汇编...

nothingfinal
2009/08/01
0
0
王小波的计算机水平到底有多好?

原文出处:知乎 导读:有网友在知乎上提问: 王小波的计算机水平到底有多好,在王小波自己的小说中,王小波非常骄傲地说,写书的软件都是自己编写的,王小波是自学的还是教的?都会什么语言?...

知乎
2017/05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源

背景 随着应用越来越复杂,依赖越来越多,日志系统越来越混乱,有时会出现一些奇怪的日志,比如: [] [] [] No credential found 那么怎样排查这些奇怪的日志从哪里打印出来的呢?因为搞不清...

hengyunabc
今天
1
0
home hosts

home hosts lwk@qwfys:~$ cat /etc/hosts127.0.0.1 localhost127.0.1.1 qwfys192.168.56.101vm600.qwfys.com39.108.212.91alpha1.ppy.com39.108.117.122alpha2.p......

qwfys
今天
1
0
大数据教程(6.1)hadoop生态圈介绍及就业前景

1. HADOOP背景介绍 1.1、什么是HADOOP 1.HADOOP是apache旗下的一套开源软件平台 2.HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 3.HADOOP的核心组...

em_aaron
今天
4
0
hadoop垃圾回收站

在生产生,hdfs回收站必须是开启的,一般设置为7天。 fs.trash.interval 为垃圾回收站保留时间,如果为0则禁用回收站功能。 fs.trash.checkpoint.interval 回收站检查点时间,一般设置为小于...

hnairdb
昨天
3
0
腾讯与Github的魔幻会面背后的故事…

10月22日,腾讯开源管理办公室有幸邀请到Github新晋CEO Nat Friedman,前来鹅厂参观交流。目前腾讯已经有近70个项目在Github上开源,共获得17w stars,世界排名11位。Github是腾讯开源的主阵...

腾讯开源
昨天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部