`
zzc1684
  • 浏览: 1235065 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

相关推荐

    OllyDbg OD WIN7下可以用的OD

    5. **OllyDbg版本**:使用针对Windows 7优化的OllyDbg版本,这可能是描述中提到的"WIN7下可用的OD",这意味着它已经过测试,可以在Windows 7环境下稳定运行。 6. **第三方插件**:有些插件可能不兼容Windows 7,...

    MySQL下载与安装[汇编].pdf

    4. 在命令行环境下,使用"mysqld-nt -install"命令将MySQL服务添加到Windows XP的服务中,这样就可以通过服务管理器控制MySQL的启动和停止。 5. 使用"net start mysql"启动服务,"net stop mysql"停止服务。 6. 如果...

    Visual C++ /TC 串口通信编程实践.rar(源代码)

    串口通信是计算机通信的一种常见方式,尤其在嵌入式系统、工业控制以及设备间的数据交换中广泛使用。通过串口,两台设备可以共享数据,即使它们可能相距较远。在Visual C++和Turbo C++中实现串口通信,主要涉及到...

    vc++ 应用源码包_3

    win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属...

    AO系统操作演示PPT教案.pptx

    3. 支持最新会计核算软件数据接口国家标准,提供数据库采集方式下对辅助核算信息的采集。 4. 提升对财务和业务数据的分析处理功能,优化数据存储和管理,扩展辅助工具。 5. 借助金审工程安全客户端系统,保障数据...

    基于Qt/Embedded的GUI应用程序的实现

    本文将介绍几种常见的嵌入式Linux GUI系统。 1. **MiniGUI**:MiniGUI是一种轻量级的GUI系统,可在Linux控制台上运行。它基于SVGALib和Linux Thread库,支持多窗口操作,具有类Windows 98风格的图形用户界面。...

    vc++ 应用源码包_6

    win32情况下实现媒体播放。 preemptivepopupkiller C#源码,实现简单游览器。 RangeScan扫描器源代码 ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用...

    vc++ 应用源码包_1

    win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属...

    vc++ 应用源码包_5

    win32情况下实现媒体播放。 preemptivepopupkiller C#源码,实现简单游览器。 RangeScan扫描器源代码 ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用...

    vc++ 应用源码包_2

    win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属...

    C#微软培训资料

    <<page 1>> page begin==================== 目 目目 目 录 录录 ...<<page 3>> page begin==================== ... 17.1 .Net 框架结构提供的 I/O 方式 .215 ...这一天 微软公司正式推出了其下一代...

    精易模块[源码] V5.15

    6、修复“网页_创建快捷方式”在win7以上系统不能自定义图标的BUG,感谢易友【蓝风】反馈。 7、修复“进制_十六到十”不支持长整数的BUG。 8、新增“类_时钟”,类似易语言自带时钟控件,可设置时钟周期。 MD5:E31C...

    会计理论考试题

    3.计算机病毒是一种对计算机系统具有破坏性的 ___D___ 。 A、高级语言编译程序 B、生物病毒 C、操作系统 D、计算机程序 4.把高级语言的源程序变为目标程序要经过 ___D__ 。 A、编译 B、编辑 C、汇编 D、解释 5.声音...

    编程及C&C++初学者 FAQ.pdf

    计算机是一种电子设备,能够接收输入、处理数据并产生输出。它由硬件(如CPU、内存)和软件(操作系统、应用软件)组成。 ##### 程序到底是怎么回事 程序是由一系列指令组成的,这些指令告诉计算机如何执行特定的...

Global site tag (gtag.js) - Google Analytics