我目前正在阅读“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))'?
答案 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