在c++中使用内联程序集更改数值

Changing a number value using an inline assembly in C++

本文关键字:程序集 c++      更新时间:2023-10-16

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

这个值没有改变

实际上是在增加x的值。X在汇编语言中是包含函数foox变量地址的常量。反过来,它包含mainx的地址。因此,inc [x]导致指针自增。您需要增加存储在地址[x]的值,就像inc [[x]]一样。当然,在汇编语言中,你不能在一条指令中做到这一点,因为你需要两次内存访问:知道值存储在的位置,并实际增加值。所以我建议这样写代码:

push eax
mov eax, [x]
inc dword ptr [eax]
pop eax

了解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 

与Aneri的回答相同。

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

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