5

C++でインラインアセンブリを使用して数値を増やしようとしています。私がそのようにする理由は、私の「インラインアセンブリ」スキルを練習するためです。

さて、それは私がこれまでにやったことです:

void main()
{
    int x;
    cout << "Please enter a number ";
    cin >> x;
    cout << "The number you entered is: " << x << "\n";
    foo(&x);
    cout << "The new number is: " << x;
    cin >> x;
}

void foo(int *x) 
{
    __asm
    {
        inc [x]
    };
}

そして、値は決して変わりませんでした。

4

3 に答える 3

7

x実際には、の値をインクリメントしています。アセンブリ言語に関しては、 (関数の)変数Xのアドレスを含む定数です。これには、のアドレスが含まれています。したがって、ポインタが増加します。のように、アドレスに格納されている値をインクリメントする必要があります。もちろん、2つのメモリアクセスが必要なため、アセンブリ言語の1つの命令でそれを行うことはできません。値が格納されている場所を知ることと、実際に値をインクリメントすることです。だから私はこのようなコードをお勧めします:xfoomainxinc [x][x]inc [[x]]

push eax
mov eax, [x]
inc dword ptr [eax]
pop eax
于 2013-03-10T22:31:40.680 に答える
0

VisualC++がintポインターの値をどのようにインクリメントするかを知っておくと便利かもしれません。

void foo(*x)
{
  (*x)++;
}

デバッグモードでは、次のように変換されます

(*x)++;
mov         eax,dword ptr [x] 
mov         ecx,dword ptr [eax] 
add         ecx,1 
mov         edx,dword ptr [x] 
mov         dword ptr [edx],ecx 

アネリの答えと同じリリースモードで。

于 2013-03-10T22:34:39.873 に答える
-3

x86はレジスタのみをインクリメントでき、メモリはインクリメントできないため、ポインタをレジスタに移動する必要があります。私はこれで終わりました:

__asm
{
    mov eax, x
    mov ebx, [eax]
    inc ebx
    mov [eax], ebx
};
于 2013-03-10T22:29:17.963 に答える