文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 555
阅读 7
收藏 0
点赞 0
评论 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
博文 2004
码字总数 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

win32汇编和x64汇编?

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

IIOWE ⋅ 2014/10/01 ⋅ 3

为什么破解要学win32汇编?

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

IIOWE ⋅ 2014/10/02 ⋅ 13

Win32汇编开发环境介绍和RadAsm简明教程

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

nothingfinal ⋅ 2009/08/01 ⋅ 0

王小波的计算机水平到底有多好?

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

知乎 ⋅ 2017/05/05 ⋅ 0

远程桌面控制VC源码剖析

一、引语 这是个VC6.0的远程桌面控制软件,主要功能是桌面控制、支持多种压缩方式、可调整网格空间数目以及色彩模式选择。源码我也不知道从何而来了,今天整理硬盘无疑间发现的。软件中作者没...

toil ⋅ 2012/08/08 ⋅ 5

ARM嵌入式开发中的GCC内联汇编简介

ARM嵌入式开发中的GCC内联汇编简介 嵌入式开发交流群280352802,欢迎加入! 在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了...

长平狐 ⋅ 2013/06/03 ⋅ 1

在MFC程序中增加控制台

在MFC程序中增加控制台 MFC程序中,如果想要输出调试信息,我们一般都是TRACE或者使用LOG文件,都不是很方便,第一个需要我们在调试状态下,第二个也要配置麻烦而且不直观。而使用Console来显...

智勇 ⋅ 2014/10/29 ⋅ 0

C:源文件编译过程

可以大致概括为3个阶段: 源文件 → 汇编代码(文本) 汇编代码 → 机器语言(二进制) 各个目标文件的处理 详细过程: 预编译处理 Pre-processing(.c/ .cpp → .i) 对源文件中的伪指令进行...

大鱼BIG_FISH ⋅ 2015/10/27 ⋅ 0

郁闷大了,请教 GCC版本支持64位汇编指令的问题

我正在对做内容更新。在处理clk计数器的时候,遇到个问题。 通过intel的rdtsc指令,是可以实现频率计数获取。这个是我一直用来测试算法性能使用的。通常系统的测试时间只能到毫秒。用rdtsc可...

中山野鬼 ⋅ 2012/04/09 ⋅ 4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

线程池

一、线程池:提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。 二、线程池的体系结构: java.util.concurrent.Executor : 负责线程的使用...

stars永恒 ⋅ 18分钟前 ⋅ 0

你值5K还是15K?实战案例,测测你的分析功力

本文源自陈老师遇到的真实案例。 老板说:“我们今年准备参加展会,做一年。以前我没参加过,没关系,这里有一份展会数据,你回去分析下哪些有价值,后边组织的时候有个指导”。现在你收到任...

加米谷大数据 ⋅ 19分钟前 ⋅ 0

中文转英文功能

package com.sysware.task.util;import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;import net.sourceforge.pinyin4j.for......

AK灬 ⋅ 20分钟前 ⋅ 0

JNI Java层类关联C/C++层的类

Android开发时,因为要实现某某功能,需要集成算法公司的算法库(so库),这就需要自己编写JNI。 通常这些库提供的接口可以概况成1、初始化 2、算法处理 3、释放 4、打印版本号 初始化后会返...

国仔饼 ⋅ 24分钟前 ⋅ 0

maven下载jar包改为阿里云的maven库

一:修改maven安装路径中conf文件夹下的setting.xml文件 <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/......

夜醒者 ⋅ 24分钟前 ⋅ 0

电商用户行为分析大数据平台相关系列10-基础数据结构分析

电商用户行为分析大数据平台相关系列1-环境介绍 电商用户行为分析大数据平台相关系列2-HADOOP环境搭建 电商用户行为分析大数据平台相关系列3-HIVE安装 电商用户行为分析大数据平台相关系列4...

xiaomin0322 ⋅ 25分钟前 ⋅ 0

使用readLine()方法遇到的坑

下午玩 TCP/IP 的 Socket 通信时,使用 BufferedReader 的 readLine() 遇到了一个坑,现在终于解决了,特此记录下来。 程序很简单,客户段从控制台读取用户输入,然后发送至服务器端,主要代...

孟飞阳 ⋅ 25分钟前 ⋅ 0

基于Hadoop集群的Hive安装配置(Derby数据库)

Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据,提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行(具体的Hive架构大家自行搜索)。接下来主要讲下Hadoop集群下...

海岸线的曙光 ⋅ 26分钟前 ⋅ 0

CoreOS裸机iso安装和相关配置

裸机通过iso安装CoreOS,个人趟了很多坑,以下就是完整的从零开始部署和配置的过程,希望对大家有用。 一、安装CoreOS到硬盘 1. 准备Live iso镜像,制作好usb启动盘 Live iso下载地址 2. 搭建...

ykbj ⋅ 31分钟前 ⋅ 0

jquery控制表格锁列(转)

表格已经完成后新加的需求,要实现锁表格的第一列。很多带这种效果的都是js封装的框架或者具体某种框架的组件,不适用解决当前问题。作为后端开发又实在不熟样式,搜到了一个可以用的,虽然样...

刘昌鑫 ⋅ 33分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部