zoukankan      html  css  js  c++  java
  • 学 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
    
  • 相关阅读:
    DP——斜率优化
    题解报告——数三角形
    题解报告——货车运输
    题解报告——油滴扩展
    题解报告——程序补丁
    题解报告——奖励关
    用bitset解决背包问题
    题解报告——矩阵操作
    题解报告——数列
    题解报告——窗口的星星
  • 原文地址:https://www.cnblogs.com/del/p/1703689.html
Copyright © 2011-2022 走看看