由于 Debug 输出是使用的标准的 Win32 窗口, 所以 include 和 includelib 的文件较多.

这样建立工程时就不需要是控制台程序了, 工程建立方法:

文件 -> 新建工程 -> 工程类型: Win32 App (no res) …

——————————————————————————–

PrintString: 输出字符串变量

; Test4_1.asm
.386
.model flat, stdcall
include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
.data
   szText db 'Hello World!', 0
.code
start:
   PrintString szText  ;Hello World!
   ret
end start

——————————————————————————–

PrintText: 直接输出字符串

; Test4_2.asm
.386
.model flat, stdcall
include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
.code
start:
   PrintText 'Hello World!'  ;Hello World!
   ret
end start

——————————————————————————–

PrintStringByAddr: 根据字符串地址输出字符串

; Test4_3.asm
.386
.model flat, stdcall
include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
.data
   szText db 'Hello World!', 0
   
.code
start:
   PrintStringByAddr offset szText  ;Hello World!
   
   mov eax, offset szText
   PrintStringByAddr eax            ;Hello World!
   ret
end start

——————————————————————————–

PrintLine: 输出一行线

; Test4_4.asm
.386
.model flat, stdcall
include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
.data
   szText db 'Hello World!', 0
   
.code
start:
   PrintLine           ;----------------------------------------
   PrintString szText  ;Hello World!
   PrintLine           ;----------------------------------------
   ret
end start

——————————————————————————–

PrintDec: 输出 8-32 位的十进制整数

; Test4_5.asm
.386
.model flat, stdcall
include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
.data
   v1 db 127
   v2 db -128
   v3 dw 32767
   v4 dw -32768
   v5 dd 2147483647
   v6 dd -2147483648
   
.code
start:
   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
   ret
end start

——————————————————————————–

PrintHex: 输出 8-32 位的十进制整数

; Test4_6.asm
.386
.model flat, stdcall
include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
.data
   v1 db 127
   v2 db -128
   v3 dw 32767
   v4 dw -32768
   v5 dd 2147483647
   v6 dd -2147483648
   
.code
start:
   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
   ret
end start

——————————————————————————–

PrintDouble: 输出双精度浮点数

; Test4_7.asm
.386
.model flat, stdcall
include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
.data
   v1 real8 3.14
   
.code
start:
   PrintDouble v1                ;3.14
   
   ;它还可以有第二个文本参数
   PrintDouble v1, 'Other Text'  ;3.14, Other Text
   ret
end start

——————————————————————————–

Spy..StopSpy: 跟踪变量(变量必须是 8-32 位整数)

; Test4_8.asm
.386
.model flat, stdcall
include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
.data
   val dd 0
   
.code
start:
   Spy val
   mov val, 2  ;2
   add val, 3  ;5
   sub val, 1  ;4
   shl val, 1  ;8
   StopSpy
   
   ret
end start

——————————————————————————–

DumpMem: 查看内存

; Test4_9.asm
.386
.model flat, stdcall
include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
.data
   szText db 'ABCDEFG', 0
   num    dd 13579ACEh
.code
start:
   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'
   ret
end start

——————————————————————————–

DbgDump: 类似 DumpMem, 更适合查看文本

; Test4_10.asm
.386
.model flat, stdcall
include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib
.data
   szText db 'ABCDEFG', 0
   num    dd 13579ACEh
.code
start:
   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'
   ret
end start

——————————————————————————–

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

还有更多指令可参见帮助: \RadASM\masm32\help\VKDebug.chm(帮助内容不是很全)

或直接查看 \RadASM\masm32\include\debug.inc

——————————————————————————–

它还包括一个非常有用的宏 CTEXT, 这在用 invoke 调用有字符串参数的函数时非常方便.

使用 CTEXT 可以把前面那个 “最简单的 Win32 程序” 修改如下:

; Test4_11.asm
.386
.model flat, stdcall
include    windows.inc
include    kernel32.inc
include    debug.inc
includelib kernel32.lib
includelib debug.lib
include    user32.inc
includelib user32.lib
.code
start:
   invoke MessageBox, NULL, CTEXT("Hello World!"), CTEXT("Hi"), MB_OK
   invoke ExitProcess, NULL
end start

打赏