Visual Studio を使用し、C++ からアセンブリを呼び出しています。引数をアセンブリに渡すとき、最初の引数は ECX にあり、2 番目の引数は EDX にあることを知っています。最初に ECX を EAX にコピーしないと、2 つのレジスタを直接比較できないのはなぜですか?
C++:
#include <iostream>
extern "C" int PassingParameters(int a, int b);
int main()
{
std::cout << "The function returned: " << PassingParameters(5, 10) << std::endl;
std::cin.get();
return 0;
}
ASM: 2 つのレジスタを直接比較すると、間違った値が返されます。
.code
PassingParameters proc
cmp edx, ecx
jg ReturnEAX
mov eax, edx
ReturnEAX:
ret
PassingParameters endp
end
しかし、このように書くと正しい値が得られ、2 つのレジスタを直接比較できます。なぜでしょうか?
.code
PassingParameters proc
mov eax, ecx ; copy ecx to eax.
cmp edx, ecx ; compare ecx and edx directly like above, but this gives the correct value.
jg ReturnEAX
mov eax, edx
ReturnEAX:
ret
PassingParameters endp
end