请在字符串中解释m4嵌套定义

时间:2013-05-06 14:22:52

标签: assembly macros processor m4

我目前正在阅读“SPARC架构,汇编语言编程和C.第二版”一书。我到了书中的一个地方,我不明白或无法理解某个命令:

 define(loc, 0)
 define(sto, 'loc:  44 $1 define('loc', eval(loc+2))')

问题是,我确实理解了第一行。但我真的不明白第二行的第二个论点。书中的解释也没有用。

从书中可以看出:

  

这里我们首先定义一个符号loc,使其值为0.该符号表示位置计数器,即正在组装的指令的内存地址。首先更改每个宏定义以打印loc的当前值,然后将loc重新定义为loc以及存储指令所需的内存位置。

     

宏的参数是字符和字符串,而不是数值。在重新定义loc的值时,我们使用另一个内置的宏eval。 eval采用其字符串参数来表示算术表达式。 eval计算此表达式并以数字字符串的形式返回其值。

我知道上面的解释对你来说听起来很清楚,但对我来说并非如此。我完全不明白的是部分:'loc:44 $ 1 define('loc',eval(loc + 2))'

我不明白:

为什么这是一个字符串?

为什么loc必须在那里?

为什么在定义44 $ 1之后还有另一个定义,“define('loc',eval(loc + 2))'?

1 个答案:

答案 0 :(得分:2)

听起来,任务是使用m4宏制作汇编程序。预期的输出将是:

0000: 44 xx
0002: yy zz
...

也就是说,每一行都以地址为前缀,后跟机器代码字节。

开头的loc:将为您打印当前地址,44可能是sto指令的操作码,$1是参数。最后一部分是重新定义loc,以便指向下一个可用位置。由于该指令占用两个字节,loc增加2。

请注意,m4使用反引号来启动字符串。您可能从书中错误地复制了它。

鉴于此示例输入:

define(loc, 0)
define(sto, `loc:  44 $1 define(`loc', eval(loc+2))')
sto(01)
sto(AA)

输出结果为:

0:  44 01
2:  44 AA