【问题标题】:Please explain m4 nested define in string请解释字符串中的 m4 嵌套定义
【发布时间】:2013-05-06 14:22:52
【问题描述】:

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

【问题讨论】:

    标签: assembly macros processor m4


    【解决方案1】:

    听起来任务是使用 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
    

    【讨论】:

    • 好吧,我想现在我明白了,但是为什么开头的loc: 会打印地址?这是否与我之前定义的行相同的loc:?还是实习生命令?
    • 是的,loc 是一样的。它从 0 开始(因为它是这样定义的),然后每个宏将指令的大小添加到它。在本例中,sto 是 2 字节指令,因此 loc 增加 2。
    • 啊,好吧。有趣的是,他们希望你在书中已经知道这一点。无论如何,谢谢伙计。
    猜你喜欢
    • 2014-08-15
    • 2017-09-05
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多