使用C ++中的内联汇编更改数值

时间:2013-03-10 22:15:58

标签: c++ inline-assembly

我试图通过在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]
    };
}

价值从未改变过。

3 个答案:

答案 0 :(得分:7)

实际上,您正在递增x的值。就汇编语言而言,X是一个包含x变量(函数foo)地址的常量。反过来,它包含main的{​​{1}}的地址。因此,x会导致指针的增量。您需要增加地址inc [x]中存储的值,例如[x]。当然,你不能用汇编语言的一条指令来完成它,因为你需要两个内存访问:知道 值存储的位置和实际增量价值。所以我建议像这样的代码:

inc [[x]]

答案 1 :(得分:0)

知道Visual C ++如何增加int-pointer的值可能很有用:

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 

在发布模式下和Aneri的回答一样。

答案 2 :(得分:-3)

x86只能递增寄存器而不是内存,因此需要将指针移动到寄存器。我结束了这个:

__asm
{
    mov eax, x
    mov ebx, [eax]
    inc ebx
    mov [eax], ebx
};