当前位置: 首页 > 知识库问答 >
问题:

方向标记 DF 在 Windows 64 位调用约定?

冉昊
2023-03-14

根据我可以找到的有关调用windows函数的文档,以下内容适用:-

Windows和预引导UEFI遵循Microsoft x64调用约定[12][13](适用于x86-64上的长模式)。它将寄存器RCX、RDX、R8、R9用于前四个整数或指针参数(按此顺序),其他参数被推送到堆栈上(从右到左)。如果64位或更少,则在RAX中返回整数返回值(类似于x86)。

在Microsoft x64调用约定中,调用方有责任在调用函数之前在堆栈上分配32字节的“阴影空间”(不管实际使用的参数数),并在调用后弹出堆栈。阴影空间用于溢出RCX、RDX、R8和R9[14],但必须对所有函数可用,即使是参数少于四个的函数。

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

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

所以,我一直很高兴地调用kernel32,直到在某些情况下调用GetEnvironmentVariableA失败。我最终将其追溯到方向标志DF已设置的事实,我需要清除它。

到目前为止,我还没有找到任何关于这一点的提及,我想知道在打电话之前总是把它弄清楚是否明智。

或者这可能会导致其他问题。有人知道在这种情况下打电话的惯例吗?

共有1个答案

方昊英
2023-03-14

Windows假定方向标志已清除。尽管在文章中只提到了C运行时,但这对于整个windows是正确的(我认为,因为windows代码本身主要是用C/C编写的)。因此,当您的程序开始执行时,您可以假设DF为0。通常您不需要更改此标志。但是,如果在某些内部例程中临时更改它(将其设置为1),则必须在调用任何windows API或任何外部模块之前通过cld清除它(因为它假设DF为0)。

所有窗口在执行开始时中断,将DF清除为0-因此在任何外部调用将其重置为0之前,在自己的内部代码main中将DF临时设置为1是安全的。

 类似资料:
  • 此函数应显示列表的内容,列表左侧用“[q]”标记当前元素。不幸的是,只显示普通数据。为什么? 为了完整起见,我来介绍一下初始化列表的函数:

  • 问题内容: 当用户通过锚链接导航到页面时,我希望页面向下滚动到锚标记。 我正在使用react-router 4,并且定义如下: 导航栏: 一些路线: 单击导航栏中的定位链接时,我可以在URL和Redux存储中看到哈希定位标签,它确实导航到新路线,但不会向下滚动到标签本身。 是由我来创建滚动功能还是应该如何正常工作? 问题答案: 这是React Router的已知问题。(https://github

  • 基本上,这个想法是在不使用Qgis的情况下自动化一些工作流。 我无法获得与Geopandas中Qgis功能“向点添加坐标”类似的结果,该功能允许您在当前投影中获取点的x、y坐标,并为表创建新属性。 所以我有一套我玩过的积分。原始形状文件的CRS为epsg 2154(Lambert 93)。我需要以与谷歌地图兼容的格式获取纬度和经度。 谷歌使用epsg 3857谷歌地图。 这个想法是切换到epsg

  • 调用合约的只读方法,并在EVM中直接执行方法,不需要发送任何交易。因此不会改变合约的状态。 调用: myContract.methods.myMethod([param1[, param2[, ...]]]).call(options[, callback]) 参数: options - Object : 选项,包含如下字段: from - String (optional): The addr

  • 请参考截图。我想把图标放在确切的蓝点。 我使用下面的代码来显示地图中的图标。 我不想删除蓝点(GoogleMap.SetMyLocationEnabled)。我想把图标放在那个蓝点上。

  • 我正在制作一个页面,用户在其中输入详细信息,当他提交时,页面应该被重定向到另一个显示这些详细信息的页面。但问题是window.location没有将其重定向到下一页。 超文本标记语言 JS 我也在stackowerflow上寻找类似的问题,但没有一个有效,我不知道为什么。请看看这个,因为我是新的网页设计。