我试图通过在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]
};
}
价值从未改变过。
答案 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
};