Не удается скомпилировать встроенную сборку - PullRequest
0 голосов
/ 17 сентября 2018

Я не могу скомпилировать файл сборки в 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

Кроме того, я включил файлы в окно обозревателя следующим образом (и, конечно, установил зависимости сборки): project-explorer

Я также пытался собрать из powershell с ml.exe, но здесь тоже не повезло. Кроме того, было бы неплохо, если бы кто-то мог указать на простой метод для захвата выходных данных ml.exe, он сразу же после выполнения (am-cmd-noob).

Наконец, я попытался перевести файлы в режим ANSI, но это не должно быть проблемой, я просто прочитал старых ответчиков stackoverflow.

Что мне не хватает? Должен ли я вернуться к VS2010, может быть? Или это просто идиотская синтаксическая ошибка? Это действительно пугает меня, так как такую ​​простую программу для проверки концепции не должно быть так сложно написать -.-

1 Ответ

0 голосов
/ 18 сентября 2018

Хорошо, проблема решена:

Оказалось, что это была опечатка в строке 50 ["dwprd" вместо "dword"].

Исправлено и решено. Если кто-то сталкивается с ситуацией, подобной моей, где он просто не может найти никаких полезных советов, предоставленных ассемблером / IDE, то вот как я нашел решение:

[в ОС Windows]

  1. Открыть окно проводника и выполнить поиск «ml.exe» (занимает много времени)
  2. Лучшая практика - сделать жесткую ссылку на этот каталог для простоты использования
  3. собирайте только один файл за раз с помощью ml.exe, используйте флаг "c", чтобы компоновщик оставался спокойным и тихим [потому что c означает "вообще не ссылаться"]
  4. «ml.exe -c» выдаст сообщение об ошибке (для меня что-то вроде «unknown command dwprd» или что-то в этом роде), также будет создан файл .obj, если он будет успешным
  5. после исправления всех возникающих ошибок и ошибок вернитесь в Visual Studio и скомпилируйте, если вам все еще не повезло, попробуйте переместить собранные файлы .obj в папку проектов VS.
...