0

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

4

1 回答 1

2

It sounds like the task is to make an assembler using m4 macros. The expected output will be something like:

0000: 44 xx
0002: yy zz
...

That is, each line is prefixed with the address, followed by the machine code bytes.

The loc: at the start will print the current address for you, 44 is presumably the opcode for the sto instruction, and $1 is the argument. The final part is redefining loc so that it points to the next available location. Since this instruction takes up two bytes, loc is incremented by 2.

Note that m4 uses backticks to start strings. You might have copied it incorrectly from the book.

Given this sample input:

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

The output is:

0:  44 01
2:  44 AA
于 2013-05-06T16:37:33.070 回答