Как вы используете printf из Assembly? - PullRequest
2 голосов
/ 30 декабря 2010

У меня есть проект MSVC ++, настроенный для компиляции и запуска ассемблерного кода.

В main.c:

#include <stdio.h>

void go() ;

int main()
{
  go() ; // call the asm routine
}

В go.asm:

.586
.model flat, c
.code

go PROC
  invoke puts,"hi"
  RET
go ENDP

end

Но когда я компилирую и запускаю, я получаю сообщение об ошибке в go.asm:

ошибка A2006: неопределенный символ: ставит

Как определить символы в <stdio.h> для файлов .asm в проекте?

Ответы [ 2 ]

1 голос
/ 31 декабря 2010

Вот что у меня есть.

Работает !!

.586
.model flat,c

<b>printf PROTO C :VARARG  ; The secret sauce..</b> a prototype of printf

.data
msgHello1 BYTE "GREETINGS AND WELCOME TO EARTH!",0 

.code

go PROC
  push OFFSET msgHello1
  call printf
  add esp, 4 ;  Stack cleaning
  RET
go ENDP

end
0 голосов
/ 30 декабря 2010

Я думаю, что статья объясняет это лучше, чем я.

Грубо говоря, ассемблер не может найти символ (функцию) в go.asm. Вы должны сказать ему, что это внешний символ.

Связанная статья подходит для создания приложения со смешанным кодом с точки зрения использования ассемблера в качестве основного языка, включая выполнение подпрограммы main. Если вы используете основную подпрограмму C, большая часть того, что сделано, не требуется, вам просто нужно:

Соберите модуль сборки с / Mx сохранить случай нелокальной имена. При использовании MASM версии 6.0 или позже используйте / Cx, чтобы сохранить регистр нелокальные имена.

и

Включите оператор .MODEL, c в модуль сборки, чтобы убедитесь, что C именование и вызов конвенции используются и что модули используют одни и те же сегменты по умолчанию. Будет маленький, средний, компактный или большой.

Директивы

и EXTERN для каждой функции, которую вы хотите вызвать в формате: EXTERN printf:proc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...