x86 程序集比较参数
x86 Assembly Compare Arguments
我正在使用Visual Studio并从C++调用汇编。我知道当您将参数传递给程序集时,第一个参数在 ECX 中,第二个参数在 EDX 中。为什么我不能在不先将 ECX 复制到 EAX 的情况下直接比较两个寄存器?
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:在直接比较两个寄存器时,这会给出错误的值。
.code
PassingParameters proc
cmp edx, ecx
jg ReturnEAX
mov eax, edx
ReturnEAX:
ret
PassingParameters endp
end
但是如果我这样写,我得到正确的值,并且可以直接比较两个寄存器,这是为什么呢?
.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
在你的第一个版本中,如果jg
被采用,你离开eax
时完全像进入函数时一样(即,我们几乎不知道)。由于返回值通常以 eax 为单位,因此每当采用jg
时,都会给出未定义的返回。换句话说,你写的东西大致是这样的:
int PassingParameters(int a, int b) {
if (a < b)
return a;
}
在这种情况下,如果a==b
或a>b
,则返回值为垃圾。
在第二个代码序列中,您将一个值加载到 eax 中。然后,如果没有采用 jg,您将其他值加载到 eax 中。无论哪种方式,返回值都将是一个输入参数或另一个输入参数(取决于哪个更大)。换句话说,您拥有的大致相当于:
int PassingParameters(int a, int b) {
if (a<b)
return a;
return b;
}
附言我还要指出,您的代码看起来像 x86,而不是 64 位代码。对于 64 位代码,您应该使用 RAX、RCX 等,而不是 EAX、ECX 等。
相关文章:
- 没有默认构造函数作为模板参数的自定义比较器
- C++复杂情况的比较器通过参数问题
- 为什么 std::stable_sort() 的比较函数的参数必须是设置常量?
- C++模板参数之间的比较似乎被忽略了
- 在C++排序中为比较函数指定参数
- 在c++中隐藏不同的std::map比较参数
- 为什么比较函数类型需要指定为模板参数?
- 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误
- 如何将参数传递到自定义比较C 中分类的函数
- 比较优先队列中的参数
- C++函数来返回基于参数的比较器通用映射类型?
- find_if中的模板比较器作为第三个参数
- 与自定义比较函数作为模板参数的编译器错误
- C++ 比较命令行参数与 strcmp
- 带有额外参数的排序列表以进行比较功能
- 当参数相等时,为什么必须std :: sort比较函数返回false
- C++比较运算符重载中第一个参数为 null 时出现分段错误
- 比较终端中通过char *argv []的参数
- 重载比较运算符 C++,如何与 const 参数进行比较
- C++参数比较