在嵌入式x86程序集中添加数组?

时间:2011-02-12 18:11:45

标签: c++ visual-studio assembly x86

我是汇编编码的新手,并将其嵌入到C ++中,我要做的就是使用汇编在数组中添加整数。这是我到目前为止的代码:

#include <iostream>
#include <stdio.h>
int x [] = {5,4,3,2,1};
int sumArray(int [5]);
int main()
{
    sumArray(x);
    printf_s("The sum of the array is %d");
}
int sumArray(int [5])
{
    __asm
    {
        mov edi,OFFSET sumArray
        mov ecx,5
        mov eax,0
    L1:
        add eax,[edi]
        add edi, TYPE sumArray
        loop L1
    }
}

我遇到的一个原始问题是 mov ecx 我把它作为

mov ecx,LENGTHOF sumArray

但它不会编译所以我将其更改为5并编译。所以现在当我运行该程序时,它会中断。我在Visual Studio中使用F11逐行查看程序中断的行,以及第二次循环时程序中断。

所以,如果有人能帮助我弄清楚如何修复它,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

在我看来,你已经打破了很多。首先,您有一个名为sumArray函数,带有未命名的参数。但是在函数内部,您指的是sumArray,就好像它是数组参数的名称一样。然后,您需要了解C(++)将数组作为参数传递的方式:它们(始终)通过引用传递,作为指向第一个数组成员的指针。并且它还意味着函数(通常)不知道数组的长度(除非您将其设置为固定大小)。所以,你通常在另一个参数中传递长度。这意味着我们有以下内容:

int sumArray(int arr[], int len)
{
    __asm
    {
        mov edi, arr
        mov ecx, len
        xor eax, eax
    L1:
        add eax, [edi]
        add edi, 4
        loop L1
    }
}

请注意,我们并没有尝试获取数组的 offset ,这会让我们得到指针,我们需要获取指针的值,即第一个数组项的地址。另外,请注意我已经硬编码了元素大小(4),没有任何一点像我们可以使用任何东西,如果在前一行,我们添加32位字。 (xor eax, eax只是另一种将寄存器设置为零的方法,老实说,在今天的CPU中,我不确定它是否更快。)

在测试时,不要忘记将结果实际传递给printf_s ...

答案 1 :(得分:1)

您的代码的问题似乎是您正在使用sumArray函数名而不是实际的数组x,这就是它崩溃的原因。

你的asm不应该是这样的:

__asm
{
    mov edi,OFFSET x
    mov ecx,LENGTHOF x
    mov eax,0
L1:
    add eax,[edi]
    add edi, TYPE x
    loop L1
}

? (在这里我假设,你没有误用宏的用法,因为我从来没有用MASM编译任何东西,这似乎在这里使用,但我认为你有了这个想法)

另一个问题是为什么你将未命名的参数传递给sumArray如果你实际上没有使用它,你最好将数组作为命名参数传递它的长度并在程序集中使用它们代码。