2012-02-23 10 views
2

アセンブリで配列を単純に集計しようとしています。アセンブリ言語での配列アクセス

int main(){ 
int a[5] = {1, 2, 3, 4, 5}; 
int result; 

_asm{ 
    mov ecx, 5 ;set the counter for 5 
    mov eax, 0 ;zero eax 
NXT: add eax, [esi*4+a] ;add array value 
     inc esi ;increase esi to read next value 
     LOOP NXT ;loop back to next 

    mov [result], eax ;mov eax into result 

    } 

printf("result: %u",result); 

かかわらず、配列の値が何であるかの、それは常に私は、Mac上で実行しようとしている2.

に合計します。

私が使用してコンパイルしています:

gcc -fasm-blocks -m32 -c sum.cpp 

gcc -arch i386 -g -o sum sum.o 

とのリンク、私はいろいろなことを試してみたが、私はそれが配列を合計するように見えることはできません。

答えて

3

esiを何かに初期化していないようですので、ループの開始時にいくつかのランダムな値が含まれています。

aが(それはすべての後に、ローカル変数である)非固定た場所に存在しているためまた、あなたが最初のレジスタにaのアドレスをロードする必要があります。

lea ebx, a 
... 
add eax, [esi*4+ebx] 

私はあなたを疑いますインラインアセンブラは[esi*4+a]で間違ったことをしています。

+0

ゼロに初期化されます。私はasmステートメントで 'mov [result]、esi'を実行するだけでこれをテストしました。 – lcs

+4

@millsj、あなたはesiが0に設定されているのを_rely_すべきではありません。明示的にそれを強制する必要があります。 – paxdiablo

+0

@paxdiabloが分かりやすいので、最初に行を追加して0に設定しましたが、出力に変更はありませんでしたが、それでも2を読みます。 – lcs