C ++和Assembly子例程

时间:2015-11-10 00:10:46

标签: c++ visual-studio-2012 assembly masm irvine32

我需要创建一个汇编子程序,它接受一个双字数组并乘以一个整数。我有下面的main.cpp,multarray.h和multarray.asm文件。我必须在程序集和c ++中执行该功能,然后比较两者的运行时间。我收到两个错误,粘贴在我的代码上方。请帮助,因为我不知道为什么我会收到此错误。

错误:

  

错误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
        }
}

1 个答案:

答案 0 :(得分:0)

使用INCLUDE Irvine32.inc使用 Irvine32 库时,model会自动设置为.MODEL small,因此可以安全地从代码中删除(并发出警告)将消失)。

您的汇编程序文件没有全局/静态数据,因此可以删除.data部分。

PROC (函数)需要放入.code部分,因此.code必须出现在 PROC 的定义之前。如果不这样做会使汇编程序混淆。

由于您将从 C / C ++ 调用代码,因此需要指定汇编程序代码将使用 C 调用约定当它为 PROC 生成适当的序言和结尾代码时。这包括设置堆栈帧和推/弹参数,以及访问以正确顺序传递的参数。它还会使用下划线自动为您的函数名称添加前缀。要执行此操作,请将 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