2015-11-10 1 views
0

J'ai besoin de créer un sous-programme d'assemblage qui prend un tableau de mots doubles et le multiplie par un nombre entier. J'ai mes fichiers main.cpp, multarray.h et multarray.asm ci-dessous. Je dois faire la fonction à la fois dans l'assemblage et c + + puis comparer le temps d'exécution des deux. Je reçois deux erreurs qui sont collées ci-dessus au-dessus de mon code. S'il vous plaît aider, car je ne suis pas sûr pourquoi je reçois cette erreur.Sous-programmes C++ et d'assemblage

Erreurs:

erreur 2 Erreur A1010: imbrication de bloc inégalée: AsmMultArray F: \ Project Assemblée \ Assembly Project \ lab8.asm 25 1 Assemblée erreur de projet 3 erreur MSB3721: La commande « ml .exe/c/nologo/Zi /Fo"Debug\lab8.obj "/Fl".lst"/I "c: \ Irvine"/W3/errorReport: invite /Talab8.asm "est sorti avec le code 1.

Code:

**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); 

} 

fichier .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

Je vérifiais juste: la fonction 'CMultArray' est pas dans le fichier asm, non? En outre, cela a un point-virgule manquant. – Jester

+0

Les erreurs se produisent toujours après avoir ajouté dans le point-virgule –

+0

Vous ne pouvez pas coller le code C dans le fichier asm ... – Jester

Répondre

0

Lorsque vous utilisez la bibliothèque Irvine32 en utilisant INCLUDE Irvine32.inc le model est automatiquement réglé sur .MODEL small de sorte qu'il peut être retiré en toute sécurité à partir de votre code (et un avertissement disparaîtra).

Votre fichier assembleur ne contient pas de données globales/statiques. Par conséquent, la section .data peut être supprimée.

PROC s (fonctions) doivent être placés dans la section .code si .code doit apparaître avant la définition du PROC. Ne pas le faire va confondre l'assembleur.

Puisque vous appellerez votre code de C/C++, vous devez spécifier que votre code assembleur utilisera le C convention d'appel quand il génère le code de prologue et l'épilogue approprié pour le PROC . Cela inclut la mise en place d'une trame de pile et de pousser/popping paramètres, et l'accès aux arguments passés dans le bon ordre. Il préfixe automatiquement le nom de votre fonction avec un caractère de soulignement. Pour ce faire, vous modifiez la définition PROC à PROC C USES au lieu de PROC USES (Merci @rkhb).

La fin du fichier assembleur nécessitait une END comme dernière instruction du fichier.

Sur la base des suggestions ci-dessus, votre dossier devrait fonctionner si elle a été modifiée pour ressembler à ceci:

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

Génial! Je vous remercie! –