宏参数的特殊运算符

为了宏定义和引用的某些特殊需要,汇编程序还支持几个具体特定含义的运算符。

连接运算符

    在宏定义中,如果形式参数与其它字符连接在一起,或形式参数出现在字符串之中,那么,就必须使用连接运算符(&)。

   定义一个转移宏JUMP,其一个参数决定转移类别,另一个参数指定转移目标。

解:

  JUMP MACRO CON, here
J&CON here
ENDM

假设存在下面二个引用语句,那么,点击它们可得到扩展后的指令。

    JUMP  mp, next
  1     Jmp next

    JUMP  nz, next1
  1     Jnz next1
  定义一个问候性的字符串宏GREETING,其一个参数说明字符串的变量名,另一个参数指名问候的对象。

解:

  GREETING MACRO MSG, name
MSG DB 'Hello, &name'
ENDM

假设有下面引用语句,那么,点击它们将会扩展得到三个问候性的字符串定义。

    GREETING  STR1, 张三
  1     STR1 DB 'Hello, 张三'

    GREETING  STR2, 李四
  1     STR2 DB 'Hello, 李四'

    GREETING  MSG1, John
  1     MSG1 DB 'Hello, John'

 

 

字符串整体传递运算符

字符串整体传递运算符是一对尖括号<>,用它括起来的内容将作为一个字符串来进行形式参数的整体替换。在宏引用时,如果实参内包含逗号、空格等间隔符,则必须使用该操作符,以保证实参的完整性。如果实参是某个具有特殊含义的字符,为了使它只表示该字符本身,也需要用该运算符括起来。

假设有下面定义字符串的宏DEFMSG,

  DEFMSG MACRO MSG
DB '&MSG', 0DH, 0AH, '$'
ENDM

那么,使用和不使用该运算符的引用宏及其宏扩展如下所示:

    DEFMSG  <Are you ready?>
  1     DB  'Are you ready?', 0DH, 0AH, '$'

    DEFMSG  Are you ready?
  1     DB  'Are', 0DH, 0AH, '$'

 

字符转义运算符

在引用宏时,如果实参中含有特殊字符,而又要该特殊字符当作普通字符来出来,那么,就必须在该特殊字符前加上字符转义运算符“!”。

下面不使用和使用字符转义运算符的宏引用语句及其宏扩展的结果:

    DEFMSG  <Input one number(>90):>
  1     DB  'Input one number(90):', 0DH, 0AH, '$'
       ;第一个“>”与字符“<”相比配,而不会把它当作“大于号”字符来处理

    DEFMSG  <Input one number(!>90):>
  1     DB  'Input one number(>90):', 0DH, 0AH, '$'
  ;由于在第一个“>”字符前面有字符转义运算符“!”,所以,汇编程序会把第一个“>”当作“大于号”字符来处理,而把最后面的字符“>”当作是与前面“<”相比配的结束符。

 

计算表达式运算符

在引用宏时,使用计算表达式运算符“%”表示把其后面表达式的结果当作实参进行替换,而不是该表达式的整个式子。

下面使用和不使用计算表达式运算符的宏引用语句及其宏扩展的结果:

    DEFMSG  %200+23-100
  1    DB  '123', 0DH, 0AH, '$'  ;先计算出表达式 200+23-100的值,然后再把该值作为参数进行替换

    DEFMSG  200+23-100
  1    DB  '200+23-100', 0DH, 0AH, '$'  ;把整个表达式 200+23-100当作一个字符串来进行参数替换

你可能感兴趣的:(汇编,input,扩展)