2016-02-27 6 views
4

Я пытаюсь скомпилировать программу C с процедурой ASM. Он должен быть 16-битным, поэтому я использую Visual C++ 1.0 и MASM 6.11.Неразрешенный внешний (старый компилятор)

код ASM:

.MODEL MEDIUM 
EXTRN first:WORD, second:WORD, third:WORD 
.CODE 
_Add_Ext PROC FAR 
    mov AX, first 
    add AX, second 
    mov third, AX 
_Add_Ext ENDP 
END 

Я составил его в .obj файл

ml.exe -c -Cx -FoC:\prjcts\2_6\2_7.obj C:\prjcts\2_6\2_7.asm 

и включены в проект.

код C:

#include <stdio.h> 
int first = 1, second = 2, third = 0; 
void main (void) 
{ 
    printf("\nBefore adding third = %d", third); 
    Add_Ext(); 
    printf("\nAfter adding third = %d", third); 
} 

Когда я пытаюсь скомпилировать его, он дает мне:

Compiling... 
c:\prjcts\2_6\2_6.c 
Linking... 

C:\PRJCTS\2_6\2_7.OBJ(C:\prjcts\2_6\2_7.asm) : error L2029: 'first' : unresolved external 
C:\PRJCTS\2_6\2_7.OBJ(C:\prjcts\2_6\2_7.asm) : error L2029: 'third' : unresolved external 
C:\PRJCTS\2_6\2_7.OBJ(C:\prjcts\2_6\2_7.asm) : error L2029: 'second' : unresolved external 

LINK returned error code 2. 
Creating browser database... 
2_6.EXE - 3 error(s), 0 warning(s) 

Так что видит мой .obj, понимает, что это такое, но не могу понять чтобы взять переменные из C-кода? Я не хочу использовать встроенный ассемблер, но я попробовал его раньше, и он сработал.

+2

Unrelated к вашей проблеме, но при написании вопроса здесь, который включает в себя код, пожалуйста, не * перепечатывать * код, поскольку это может ввести несвязанные ошибки, которые отвлекают от вашей реальной проблемы (что произошло для вас сейчас). Вместо этого скопируйте и вставьте код. –

+0

Почему? Я не повторил этого, я слишком ленив. –

+1

Я исправил ваш вопрос Антона, но я считаю, что @JoachimPileborg имел в виду тот факт, что у вас был 'third =% d '' с помощью smartquote (фигурная цитата) вместо традиционной двойной кавычки '' '. У меня было чувство, что каким-то образом предоставленный код был частично отредактирован вручную, поскольку присутствовала только одна такая умная цитата. Поскольку вы не утверждали, что ваш код не будет компилироваться, я изменил ваш код, установив цитату. –

ответ

4

По простой догадке, это будет C имя mangling. Внешний элемент в C будет иметь тенденцию к предварительной обработке с помощью _

EXTRN _first:WORD, _second:WORD, _third:WORD 
+0

Конечно, все ссылки внутри кода ассемблера также должны иметь префикс _. Кажется, это проблема. –

0

Спасибо большое! Возможно, что код был для Microsoft C или что-то в этом роде, а не для VC++ 1.0

Этот код работает.

.MODEL MEDIUM 
EXTRN _first:WORD, _second:WORD, _third:WORD 
.CODE 
_Add_Ext PROC FAR 
    mov AX, _first 
    add AX, _second 
    mov _third, AX 
_Add_Ext ENDP 
END