将ASM链接到C ++文件时,存在访问冲突

时间:2017-12-04 19:04:02

标签: c++ visual-studio assembly

为了给你代码的上下文,这是使用指针算法的两个向量的点积计算(也用指针循环)。我已将它链接到我的main.cpp但由于某种原因,当调用该函数时(在本例中,我的ASM文件),我收到访问冲突错误。这是两个文件。谢谢你的帮助!

#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <tchar.h> 
#include <windows.h> 
#include <algorithm>
 #include <iostream>

using namespace std;
extern "C" int dpp_pointerr(int *v, int *u, int n); //ASM FILE


 void main(void) {

const int N = 10;
static int A[10];
static int B[10];

printf("Array A: ");
for (int i = 0; i < N; i++) { A[i] = rand() % 10; /*printf("%d ", A[i]); */ }
printf("\n\nArray B: ");
for (int j = 0; j < N; j++) { B[j] = rand() % 10;/* printf("%d ", B[j]);*/ }
printf("\n");
int result2 = dpp_pointerr(A, B, N);
printf("\nResult after POINTER dot product: %d\n", result2);

__int64 ctr1 = 0, ctr2 = 0, freq = 0;
int    acc = 0, i = 0;

if (QueryPerformanceCounter((LARGE_INTEGER *)&ctr1) != 0) {
    /****************CODE TO BE TIMED HERE**********************/

    //int result3= dot_product_index(A, B, N);
    int result2 = dpp_pointerr(A, B, N);
    /**********************************************************/
    QueryPerformanceCounter((LARGE_INTEGER *)&ctr2);
    cout << "Start Value: " << ctr1 << endl;
    cout << "End   Value: " << ctr2 << endl;
    QueryPerformanceFrequency((LARGE_INTEGER *)&freq);
    // freq  is number of counts per second. It approximates the CPU frequency 
    printf("QueryPerformanceCounter minimum resolution: 1/%I64u Seconds.\n", freq);
    printf("ctr2 - ctr1: %f counts.\n", ((ctr2 - ctr1) * 1.0 / 1.0));
    cout << "65536 Increments by 1 computation time: " << ((ctr2 - ctr1) * 1.0 / freq) << " seconds\n";
}
else {
    DWORD dwError = GetLastError();
    printf("Error value = %d", dwError);
}
cout << endl;
cout << "Press ENTER to finish";
system("pause");

}

ASM文件     ; Microsoft(R)Optimizing Compiler Version 19.11.25547.0

生成的列表
    TITLE   C:\Users\Patrick\source\repos\dot_product_legit\dot_product_legit\dpp_pointerr.cpp
    .686P
    .XMM
    include listing.inc
    .model  flat, C

PUBLIC dpp_pointerr

_TEXT   SEGMENT

_result$ = -32                      ; size = 4
_B_beg$ = -20                       ; size = 4
_A_beg$ = -8                        ; size = 4
_v$ = 8                         ; size = 4
_u$ = 12                        ; size = 4
_n$ = 16                        ; size = 4
?dpp_pointerr@@YAHPAH0H@Z:
dpp_pointerr PROC           ; dot_product_pointer, COMDAT
    push    ebp
    mov ebp, esp
    sub esp, 228                ; 000000e4H
    push    ebx
    push    esi
    push    edi
    lea edi, DWORD PTR [ebp-228]
    mov ecx, 57                 ; 00000039H
    mov eax, -858993460             ; ccccccccH
    rep stosd
    mov DWORD PTR _result$[ebp], 0
; Line 11
; Line 2
    push    ebp
    mov ebp, esp
    sub esp, 228                ; 000000e4H
    push    ebx
    push    esi
    push    edi
    lea edi, DWORD PTR [ebp-228]
    mov ecx, 57                 ; 00000039H
    mov eax, -858993460             ; ccccccccH
    rep stosd
; Line 5
    mov eax, 4
    imul    ecx, eax, 0
    add ecx, DWORD PTR _v$[ebp]
    mov DWORD PTR _A_beg$[ebp], ecx
; Line 6
    mov eax, 4
    imul    ecx, eax, 0
    add ecx, DWORD PTR _u$[ebp]
    mov DWORD PTR _B_beg$[ebp], ecx
; Line 8
    mov DWORD PTR _result$[ebp], 0
; Line 11
    mov eax, DWORD PTR _A_beg$[ebp]
    mov ebx, DWORD PTR _B_beg$[ebp]
    mov ecx, DWORD PTR _n$[ebp]
    mov edi, DWORD PTR _v$[ebp]
    lea edi, DWORD PTR [edi+ecx*4]
    mov esi, DWORD PTR _u$[ebp]
    lea esi, DWORD PTR [esi+ecx*4]
    jmp SHORT $LN4@dot_produc
$LN2@dot_produc:
    add eax, 4
    add ebx, 4
$LN4@dot_produc:
    cmp eax, edi
    jae SHORT $LN3@dot_produc
    cmp ebx, esi
    jae SHORT $LN3@dot_produc
; Line 12
    imul eax, ebx
    add DWORD PTR _result$[ebp], eax
    jmp SHORT $LN2@dot_produc
$LN3@dot_produc:
; Line 13
    mov eax, DWORD PTR _result$[ebp]
; Line 14
    pop edi
    pop esi
    pop ebx
    mov esp, ebp
    pop ebp
    ret 0
    dpp_pointerr ENDP           ; dot_product_pointer
_TEXT   ENDS

END

0 个答案:

没有答案