Символ .word не найден в таблице символов - PullRequest
0 голосов
/ 11 июня 2019

Этот код был предоставлен мне моим профессором для использования в программе, над которой мы должны работать, но я получаю эту ошибку и теряюсь, как ее исправить.

Код:

node9:  .word 9
        .word node10
        .asciiz "nueve"

Ошибка: символ "Node10" не найден в таблице символов.

Это дает мне эту ошибку для всех узлов. Любая помощь в том, как это исправить, очень поможет, спасибо всем.

1 Ответ

0 голосов
/ 11 июня 2019

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 передают инициализированные статические данные в текущий раздел.

...