2017-05-09 98 views
-1

按照DOCO我可以找到关于调用Windows函数,应用如下: -窗口64位调用约定

微软64位调用约定[12] [13]随后在Windows和预启动UEFI(用于在x86-64上的长模式)。它使用寄存器RCX,RDX,R8,R9作为前四个整数或指针参数(按此顺序),并将附加参数压入堆栈(从右到左)。如果64位或更少,整数返回值(类似于x86)将在RAX中返回。

在Microsoft x64调用约定中,调用者有责任在调用函数之前在堆栈上分配32个字节的“影子空间”(不管实际使用的参数数量是多少),并在弹出堆栈后弹出堆栈呼叫。阴影空间用于溢出RCX,RDX,R8和R9,但是必须使所有功能都可用,即使参数少于4个也是如此。

。寄存器RAX,RCX,RDX,R8,R9,R10,R11被认为是易失性(呼叫者保存)。[15]

。寄存器RBX,RBP,RDI,RSI,RSP,R12,R13,R14,和R15被认为是非易失性的(被调用方保存)。[15]

所以,我一直在呼吁愉快KERNEL32直到在某些情况下未能调用“GetEnvironmentVariableA”。我终于追溯到这样一个事实,即直接旗帜已经确定,我需要清除它。

我的问题。直到现在,我还没有找到任何提及这一点的信息,并想知道在通话之前总是清除它是否明智。或者也许会导致其他问题。任何人都知道打电话的约定在这种情况下

81分钟前

回答

0

窗口假设direction flag被清除。尽管在文章中提到了关于C的运行时间,但对于整个窗口来说这是真的(因为Windows代码本身主要写在c/C++上)。所以当你的程序开始执行 - 你可以假设DF是0.通常你不需要改变这个标志。然而,如果在一些内部例行你暂时改变它(设置为1),则必须调用任何Windows API或任何外部模块(因为它假设DF为0)之前CLD清除它。

所有窗口中断在非常开始执行明确DF 0 - 所以这是安全的临时集合DF至1自己的内部代码,主 - 之前的任何外部调用重置回0