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

Windows 64 ABI,如果我不调用Windows API,是否正确使用寄存器?

王嘉木
2023-03-14

正如在另一个问题中给我的建议,我检查了windows ABI,但如果我自己不调用windows API,我会对我能做什么和不能做什么感到有点困惑。

我的场景是,我正在编程.NET,需要在asm中针对特定处理器的一小块代码,用于对数组进行大量多遍处理的时间关键代码段。

在https://msdn.microsoft.com/en-us/library/9z1stfyw.aspx检查ABI中的注册信息时

我有点困惑如果我

1)不要从asm代码调用windows API

RCX:我需要保留它,因为这是单个int参数将被传递的地方,然后我可以覆盖它,而不是恢复它

rdx/r8/r9:不应该初始化,因为在我的方法中没有这样的参数,我可以覆盖这些参数而不还原它们

r10/r11:我可以覆盖那些不保存它们,如果调用者需要它,他负责保存它们

如果是这样的话,这是正确的处理方法吗(如果我不关心保存数据所花费的时间,并且需要尽可能多的可用寄存器)?还是有办法使用更多的寄存器?

; save required registers

push r12
push r13
push r14
push r15
push rdi
push rsi
push rbx

; my own array processing code here, using rax as the memory address passed as the first parameter
; safe to use rax rbx rcx rdx r8 r9 r10 r11 r12 r13 r14 r15 rdi rsi giving me 14 64bit registers
; 1 for the array address 13 for processing
; should not touch rbp rsp

; restore required registers


pop rbx
pop rsi
pop rdi
pop r15
pop r14
pop r13
pop r12

共有1个答案

易风华
2023-03-14

您只需要保留您使用的寄存器。如果你不使用所有的这些,你就不需要保存所有的。

您可以自由使用RAXRCXRDXR8R9R10R11。后两者必须由调用方保留,如果需要的话,而不是由您的函数保留。

大多数时候,这些寄存器(或它们的子寄存器,如eax)就足以满足我的目的了。我几乎不需要更多。

使用此MSDN页面作为指南。

 类似资料:
  • 问题内容: 我想在Java中使用池化连接(因为每个线程创建一个连接非常昂贵),所以我正在使用该对象。我正在跨线程保留我的数据源。因此,我在整个应用程序中仅使用一个数据源,如下所示: 现在,我已经创建了数据源,然后在每个单独的线程中执行以下操作: 我猜我很困惑, 这真的 是在 获取池连接吗? 这个线程安全吗?我注意到PooledConnection具有诸如notify()和wait()之类的方法…这

  • 问题内容: 如果我正确使用通道,是否需要使用互斥锁来防止并发访问? 问题答案: 如果正确使用通道,则不需要互斥。在某些情况下,使用互斥锁的解决方案可能会更简单。 只需确保包含通道值的变量已正确初始化,然后使用多个goroutine尝试访问通道变量即可。一旦完成,按设计访问通道(例如,向它们发送值或从中接收值)是安全的。 带有参考文献的证明文件(重点由我添加): 规格:渠道类型: 单个信道 ,可以使

  • 在我的JavaSpringMVC应用程序中,我有一个返回用户的DAO。DAO经常被命中,所以我尝试缓存用户。 我是这样做的(如下),但我不知道我是否做对了。 我在想使得它只运行一次,并且所有其他时间的值都将从缓存中加载。 和上的和会在发生更新或删除时清除缓存。 那是正确的吗?如果是,什么时候使用合适?

  • 问题内容: 我在这里读到,系统调用用于在Linux中创建线程。现在,语法的是这样的,就需要启动程序/函数地址传递给它。 但是在此页面上,此内容是内部调用的。所以我的问题是,由子程序创建的子进程如何开始运行调用后的代码部分,即它如何不需要以函数为起点? 如果我提供的链接信息不正确,请引导我找到一些更好的链接/资源。 谢谢 问题答案: 对于此类问题,请始终阅读源代码。 从glibc (GitHub)(

  • 我试图在反应应用程序中显示时间,并希望以12小时的格式显示。 我编写了一个函数,如果小时数显示为13或以上,则删除“12”。我想将该函数传递到setState,但仍然会得到一个语法错误。 我希望看到下午1:31,但我只是在setState行中出现了语法错误。我无法忘记这一点。 除此之外,我在之前的状态下如何通过?

  • 在x86-64中,如果某些通用寄存器比其他寄存器更受欢迎,某些指令会执行得更快吗? 例如,会比执行得更快吗?我可以想象后者需要一个REX前缀,这会使指令获取速度变慢? 使用代替怎么样?或呢?其他操作?更小的寄存器,如vs?vs? AMD vs Intel?更新的处理器?较旧的处理器?指令的组合? 澄清:某些通用登记册是否应该优先于其他登记册,它们是哪些?