无法编译内联汇编

问题描述 投票:0回答:1

我无法在Visual Studio 2017中编译程序集文件。我不确定天气是由于visual studio还是因为我在代码中犯了一些错误,请帮助我。

我有一个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的输出,它会很好,它会在执行后立即消失(我是一个cmd-noob)。

最后,我尝试将文件放在ANSI模式下,但这根本不应该是一个问题,我只是阅读旧的stackoverflow回答。

我错过了什么?我应该回到VS2010吗?或者它只是一个愚蠢的语法错误?这真的让我很烦,因为这样一个简单的概念验证程序不应该这么难写 - .-

c++ assembly masm
1个回答
0
投票

好的,问题解决了:

原来这是第50行的拼写错误[“dwprd”而不是“dword”]。

修复并解决了。如果有人遇到像我这样的情况,他们只是找不到汇编程序/ IDE提供的任何有用的提示,那么这就是我找到解决方案的方法:

[不一定是AS]

  1. 打开资源管理器窗口并搜索“ml.exe”(需要很长时间)
  2. 最佳做法是使该目录的硬链接易于使用
  3. 使用ml.exe一次只汇编一个文件,使用标志“c”,这样链接器就会保持冷静和安静[因为c代表“完全没有链接”]
  4. “ml.exe -c”将提供一些错误输出(对我来说类似“未知命令dwprd”或类似的东西),如果成功,也会创建一个.obj文件
  5. 修复所有发生的错误和错误后,返回Visual Studio并编译,如果仍然没有运气,请尝试将组装好的.obj文件移动到VS projects文件夹。
© www.soinside.com 2019 - 2024. All rights reserved.