node9:
- декларация метки; он определяет символ, адрес которого является этой позицией.
Но когда вы используете имя символа где-то else в строке, например, в качестве операнда для .word
, вы делаете ссылку на символ.
Если вы ссылаетесь на символ, но нигде не определяете его с помощью метки, тогда, конечно, вы получите ошибку компоновщика.
Возможно, вы хотите другое объявление, например
.p2align 2 # make sure the word members are aligned by 2^2 = 4
node10: .word 10
.word node11
.asciiz "ten"
Очевидно, что в какой-то момент вам нужна структура, которая не ссылается на еще одну новую метку. например он может указывать на себя, или на первый узел (круговой связанный список), или указатель NULL.
.p2align 2
node11: .word 11
.word 0 # NULL pointer
.asciiz "eleven"
Кстати, это похоже на связанный список с узлами, похожими на этот в C.
struct node {
int32_t a;
struct node *next;
char buf[]; // flexible array member: arbitrary length buffer, not a pointer
};
Мои блоки asm выше основаны на этом предположении.
Таким образом, ваш asm-блок может быть выводом компилятора для чего-то подобного в глобальной области видимости (что, конечно, даст ту же ошибку компоновщика):
struct node node9 = {9, node10, "nine" };
Директивы .word
и .asciiz
передают инициализированные статические данные в текущий раздел.