Как исправить «неразрешенную внешнюю» ошибку в сборке x86?

У меня есть два файла, в одном я объявляю переменную SEED следующим образом:

;file1.asm

.MODEL  SMALL,BASIC
.FARDATA RAND_DATA
SEED       DW      ?

.CODE
;Some code
END

А в другой я пытаюсь ссылаться на переменную

;file2.asm

.MODEL  SMALL,BASIC
EXTERNDEF SEED:WORD

FOO PROC  FAR PUBLIC USES DX,DS
    MOV     SEED,DX
FOO ENDP

END

Когда я пытаюсь скомпилировать оба файла, используя код

ml file1.asm file2.asm io.lib

Я получаю следующую ошибку:

error L2029: 'SEED' : unresolved external

Что я делаю неправильно?

Спасибо!

12.10.2009 22:49:29
1 ОТВЕТ
РЕШЕНИЕ

SEED в file1.asm должен быть сделан ОБЩЕСТВЕННЫМ, чтобы его могли видеть другие модули.

Это делается путем добавления строки где-то в file1.asm с помощью

       PUBLIC SEED

Обратите внимание, что в зависимости от используемого вами ассемблера, для этого может потребоваться « глобальный ».
Такие операторы области видимости могут находиться в любом месте файла +/-, но есть несколько стилей / соглашений относительно места, где это делается. Два основных из них:

  • В верхней части файла все операторы PUBLIC сгруппированы вместе
  • Сразу над каждым объявлением переменной, например,

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

1
13.10.2009 01:06:41
#yuval: посмотрите, как это делается в исправленном ответе. Обратите внимание, что есть несколько вариантов в зависимости от используемого ассемблера, но в целом PUBLIC является подходящим ключевым словом для этой цели.
mjv 13.10.2009 01:09:11