Пожалуйста, объясните вложенное определение 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))'
Я не понимаю
Почему это строка?
Почему Лок должен быть там?
Почему после определения 44 $ 1 существует другое определение define('loc', eval(loc+2))'?
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