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就汇编语言而言,是一个包含x变量(函数foo)地址的常量。其中又包含main's的地址x。因此,inc [x]导致指针的增量。您需要增加存储在地址中的值[x],例如inc [[x]]. 当然,你不能用汇编语言的一条指令来完成,因为你需要两次内存访问:知道的存储位置和实际增加值。所以我建议这样的代码:

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

也许了解 Visual C++ 如何增加 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 

在发布模式下与 Aneri 的回答相同。

于 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 回答