Запуск процедуры asm в файле cpp

Я пытаюсь запустить процедуру из файла asm в файл cpp, но я получаю такие ошибки:

Error   1   error LNK2019: unresolved external symbol _calka referenced in function _main   D:\Addem\main.obj   Project
Error   2   error LNK1120: 1 unresolved externals   D:\Addem\Debug\Project.exe  1   1   Project

Вот мой main.cpp:

#include <iostream>
using namespace std;

extern "C" void calka();

int main()
{
calka();

system("Pause");
return 0;
}

И мой calka.asm

; The calka Subroutine    (calka.asm)
public _calka

INCLUDELIB kernel32.lib
INCLUDELIB user32.lib
INCLUDELIB Irvine32.lib
INCLUDE Irvine32.inc
INCLUDE macros.inc.data
BUFFER_SIZE = 50
buffer BYTE BUFFER_SIZE DUP(?)
filename    BYTE 80 DUP(0)
fileHandle  HANDLE ?
Rozmiar dw ?
Znak db ?
Suma dw ?
Minus db 0
wynik dw ?
temp dd ?

.code
_calka proc near

; Let user input a filename.
mWrite "Podaj nazwe pliku (z rozszerzeniem): "mov edx,OFFSET filename
mov ecx,SIZEOF filename
call    ReadString

; Open the file for input.
mov edx,OFFSET filename
call    OpenInputFile
mov fileHandle,eax

; Check for errors.
cmp eax,INVALID_HANDLE_VALUE        ; error opening file?
jne file_ok                 ; no: skip
mWrite <"Cannot open file",0dh,0ah>
jmp quit                        ; and quit
file_ok:

; Read the file into a buffer.
mov edx,OFFSET buffer
mov ecx,BUFFER_SIZE
call    ReadFromFile
jnc check_buffer_size           ; error reading?
mWrite "Error reading file. "       ; yes: show error message
call    WriteWindowsMsg
jmp close_file

check_buffer_size:
cmp eax,BUFFER_SIZE         ; buffer large enough?
jb  buf_size_ok             ; yes
mWrite <"Error: Buffer too small for the file",0dh,0ah>
jmp quit                        ; and quit

buf_size_ok:
mov buffer[eax],0       ; insert null terminator
;mWrite "File size: ";call   WriteDec            ; display file size
;call   Crlf

; Display the buffer.; Pytanie o wielkosc przedzialu

mWrite "Podaj wielkosc przedzialu h na osi x: "mov edx,OFFSET Rozmiar
mov ecx,SIZEOF Rozmiar
call    ReadDec

mov Rozmiar, ax;mWrite <"Buffer:",0dh,0ah,0dh,0ah>
;mov    edx,OFFSET buffer   ; display the buffer
;call   WriteString
;call   Crlf

mov ecx, 15
mov ebx, OFFSET buffer

mov si, 0
jmp odczyt1
odczyt:
mov ebx, temp
inc ebx

odczyt1:
mov cl, byte ptr [ebx]
mov Znak, cl

mov temp, ebx

cmp Znak, '$' ;koniec pliku
je koniec
cmp Znak, 3bh ;srednik - nastepna liczba
je nastepna
cmp Znak, 20h ;spacja - ponowne wczytanie
je odczyt
cmp Znak, '-'
je Zmien_znakmov al, Znak
sub al, 30h
mov bl, al
mov bh, 0
mov ax, 10
mul si
add ax, bx
mov si, ax
jmp odczyt

Zmien_znak:
mov Minus, 1
jmp odczyt

nastepna:
cmp Minus, 0
je dodaj
jne odejm
dodaj:
add Suma, si
mov si, 0
jmp odczyt
odejm:
sub Suma, si
mov Minus, 0
mov si, 0
jmp odczyt

koniec:
cmp Minus, 0
je dod
jne minu
dod:
add Suma, si
mov si, 0
jmp kon
minu:
sub Suma, si
mov Minus, 0
mov si, 0
kon:
mov ax, Suma
mul Rozmiar

mWrite "Wynik calkowania: "cmp ax,0
;mov ebx, eax
jg plus
mWrite "-"mov bx, 0
sub bx, ax
mov ax, bx

plus:
call WriteDecclose_file:
mov eax,fileHandle
call    CloseFile

; Zeby aplikacja sie nie zamknela, heheszki :D
mov edx,OFFSET Rozmiar
mov ecx,SIZEOF Rozmiar
call    ReadString

quit:
exit
_calka ENDP

END

Я перепробовал все, на чем могу сосредоточиться — добавление obj-файлов в компоновщик и так далее. Я только хочу набрать имя файла, прочитать дату из него и рассчитать его. Calka.asm работает хорошо, если я не пытаюсь заставить его работать в моем файле cpp.

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

1

Решение

Irvine32.inc включает в себя SmallWin.inc и это устанавливает .MODEL flat, stdcall, Таким образом, каждая процедура будет оформлена по умолчанию, как если бы соглашение о вызовах было STDCALL. _calka становится _calka@0, Для Соглашение о вызовах CDECL необходимо для main.cpp Вы должны переопределить соглашение о вызовах по умолчанию для процедуры с PROC C, Теперь подчеркивание будет добавлено автоматически. TLDR: calka proc C,

Лучше всего, вы создаете новый проект. Я опишу процедуру для Microsoft Visual Studio 2015 RC на Windows 10. Процедура очень похожа для других версий VS.

1) Запустите Visual Studio 2015 RC и выберите FILE - New - Project,

Скриншот

2) В следующем окне выберите Win 32 Console Application,

Скриншот

3) Вы получаете подтверждение. Нажмите на Next >,

Скриншот

4) В следующем окне выберите
[X] Консольное приложение
[X] Пустой проект
Нажмите на Finish,

Скриншот

5) Теперь выберите PROJECT - Build Customizations...,

Скриншот

6) в следующем окне отметьте masm(.targets,.props) и нажмите на OK,

Скриншот

7) Создайте main.cpp: PROJECT - Add New Item,

Скриншот

8) В следующем окне выберите C++File(.cpp), дать ему имя и нажать на Add,

Скриншот

9) Создайте calka.asm: PROJECT - Add New Item, В следующем окне выберите C++File(.cpp) и — ВАЖНО! — дать ему имя с .asm расширение. Нажмите на Add,

Скриншот

10) Теперь проверьте, если .asm Файл имеет правильные свойства. В обозревателе решений щелкните правой кнопкой мыши файл и выберите Properties,

Скриншот

11) На странице свойств вы должны увидеть
Исключено из сборки (пусто) или нет
Элемент сборки Microsoft Macro Assembler
Нажмите на OK,

Скриншот

12) Теперь вы можете заполнить файлы контентом.

Скриншот

Вам не нужно system("Pause") поскольку CTRL-F5 создает, запускает и приостанавливает приложение.

в .asm удаление файла

INCLUDELIB kernel32.lib
INCLUDELIB user32.lib

и пусть Visual Studio их автоматически включает. добавить в

INCLUDELIB Irvine32.lib
INCLUDE Irvine32.inc
INCLUDE macros.inc

полный путь к файлам. Это лучше, чем менять настройки VS.

+ Изменить

_calka proc near
...
_calka ENDP

в

calka PROC C
...
calka ENDP

13) Сборка и запуск с CTRL-F5.

Скриншот

Приложение будет открыто в новом окне.

1

Другие решения


По вопросам рекламы [email protected]