Я не могу скомпилировать файл сборки в Visual Studio 2017.
Я не уверен, что это из-за визуальной студии или из-за того, что я допустил некоторые ошибки в коде, пожалуйста, помогите мне.
У меня есть главный файл c ++, в который я иду для вызова:
#include "stdafx.h"
#include "myStruct.h"
extern "C" __int64 CalcStructSum_(const myStruct *kekStruct);
int _tmain(int argc, _TCHAR* argv[])
{
myStruct kek;
kek.Val8 = 8;
kek.Val16 = 16;
kek.Val32 = 32;
kek.Val64 = 64;
__int64 summe = CalcStructSum_(&kek);
printf("summe betraegt: %d", summe);
getchar();
return 0;
}
mystruct.h:
#pragma once
typedef struct
{
__int8 Val8;
__int8 Pad8;
__int16 Val16;
__int32 Val32;
__int64 Val64;
}myStruct;
здесь эквивалент сборки:
myStruct struct
Val8 byte ?
Pad8 byte ?
Val16 word ?
Val32 dword ?
Val64 qword ?
myStruct ends
а вот файл сборки:
.model flat,c
include myStruct_.inc
.code
;prolog and function start
CalcStructSum_ proc
push ebp
mov ebp,esp
push ebx
push esi
; das struct liegt auf dem stack
; alle felder wurden auf 32 bit sign-extended
; in esi kommt anfang des speicherbereichs rein
; später wird quasi [basereg + dispatch] daraus interpretiert
mov esi, [ebp+8] ; get a pointer to "mystruct"
; load 8- and 16bit sources into 32bit registers (movsx)
; this is necassery to load struct-fields from the stack
movsx eax, byte ptr [esi + myStruct.Val8] ; [baser. + disp]
movsx ecx, word ptr [esi + myStruct.Val16]
add eax, ecx
; now sign-extend eax register to 64bit
; high part: edx , low part: eax
cdq
;save result for later
mov ebx, eax
mov ecx, edx
; now load the int-part of the struct and add it
; (it must be sign-extended to edx:eax again)
mov eax, [esi + myStruct.Val32]
cdq
; (the high-part must be added with carry, if overflown)
add eax, ebx
adc edx, ecx
; now, get the long from stack
add eax, dword ptr [esi + myStruct.Val64] ; low part
adc edx, dwprd ptr [esi + myStruct.Val64 + 4] ; high part
; we now have the sum of all structure fields in the register pair edx:eax
pop esi
pop ebx
pop ebp
ret
CalcStructSum_ endp
end
Кроме того, я включил файлы в окно обозревателя следующим образом (и, конечно, установил зависимости сборки):
Я также пытался собрать из powershell с ml.exe, но здесь тоже не повезло.
Кроме того, было бы неплохо, если бы кто-то мог указать на простой метод для захвата выходных данных ml.exe, он сразу же после выполнения (am-cmd-noob).
Наконец, я попытался перевести файлы в режим ANSI, но это не должно быть проблемой, я просто прочитал старых ответчиков stackoverflow.
Что мне не хватает? Должен ли я вернуться к VS2010, может быть? Или это просто идиотская синтаксическая ошибка? Это действительно пугает меня, так как такую простую программу для проверки концепции не должно быть так сложно написать -.-