C++ 为什么我的内联汇编程序不能按预期工作?

C++ 为什么我的内联汇编程序不能按预期工作?,c++,visual-studio-2010,inline-assembly,C++,Visual Studio 2010,Inline Assembly,也许我错过了一些关于函数或其他的东西? 我使用VS2010。 这是我的密码: #include <iostream> void swap (int& a, int& b) { __asm push a __asm push b __asm pop a __asm pop b std::cout << "Inline function check: a=" << a << " b="

也许我错过了一些关于函数或其他的东西? 我使用VS2010。 这是我的密码:

#include <iostream>

void swap (int& a, int& b)
{
     __asm push a
     __asm push b
     __asm pop a
     __asm pop b
     std::cout << "Inline function check: a=" << a << " b=" << b << "\n\n";
}

void main()
{
    int arg1=1, arg2=9000;
    std::cout << "Before swap we have: a=" << arg1 << " b=" << arg2 << "\n\n";
    swap(arg1, arg2);
    std::cout << "After swap we have: a=" << arg1 << " b=" << arg2;
    std::cin.get();
}
#包括
无效掉期(内部和a、内部和b)
{
__推
__asm推送b
__流行音乐
__asm流行音乐b

std::cout内联程序集不知道引用,因此您交换的是参数,而不是它们的值


引用通常作为指针实现,在这种情况下,交换的是指针,而不是值。

使用Visual Studio传递引用时,编译器传递引用变量的地址。交换实际上是交换传递给swap函数的地址;实际上不是交换e内容

为了交换内容,您需要取消对指针的引用。不幸的是,编译器不允许您直接这样做,因此您必须使用寄存器

下面是一个简短的示例。这只是一个演示;如果您直接访问堆栈,而不是使用
a
b
,则可以用少得多的指令交换这两个变量。需要注意的是,只有使用寄存器才能修改内存

void swap(int& a, int& b) {
__asm {
    // Preserve our registers
    push eax 
    push ebx 
    push ecx 
    push edx 
    // Store the address of a in eax and b in ebx
    mov eax, a
    mov ebx, b
    // Store the value of a in ecx and b in edx
    mov ecx, [eax]
    mov edx, [ebx]
    // Swap the values pointed to by a and b
    mov [eax], edx
    mov [ebx], ecx
    // Restore the registers
    pop edx
    pop ecx
    pop ebx
    pop eax
}
}

你能显示输出吗?在交换之前,我们有:a=1 b=9000内联函数检查:a=9000 b=1在交换之后,我们有:a=1 b=9000我想当你通过引用(实际上是一个指针)传递时,汇编程序正在使用a作为指针,因此在交换中,你正在交换指针(引用)在函数的主体中,我们可以看到交换是成功的,但是在一些函数中,有些是失败的。哦,对不起,我的英语今天不好。它似乎在函数中起作用,因为指针被交换了,现在A指向B,反之亦然,所以调试U现在在C++中出现了。显示正确的答案。现在我完全糊涂了。我已经重写了我的函数,但它不起作用:无效交换(int*a,int*b){int c**a,d=*b;yasyaspas.d,as.pas.as.PO.d=&c;b= &d;sd::cout,所以我使用了寄存器。但是它仍然不起作用。函数交换值但没有任何影响。我有一个感觉,我理解C++是如何工作的。这是一个大问题。应该避免内联汇编程序。编译器不必满足任何排序。标准,所以它可以根据您的指示做任何事情。我添加了一个示例。