visual studio 2012 — подпрограммы на C ++ и ассемблере

Мне нужно создать подпрограмму сборки, которая принимает массив из двух слов и умножает его на целое число. У меня есть файл main.cpp, multarray.h и multarray.asm ниже. Я должен сделать функцию как на ассемблере, так и на С ++, а затем сравнить время выполнения обоих. Я получаю две ошибки, которые вставлены ниже моего кода. Пожалуйста, помогите, поскольку я не уверен, почему я получаю эту ошибку.

Ошибки:

Ошибка 2, ошибка A1010: несоответствие вложенности блоков:
AsmMultArray F: \ Assembly Project \ Assembly
Project \ lab8.asm 25 1 Сборка Проект Ошибка 3 Ошибка MSB3721:
команда «ml.exe / c / nologo / Zi /Fo»Debug\lab8.obj» /Fl».lst «/ I
«c: \ Irvine» / W3 / errorReport: prompt /Talab8.asm «завершен с кодом 1.

Код:

**Main.cpp**
#include <iostream>
#include <time.h>
#include "multarray.h"
using namespace std;

int main() {
long arr1[10] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
const int multiplier = 7;
time_t startTime, endTime;

//Testing the C++ function

time(&startTime);
CMultArray(multiplier, arr1, 10);
time(&endTime);

cout<<"The time taken to run C++ function is: " <<long(endTime - startTime)<< " seconds.";

//Testing the assembly language procedure
time(&startTime);
AsmMultArray(multiplier, arr1, 10);
time(&endTime);

cout<<"The time taken to run Assembly language procedure is: "<<long(endTime      - startTime)<< " seconds.";

return 0;
}

multarray.h

#include <stdio.h>
extern "C"{
//call to assembly language procedure
void AsmMultArray(long multiplier, long arr1[], long count);

//call to c++ language function
void CMultArray(long multiplier, long arr1[], long count);

}

.ASM файл

INCLUDE Irvine32.inc
TITLE MultArray Exmaple

; This program creates the procedure that multiplies the doubleword array by an
; Integer in both assembly and C++ languages and compares the execution times

.MODEL small
.data
AsmMultArray PROC USES edi eax ebx,
multiplier: DWORD, arrPtr: DWORD, count: DWORD

.code
mov edi, arrPtr
mov ebx, multiplier
mov ecx, count

L1:
mov eax,[edi]
mul ebx
mov [edi],eax
add edi,4
loop L1
ret

AsmMultArray ENDP

.

void CMultArray(long multiplier, long arr1[], long count)
{
for(int i=0;i<count;i++)
{
arr1[i]=arr1[i]*multiplier
}
}

0

Решение

При использовании Irvine32 библиотека с помощью INCLUDE Irvine32.inc model автоматически устанавливается на .MODEL small так что он может быть безопасно удален из вашего кода (и предупреждение исчезнет).

Ваш файл ассемблера не имеет глобальных / статических данных, поэтому .data раздел может быть удален.

PROCs (функции) должны быть помещены в .code раздел так .code должно появиться до определения PROC. Невыполнение этого приведет в замешательство ассемблер.

Поскольку вы будете называть свой код из С/C ++, вам нужно указать, что ваш ассемблерный код будет использовать С соглашение о вызове, когда он генерирует соответствующий код пролога и эпилога для PROC. Это включает в себя настройку стекового фрейма и параметров push / popping, а также доступ к аргументам, переданным в правильном порядке. Кроме того, автоматически префикс имени вашей функции подчеркивания. Для этого вы меняете PROCопределение для PROC C USES вместо PROC USES (Спасибо, @rkhb).

Конец файла ассемблера потребовал END как последнее утверждение файла.

Исходя из приведенных выше предложений, ваш файл должен работать, если он был изменен так:

INCLUDE Irvine32.inc
TITLE MultArray Example

; This program creates the procedure that multiplies the doubleword array by an
; Integer in both assembly and C++ languages and compares the execution times

.code
AsmMultArray PROC C USES edi eax ebx,
multiplier: DWORD, arrPtr: DWORD, count: DWORD

mov edi, arrPtr
mov ebx, multiplier
mov ecx, count

L1:
mov eax,[edi]
mul ebx
mov [edi],eax
add edi,4
loop L1
ret

AsmMultArray ENDP
END
0

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

Других решений пока нет …

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