Пожалуйста, объясните вложенное определение m4 в строку

В настоящее время я читаю книгу «Архитектура SPARC, программирование на языке ассемблера и C. Второе издание». Я дошел до места в книге, где я не понимаю или не могу понять определенную команду:

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

Дело в том, что я понимаю первую строчку. Но я действительно не понимаю второй аргумент 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))'?


person RnBandCrunk    schedule 06.05.2013    source источник


Ответы (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
person Jester    schedule 06.05.2013
comment
Хорошо, теперь я понял, но почему loc: в начале печатает адрес? Это тот же самый loc:, который я определил линией раньше? Или это стажерская команда? - person RnBandCrunk; 07.05.2013
comment
Да, это то же самое loc. Он начинается с 0 (потому что так он определен), затем каждый макрос добавляет к нему размер инструкции. В этом примере sto представляет собой 2-байтовую инструкцию, поэтому loc увеличивается на 2. - person Jester; 07.05.2013
comment
Ах, хорошо. Забавно, как они ожидают, что вы уже знаете это в книге. Как бы то ни было, спасибо, приятель. - person RnBandCrunk; 07.05.2013