1

私はx86asmを学習し、masmを使用しており、次のc関数と同等のシグネチャを持つ関数を作成しようとしています。

void func(double a[], double b[], double c[], int len);

実装方法がわかりませんか?

asmファイルはwin32DLLにコンパイルされます。

これを行う方法を理解できるように、誰かがこの非常に単純な関数をasmに変換してくれませんか。

void func(double a[], double b[], double c[], int len)
{
  // a, b, and c have the same length, given by len
  for (int i = 0; i < length; i++)
    c[i] = a[i] + b[i];
}

このような関数をCで記述してコンパイルし、OllyDbgを使用してexe内の対応する逆アセンブルされたコードを調べてみましたが、関数が見つかりませんでした。

よろしくお願いします。

4

2 に答える 2

2

私はしばらくの間x86を書いていませんが、それを行う方法の一般的なアイデアをあなたに与えることができます。アセンブラが手元にないので、メモ帳に書いてあります。

func proc a:DWORD, b:DWORD, c:DWORD, len:DWORD

  mov eax, len
  test eax, eax
  jnz @f
  ret

    @@:

  push ebx
  push esi

  xor eax, eax

  mov esi, a
  mov ebx, b
  mov ecx, c

    @@:

  mov edx, dword ptr ds:[ebx+eax*4]
  add edx, dword ptr ds:[ecx+eax*4]
  mov [esi+eax*4], edx
  cmp eax, len
  jl @b

  pop esi
  pop ebx

  ret  

func endp

上記の関数はstdcallに準拠しており、引数が整数の場合、ほぼx86に変換されます。残念ながら、doublesを使用しています。ループは同じですが、算術演算を行うにはFPUスタックとオペコードを使用する必要があります。私はしばらくそれを使用しておらず、残念ながら頭のてっぺんからの指示を思い出せませんでした。

于 2011-09-02T13:01:31.740 に答える
0

配列のメモリアドレスを渡す必要があります。次のコードを検討してください。

.data?
array1 DWORD 4 DUP(?)

.code
         main PROC

                      push LENGTHOF array1
                      push OFFSET array1
                      call arrayFunc             
         main ENDP

         arrayFunc PROC
                                   push ebp
                                   mov ebp, esp
                                   push edi

                                   mov edi, [ebp+08h] 
                                   mov ecx, [ebp+0Ch]
                                   L1:

                                  ;reference each element of given array by [edi]
                                  ;add "TYPE" *array* to edi to increment
                                   loop L1:
                                   pop edi
                                   pop ebp
                                   ret 8
         arrayFunc ENDP
         END main

概念を理解できるように、このコードを作成しました。プログラムの目標を達成するためにレジスターの使用法を適切に把握する方法を理解するのはあなたに任せています。

于 2011-09-25T06:57:38.110 に答える