字符串对于每一个程序都是非常重要的, 在masm里面如果利用好字符串宏, 那写代码就非常舒服和方便了, 这几个字符串宏是我平时使用的非常多的宏, 包括Unicode宏, 我以前一直觉得非常遗憾, 不过有了这个宏, 就不是问题了!

 

因为masm不支持中文的Unicode, 我曾经也想自己写一个编码转换的宏, 不过一直觉得会比较麻烦. 后来在csdn偶得一大牛写的宏, 真是佩服啊, 呵呵不但有支持Unicode的字符串宏, 还有很多好用的支持SSSE3,SSE4的宏. 非常的给力! 可以在这里下载 UnicodeString

看看这个试用代码, 和C语言的字符串定义也是不相上下啊, 而且不乏汇编的灵活, 多舒服啊!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
	Include JoenWin.inc

	.Data
String		"\\\\Device\\\\devVirtToPhys", MyString, 4

MyUString	UString	('This is not a star.',10,13,"这不是一颗流星",0)

StUString	"\\\\Device\\\\devVirtToPhys", g_StUStringName, 4 

	.Code
Jmain	Proc	

	pushad
;===========================================================================
	;定义Unicode类型的字符串
	mov	eax, UString$('This is not a star.',10,13,"这不是一颗流星",0)
	mov	ecx, offset MyUString
;===========================================================================
	;定义普通Ascii类型的字符串, 这个支持\\t\\nC语言那些格式符号
	mov	ebx, String$( "helll\\t\\n", MyString2, 4 )
	mov	eax, offset MyString
;===========================================================================
	;定义内核编程说需要的Unicode结构类型
	mov	ecx, offset g_StUStringName
	mov	edx, StUString$( "\\\\Device\\\\devVirtToPhys", g_StUStringName2, 4  )
;===========================================================================
	popad
	mov	eax, -1
	ret
Jmain 	Endp

End	Jmain

最上面那个UString$是定义Unicode的, 这个非常给力, 支持中文, 以后汇编就避免了这个比支持Unicode的问题了,关于这个宏,是从CSDN上down来的, 我只是修改了下名称, 统一方便使用而已, 当然压缩包里面有他们公司的信息, 我就不多说了. 第二个是普通的我们一般写代码使用Ascii码的时候用的非常多, 第3个是内核里面使用结构定义Unicode字符串使用的, 这个修改自 Kernel Mode Driver KMD开发包中的, 作者当然是个大牛, 不过写代码的风格好像和国人不太一样, 国人受罗云彬的影响很深, 很多人的代码风格都趋向于罗云彬.. 当然说这个就扯远了..

相信有了这几个字符串宏, 写代码会更加舒服的, 其实我说的不是很多, 关于里面宏的代码实现我也没有提到,我想如果你有兴趣的话. 会自己去看看的.

对了还有那个String.mac宏文件中的已经被翻译成中文了, 也不是我翻译的, 没有前人的工作. 哪有小辈们的今天啊. 哈哈哈!!

你可以使用转义字符, 和C语言的有些区别, 主要是被汇编的宏函数所限制

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
esc. char.     code         symbol
--------------------------------------------------
\:         21h            '!'
\{         28h            '('
\}         29h            ')'
\[         3Ch            '<'
\]         3Eh            '>'
\=         22h            '"'
\-         27h            "'"
\\         5Ch            '\'
\*          -              -   ;; To workaround "CopyFile" -> CopyFileA problem
\0          0             zero byte/word
\a          7             alert (BEL)
\b          8             backspace
\t          9             horizontal tabulation
\n         0Dh, 0Ah       new line
\l         0Ah            line feed
\v         0Bh            verticalal tabulation
\f         0Ch            formfeed
\r         0Dh            carrige return