2015-11-02 2 views
3

Я программирование сборки x86 в Visual Studio 2012.Как вызвать функцию C от сборки

Я пытаюсь вызвать Printf из программы сборки, но он выдает ошибку, как только я включаю EXTERN линию , Вероятно, это что-то действительно глупое, включая библиотеку функций C, но я не могу найти ни одного онлайн-ресурса, который подскажет мне, как это сделать правильно.

Вот мой код:

.model flat 

      EXTERN _printf 

.data 

digits  byte "0" dup (10), 0   

.code 

main proc 

      lea  eax, digits 
      push eax 
      call _printf 
      add  esp, 4 

main endp 

END 

И ошибка брошена является:

error A2008: syntax error : in directive 

на линии 3 (линия с EXTERN)

EDIT: Добавлена ​​информация об окружающей среде (первый линия).

+0

Это компилятор и ассемблер специфическое, но сказал, единственное, что выглядит иностранным является 'EXTERN' вместо' extern' и некоторые сборщики требователен 'printf' вместо' _printf' но большинство обрабатывать как , Как вы компилируете? Собрать, связать с 'ld' (вручную) или вызвать' gcc' для обоих? –

+0

Я уже пробовал все это. Я использую Visual Studio 2012. Я не уверен, как он собирается, но это консольное приложение x86. – DroidFreak36

+3

['EXTERN _printf: proc'] (https://msdn.microsoft.com/en-us/library/vstudio/7cycf5bc.aspx) – rkhb

ответ

0

Как прокомментировал использовать

 extern _printf:proc 

или 32-битном режиме, вам, возможно, придется использовать:

 extern _printf:near 

экстернов, возможно, потребуется разместить в разделе .Code.

Также добавьте эти две строки в верхней части исходного кода, чтобы заставить компоновщик выглядеть в этих библиотеках.

 includelib msvcrtd 
     includelib oldnames 
+0

Использование 'EXTERN _printf: proc' с теми вставками, которые были исправлены, спасибо. – DroidFreak36

+0

@ DroidFreak36 - если вы хотите вызывать функции Windows, такие как CreateFile(), создать программу C и получить код сборки для компилятора для определения имен сборки. Несмотря на то, что это C, имена функций - это некоторые [искаженные] (http://en.wikipedia.org/wiki/Name_mangling), такие как __imp__CreateFileA @ 28 (32-разрядный режим) или __imp_CreateFile (режим 64 бит). – rcgldr

Смежные вопросы