0

C でプログラムを作成して、char* のprocessedData を生成しました。アセンブリ プログラムに送信し、レジスタに入れます。

mov     edx, [ebp+12]
mov     edi, edx

どうすればcharを書き込むことができますか。char と inc edi を記述する必要があることはわかっています... それをループします。しかし、どうすればcharを書き込むことができますか?私はすでに値を別のレジスタに持っています. しかし、edx を移動すると、49; char コード ポインターを失います。私は何かをしたい

for(p=malloc(100*sizeof(char*)); p!=NULL;p++){
    *p=//my char code
}

Linux (DEBIAN) x86 用アセンブリ

4

1 に答える 1

1

edxcharの宛先のアドレスです。つまり、edx書き込みたい場所へのポインタです。したがって、これを行います。

mov byte ptr ds:[edx], 49

これでもうまくいくかもしれません:

mov byte ptr ds:[edx], '1'

あなたはあなたのキャラクターがすでにいくつかのレジスターにいると言います。私はそれが8ビットレジスタ(ah/al/bh/bl/ch/cl/dh/dl)であると仮定します、その場合あなたはただすることができます:

mov [edx], ah

この場合、アセンブラはデータ[edx]が指しているサイズを推測できます。


私は今Windowsを使用しているので、このコードはVC++用です。文字列のコピーを示します。

#include <stdlib.h>
#include <stdio.h>

char src[] = "hello";
char dest[8];

int main( void )
{
   __asm
   {
      xor ecx, ecx

      mov eax, offset src
      mov edx, offset dest

        loop_dest:

      mov bh, byte ptr ds:[eax+ecx]
      mov [edx+ecx], bh

      inc ecx
      cmp ecx, size src
      jnz loop_dest
   }

   printf("%s\n", dest);
   return EXIT_SUCCESS;
}

アセンブラがAT&T構文を使用している場合は、マイナーな変換を行う必要がありますが、これが正しい方向を示していることを願っています。

于 2012-05-03T21:07:06.887 に答える