簡體   English   中英

在嵌入式x86組件中添加陣列?

[英]Adding an array in embedded x86 assembly?

我是匯編代碼並將其嵌入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逐行查看程序中斷到哪一行,並且程序第二次通過循環時中斷。

因此,如果有人可以幫助我弄清楚如何解決該問題,我將不勝感激。

在我看來,它已經壞了很多。 首先,您有一個名為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
    }
}

請注意,我們並不是要獲取數組的偏移量 ,而是要獲取指針的偏移量 ,我們需要獲取指針的值,即第一個數組項的地址。 另外,請注意,我已經硬編碼了元素大小(4),沒有一點像我們可以處理任何東西那樣,如果在上一行中,我們添加了32位字。 xor eax, eax只是將寄存器設置為零的另一種方法,老實說,在當今的CPU中,我不確定它是否更快。)

並且在測試時,請不要忘記將結果實際傳遞給printf_s

代碼的問題似乎是您使用的是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 ,最好將數組作為命名參數傳遞,並將其作為長度傳遞,並在匯編代碼中使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM