宏和MASM编译时语言
echo和".err"
echo Hello, world!
end
在这个程序中唯一的编译时语言是echo语句。end语句是必须的。在MASM汇编期间,echo语句显示其参数列表的文本表示。
与echo一样,".err"伪指令也会在汇编过程中向控制台显示一个字符串,将文本显示为MASM错误诊断的一部分,并会递增错误计数器,在处理完当前源文件后停止汇编过程。
.err <Statement must have exactly on operand>
编译时常量和变量
可以使用textequ或者equ伪指令声明编译时常量,使用"="伪指令声明编译时变量。
inc_by equ 1
ctlVar = 0
MASM转义运算符(!)
将该运算符防止在另一个符号前面,该运算符指示MASM将该字符视为文本,而不是特殊符号。包括分号,视为文本常量而不是注释,例如,"!;"。
MASM求值运算符(%)
百分号运算符指示MASM对其后面的表达式求值,并用结果替换该表达式。
num10 = 10
text10 textequ <10>
tn11 textequ %num10+1 ;值为文本11
catstr伪指令
连接字符串为文本对象。
helloWorld catstr <hello>, <, >, <World!!>
instr伪指令
查找另一个字符串第一次出现的位置。
WorldPosn instr 1, <Hello World>, <World>
从1开始搜索,源字符第一个字符为第1位而不是第0位。
sizestr伪指令
计算字符串的长度。
hwlen sizestr <Hello World> ;值为11
substr伪指令
从较大的字符串中提取子字符串。
hString substr <Hello World>, 1, 5
从"Hello World"提取"Hello"。如果没有指定长度,提取完剩余部分。
条件汇编(编译时决策)
if constant_boolean_expression1
Text
elseif constant_boolean_expression2
Text
else
Text
endif
重复汇编(编译时循环)
while constant_boolean_expression
Text
endm
标准宏
macro_namme macro arguments
;宏功能体
endm
MASM将宏参数视为可选参数。如果定义了两个参数,并使用一个,MASM(通常)不会报错。
给宏定义行参数加一个":req"后缀,显式的告诉MASM该参数是必须的。
默认参数宏
neg128 macro reg64HO:=<rdx>, reg64LO:=<rax>
endm
可变参数宏
varParms macro varying:vararg
for curArg,<varying>
byte curArg
endm
endm
varParms 1, 2, 3
一个宏最多只能有一个vararg参数,如果有多个参数,并且有一个是vararg参数,则vararg参数必须是最后一个。
宏展开运算符(&)
此运算符在任何地方都有效,将就宏名称(或)其他文本符号替换为实际值。
expand marcro parm
byte '&parm',0
endm
.data
expand a ;展开为 byte 'a', 0
宏中局部符号
jzc marco target
local NotTarget ;可以多个
jnz NotTarget
jc target
NotTarget:
endm
local伪指令明确指示MASM哪些符号是局部符号。
exitm伪指令
立即终止对宏的处理。
扩展资料
-
Write Great Code
-
The Art of Computer Programming
-
Hacker's Delight
-
Software optimization resources. C++ and assembly. Windows, Linux, BSD, Mac OS X (agner.org)
-
Apex memmove - the fastest memcpy/memmove on x86/x64 ... EVER, written in C - CodeProject
-
The Waite Group's Microsoft Macro Assembler Bible
-
Managing Projects with GNU Make, 3rd Edition
-
Programming Windows, 5th Edition
参考
-
[美]兰德尔·海德.64位汇编语言的编程艺术