中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 看雪学院专区 > Win32/Win64编程
Four-F高级字符串宏修正版
作者:thebutterfly 时间:2006-12-15 15:01 出处:pediy.com 责编:月夜寒箫
              摘要:Four-F高级字符串宏修正版
原版为Four-F版权所有, 修正及添加的内容为thebutterfly版权所有.转载请保留
这个宏原作者为Four-F(KmdKit的作者), 我试用后觉得效果不错, 但是这个宏中有一些Bug和缺憾, 所以我抽出一点时间做了修正, 同时又加上了不少新的内容, 这里提供给大家, 以方便大家的MASM编程
"原版"程序有4, 000多行, 做了修正后差不多有6, 000行了, 所以就不贴出, 大家可以从附件下载

使用说明:
(一)原作者说明概要
这个宏为方便在MASM的汇编源程序里定义字符串而设计, 可以方便的定义各式各样的字符串, 另外为了适应编写驱动程序的需要加上了Unicode字符串支持

1.概览
我们要定义字符串时通常会采用这样的方式:

.data
szStr    DB   "Hello, World", 0
......
......
.code
.....
invoke  MessageBox, NULL, ADDR szStr, ADDR szStr, MB_OK
....
这是标准的定义方式, 但是阅读程序时会很不方便, 而且并不是每一个字符串都需要一个有意义的名字

而现在可以采用这种方式:

.code
invoke  MessageBox, NULL, $CTA0("Hello World"), $CTA0("Hello World"), MB_OK

非常方便吧

这个文件提供了一系列类似的宏, 可以方便的完成定义字符串的任务

2.使用说明
宏的名字由以下几个字符组成:
$  C  T  A  W  0(数字0非字母o)
例如上面提到的$CTA0由"$", "T", "A", "0"组成, 它们含义如下:

$  有$打头的是宏函数, 如$CTA0, 调用方式为 宏名(参数1, 参数2...) 没有$打头的的是普通的宏, 它们只是起到定义字符串的作用

T  每个宏都有, 代表sTring, 字符串

A  代表Ansi, 如果一个宏名中有A, 这个宏定义的字符串是Ansi字符串

W  代表Widechar, 和A相对, 如果一个宏名中有W, 它定义的字符串是Unicode的

0  代表字符串自动以0结尾, 只有名字含"0"的宏才有定义空字符串的功能, 如果你用名字不含0的宏来定义空字符串会编译错误

C  代表Const, 含C的宏会在.const段中定义字符串, 而不含C的会在.data中定义

例如: $CTW0宏函数功能是在.const段中定义一个以0结尾的Unicode字符串
TA 功能是在.data段中定义一个Ansi字符串

如果一个宏名字中没有A或W, 这个宏定义的到底是Ansi字符串还是Unicode字符串则取决于是否定义UNICODE常量

通用语法:
对于宏:
宏名   ["字符串"], [字符串名], [对齐方式]
对于宏函数
宏名(["字符串"], [字符串名], [对齐方式])

说明:a.字符串必须用双引号括起
b.字符串名和对齐方式可以颠倒, 可以空缺
c.对齐方式是WORD, DWORD或者1, 2, 4, 8等

3.功能特色
a.字符串支持转义符, 如:
CTA0  "Hello\nWorld"
会显示为
Hello
World

支持的转义符有\n \r \t \a \b \l \f等

b.能够自动找出重复定义的字符串
如定义两个Hello时, 第2次会自动查出并返回首次定义的字符串

4.已知限制和缺点
a.CreateFile会自动变成CreateFileA, 这是由于masm编译器的特性
CreateFile  EQU  <CreateFileA>

b.Unicode字符串最大支持47个字符, 否则会出错

c.Unicode字符串不支持中文(这个在我的修正版中得到初步的解决)

;-----------------------------------------------------------------------------------

(二)修正说明
1. 字符串支持新的转义符\u, 可以直接在引号内定义AscII码, 类似于C语言的\x
例如:CTA0  "\u41h\u42h\u43h"
等价于
    CTA0  "ABC"
A的AscII码为41h, B为42h, C为43h
注意AscII码必须是16进制的且必须以h或大写的H结尾

2. Unicode字符串支持64个字符(花了我好久)

3. Unicode间接支持中文(使用\uxxxxh定义中文的Unicode码)

例如 CTW0  "\u6211h\u7231h\u4F60h"

这是什么?嘻嘻, 大家试试就知道了

4.增加了好多宏
如$FTA0等, Dos下用, Windows下用处不大, 就不说了

/////////////////////////////////////////////////
//欢迎大家找出Bug和提出建议                    //
/////////////////////////////////////////////////

附一个例子:
.386
.model flat, stdcall
.option casemap:none

include windows.inc
include user32.inc
includelib user32.lib

include String.inc

.const
CTA  "Hello\0", szaHello   ;定义一个名为szaHello的字符串, 这里用的是不带0的宏
CTW0 "Hello", szwHello

.code
start:
invoke MessageBoxA, NULL, OFFSET szaHello, $CTA0("Title"), MB_OK
invoke MessageBoxW, NULL, OFFSET szwHello, $CTW0("Title"), MB_OK
ret
END start
所上传文件
string.rar (上传时间2006-03-05,01:14,10.7 KB,58 次点击)
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有