打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
学 Win32 汇编[4]: 使用 Debug 输出测试结果
由于 Debug 输出是使用的标准的 Win32 窗口, 所以 include 和 includelib 的文件较多.

这样建立工程时就不需要是控制台程序了, 工程建立方法:
文件 -> 新建工程 -> 工程类型: Win32 App (no res) ...

PrintString: 输出字符串变量
; Test4_1.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    szText db 'Hello World!', 0.codestart:    PrintString szText  ;Hello World!    retend start

PrintText: 直接输出字符串
; Test4_2.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codestart:    PrintText 'Hello World!'  ;Hello World!    retend start

PrintStringByAddr: 根据字符串地址输出字符串
; Test4_3.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    szText db 'Hello World!', 0    .codestart:    PrintStringByAddr offset szText  ;Hello World!        mov eax, offset szText    PrintStringByAddr eax            ;Hello World!    retend start

PrintLine: 输出一行线
; Test4_4.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    szText db 'Hello World!', 0    .codestart:    PrintLine           ;----------------------------------------    PrintString szText  ;Hello World!    PrintLine           ;----------------------------------------    retend start

PrintDec: 输出 8-32 位的十进制整数
; Test4_5.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    v1 db 127    v2 db -128    v3 dw 32767    v4 dw -32768    v5 dd 2147483647    v6 dd -2147483648    .codestart:    PrintDec v1  ;127    PrintDec v2  ;-128    PrintDec v3  ;32767    PrintDec v4  ;-32768    PrintDec v5  ;2147483647    PrintDec v6  ;-2147483648        ;它还可以有第二个文本参数    PrintDec v1, 'Other Text'  ;127, Other Text    retend start

PrintHex: 输出 8-32 位的十进制整数
; Test4_6.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    v1 db 127    v2 db -128    v3 dw 32767    v4 dw -32768    v5 dd 2147483647    v6 dd -2147483648    .codestart:    PrintHex v1  ;7F    PrintHex v2  ;80    PrintHex v3  ;7FFF    PrintHex v4  ;8000    PrintHex v5  ;7FFFFFFF    PrintHex v6  ;80000000        ;它还可以有第二个文本参数    PrintHex v1, 'Other Text'  ;7F, Other Text    retend start

PrintDouble: 输出双精度浮点数
; Test4_7.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    v1 real8 3.14    .codestart:    PrintDouble v1                ;3.14        ;它还可以有第二个文本参数    PrintDouble v1, 'Other Text'  ;3.14, Other Text    retend start

Spy..StopSpy: 跟踪变量(变量必须是 8-32 位整数)
; Test4_8.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    val dd 0    .codestart:    Spy val    mov val, 2  ;2    add val, 3  ;5    sub val, 1  ;4    shl val, 1  ;8    StopSpy        retend start

DumpMem: 查看内存
; Test4_9.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    szText db 'ABCDEFG', 0    num    dd 13579ACEh.codestart:    DumpMem offset szText, 4  ;41 42 43 44    DumpMem offset szText, 7  ;41 42 43 44 45 46 47        DumpMem offset num, 4     ;CE 9A 57 13        ;它也可以有个文本参数    DumpMem offset num, 4, 'txt'    retend start

DbgDump: 类似 DumpMem, 更适合查看文本
; Test4_10.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    szText db 'ABCDEFG', 0    num    dd 13579ACEh.codestart:    DbgDump offset szText, 4     ;41 42 43 44 - ABCD    DbgDump offset szText, 7     ;41 42 43 44 45 46 47 - ABCDEFG        DbgDump offset num, 4        ;CE 9A 57 13    ;它也可以有个文本参数    DbgDump offset num, 4, 'txt'    retend start

需要注意的是 debug.inc 提供的这些宏指令都是区分大小写的.

还有更多指令可参见帮助: \RadASM\masm32\help\VKDebug.chm(帮助内容不是很全)
或直接查看 \RadASM\masm32\include\debug.inc

它还包括一个非常有用的宏 CTEXT, 这在用 invoke 调用有字符串参数的函数时非常方便.
使用 CTEXT 可以把前面那个 "最简单的 Win32 程序" 修改如下:
; Test4_11.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    debug.incincludelib kernel32.libincludelib debug.libinclude    user32.incincludelib user32.lib.codestart:    invoke MessageBox, NULL, CTEXT("Hello World!"), CTEXT("Hi"), MB_OK    invoke ExitProcess, NULLend start




J:\RadASM\Masm\Bin\LINK.EXE /SUBSYSTEM:WINDOWS /LIBPATH:"J:\RadASM\Masm\Lib" /OUT:"Test4_1.exe" "Test4_1.obj"
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

LINK : fatal error LNK1104: cannot op...

这个问题应该是由于debug.inc,和debug.lib引起的库路径问题。如何解决呢?如果你的工程目录在默认的C:\RadAsm\masm\projects也就是C盘,你就把C:\RadAsm\masm32这个目录复制到c盘的根目录,如果你的工程文件在其它盘,你就把C:\RadAsm\masm32这个目录复制到其它盘的根目录就行了。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
学 Win32 汇编[28]---跳转指令
学 Win32 汇编[17]: 关于压栈(PUSH)与出栈(POP) 之一
学 Win32 汇编[29]
汇编环境搭建 -- MASM32
ImpLib SDK Guide
汇编中参数的传递和堆栈修正
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服