当然 还是转载 只是把网上各个不同地方的 都收集一下 希望原创不要责怪小弟 我这也是为了知识的传播做出贡献啊(^ _ ^自我开脱中...为转载找理由和借口)
没办法 谁叫你们的语文都学的这么好呢 我自认为我来总结 就没有各位大神总结的好 好
最后膜拜下 然后开始转载之旅吧
----------------下面开始对xxx网站进行转载 作为入门的吧---------------------------
xxx网站网址如下:
http://www.kuqin.com/assemble/20080411/6494.html
一.宏的简单介绍
宏就是在代码被汇编成为obj文件之前进行的预处理。由于发生在汇编期(Assembly-Time, 和高级语言中的编译期是一个意思),所以不会给执行期带来负担,可以用作代码生成工具,设置和C++中的模板一样,用作meta-programming的工具。在MASM中宏可以分为两种:
1、 Text Macro 2、Procedure (Function) Macro。第一种宏就是和#define pi 31415926这样的简单的文本替换的宏,第二种就是那种带参数,可以有局部变量,可以返回值这样的可以看作函数或者过程的宏。下面就先从Text Macro入手,看看如何使用简单的宏。
二.简单的文本宏
你可以给一个字符序列指定一个符号名,然后在源代码的其余部分用这个名字来代替这个字符序列。这个指定了名字的文本就是文本宏。说白了就是文本替换。用TEXTEQU来定义一个这样的宏。
name TEXTEQU <text>
name TEXTEQU textvar
name TEXTEQU %numvar
三.汇编期的变量与常量
这个几个东西其实都有自己的名字,其实按照用法来说就是汇编期的常量与变量的意思。比如Text Macro(对,就是前面的文本宏)用作汇编期的文本常量,Name Assignment用作汇编期的数值变量。
1.定义汇编期常量 什么是汇编期常量呢?其实也就是常量的意思,因为无论在编译期还是执行期它都是静态的,一旦定义之后其值不能改变。回忆在C中,你用#define来定义常量。但是#define可以改变一个宏所等于的值,也就是说常量与否需要你的维护(编译器会给出一个警告)。在MASM 中有一个关键字专门用来定义常量,尝试改变常量的值会得到一个错误提示。
name EQU expression
name EQU <text>
2.定义汇编期文本变量汇编期文本变量是对“text macro”的另外一个看法。其实它们是同一个事情。当你定义了一个文本宏之后,你可以把那个宏名看作汇编期文本变量的名字,被宏名替换的文本内容作为变量的文本值。那么前面说过的第二种用法:
name TEXTEQU textvar
就很好理解了。就是让把一个文本变量赋给另一个文本变量。比如:
talent TEXTEQU <genius>
taowen TEXTEQU talent
第一行定义了一个名字为talent的汇编期文本变量,第二行把talent的值赋给了名为 taowen的变量。从结果上看这个和:
talent TEXTEQU <genius>
taowen TEXTEQU <talent>
是一样的,但是第二种做法是先因为文本宏替换的作用把talent变成了genius。实际的效果是这样的: taowen TEXTEQU <genius>
3.显示文本变量的内容在C中经常用printf,在运行期显示一些变量的内容来进行调试。而在MASM中则用echo来在汇编期显示文本变量的内容。
(这里我加一点 是在cmd的那个黑框框显示的)
china TEXTEQU <great country>
%echo china
这样会在汇编时的命令行中出现great country。如果你把%号去掉,则显示的是china。你应该可以推测出%是干什么的了,就是对一个变量进行求值。
4.定义汇编期数值变量常量有两种那么变量也应该有两种。这里就介绍汇编期数值变量的用法。 name = expression expression是一个数值表达式,比如: val = 3+4 此时val就是一个数值变量,其值为7。你也可以这么写:
valexp TEXTEQU <3+4>
val = valexp
看上去好像式把一个文本变量赋给了数值变量,进行了类型转换(呵呵,效果是一样的)。其实实际上是把3+4写到了valexp处,因为文本宏进行了文本替换。
5.把数值变量赋给文本变量
前面我们看到了如何“把文本变量赋给数值变量”,那么反过来呢?
val = 3+4
valexp TEXTEQU val
结果是提示错误:STest.asm(15) : error A2051: text item required。汇编器说需要文本项,那么我们加上<>就好了。
val = 3+4
valexp TEXTEQU
用%echo valexp检查一下你就会发现,并不是如你所愿的显示的是7,而是val。这个是因为<>使得汇编器认为val是一个字符串,由于数值变量不是文本替换的宏,并不会把val替换为7,所以当然显示的是val。正确的做法是:
val = 3+4
valexp TEXTEQU %val
%号和前面的用法一样,是用作求值。回忆一开始介绍的文本宏的用法中的第三条就是: name TEXTEQU %numvar。这个用法就是让一个数值变量的值赋给文本变量,经常用作显示一个数值变量的值。调试的时候这么写。
pi = 3.1415926
temp TEXTEQU %pi
%echo temp
这个是一个很重要的调试技巧。
没办法 谁叫你们的语文都学的这么好呢 我自认为我来总结 就没有各位大神总结的好 好
最后膜拜下 然后开始转载之旅吧
----------------下面开始对xxx网站进行转载 作为入门的吧---------------------------
xxx网站网址如下:
http://www.kuqin.com/assemble/20080411/6494.html
一.宏的简单介绍
宏就是在代码被汇编成为obj文件之前进行的预处理。由于发生在汇编期(Assembly-Time, 和高级语言中的编译期是一个意思),所以不会给执行期带来负担,可以用作代码生成工具,设置和C++中的模板一样,用作meta-programming的工具。在MASM中宏可以分为两种:
1、 Text Macro 2、Procedure (Function) Macro。第一种宏就是和#define pi 31415926这样的简单的文本替换的宏,第二种就是那种带参数,可以有局部变量,可以返回值这样的可以看作函数或者过程的宏。下面就先从Text Macro入手,看看如何使用简单的宏。
二.简单的文本宏
你可以给一个字符序列指定一个符号名,然后在源代码的其余部分用这个名字来代替这个字符序列。这个指定了名字的文本就是文本宏。说白了就是文本替换。用TEXTEQU来定义一个这样的宏。
name TEXTEQU <text>
name TEXTEQU textvar
name TEXTEQU %numvar
三.汇编期的变量与常量
这个几个东西其实都有自己的名字,其实按照用法来说就是汇编期的常量与变量的意思。比如Text Macro(对,就是前面的文本宏)用作汇编期的文本常量,Name Assignment用作汇编期的数值变量。
1.定义汇编期常量 什么是汇编期常量呢?其实也就是常量的意思,因为无论在编译期还是执行期它都是静态的,一旦定义之后其值不能改变。回忆在C中,你用#define来定义常量。但是#define可以改变一个宏所等于的值,也就是说常量与否需要你的维护(编译器会给出一个警告)。在MASM 中有一个关键字专门用来定义常量,尝试改变常量的值会得到一个错误提示。
name EQU expression
name EQU <text>
2.定义汇编期文本变量汇编期文本变量是对“text macro”的另外一个看法。其实它们是同一个事情。当你定义了一个文本宏之后,你可以把那个宏名看作汇编期文本变量的名字,被宏名替换的文本内容作为变量的文本值。那么前面说过的第二种用法:
name TEXTEQU textvar
就很好理解了。就是让把一个文本变量赋给另一个文本变量。比如:
talent TEXTEQU <genius>
taowen TEXTEQU talent
第一行定义了一个名字为talent的汇编期文本变量,第二行把talent的值赋给了名为 taowen的变量。从结果上看这个和:
talent TEXTEQU <genius>
taowen TEXTEQU <talent>
是一样的,但是第二种做法是先因为文本宏替换的作用把talent变成了genius。实际的效果是这样的: taowen TEXTEQU <genius>
3.显示文本变量的内容在C中经常用printf,在运行期显示一些变量的内容来进行调试。而在MASM中则用echo来在汇编期显示文本变量的内容。
(这里我加一点 是在cmd的那个黑框框显示的)
china TEXTEQU <great country>
%echo china
这样会在汇编时的命令行中出现great country。如果你把%号去掉,则显示的是china。你应该可以推测出%是干什么的了,就是对一个变量进行求值。
4.定义汇编期数值变量常量有两种那么变量也应该有两种。这里就介绍汇编期数值变量的用法。 name = expression expression是一个数值表达式,比如: val = 3+4 此时val就是一个数值变量,其值为7。你也可以这么写:
valexp TEXTEQU <3+4>
val = valexp
看上去好像式把一个文本变量赋给了数值变量,进行了类型转换(呵呵,效果是一样的)。其实实际上是把3+4写到了valexp处,因为文本宏进行了文本替换。
5.把数值变量赋给文本变量
前面我们看到了如何“把文本变量赋给数值变量”,那么反过来呢?
val = 3+4
valexp TEXTEQU val
结果是提示错误:STest.asm(15) : error A2051: text item required。汇编器说需要文本项,那么我们加上<>就好了。
val = 3+4
valexp TEXTEQU
用%echo valexp检查一下你就会发现,并不是如你所愿的显示的是7,而是val。这个是因为<>使得汇编器认为val是一个字符串,由于数值变量不是文本替换的宏,并不会把val替换为7,所以当然显示的是val。正确的做法是:
val = 3+4
valexp TEXTEQU %val
%号和前面的用法一样,是用作求值。回忆一开始介绍的文本宏的用法中的第三条就是: name TEXTEQU %numvar。这个用法就是让一个数值变量的值赋给文本变量,经常用作显示一个数值变量的值。调试的时候这么写。
pi = 3.1415926
temp TEXTEQU %pi
%echo temp
这个是一个很重要的调试技巧。