哪些汇编指令或场景明确要求使用 RCX、ECX、CX 或 CL 计数器寄存器?

ven*_*ngy 3 assembly x86-64 masm nasm calling-convention

读完这个问题后为什么 %cl 是 sal 操作接受作为参数的唯一寄存器?,我很好奇还有哪些指令需要计数寄存器?

\n

循环控制

\n

LOOP 指令假定 CX、ECX 或 RCX 寄存器包含循环计数。

\n
loop\nloopnz\nloopne\nloopz\nloope\n
Run Code Online (Sandbox Code Playgroud)\n

跳跃

\n

如果 CX、ECX 或 RCX 寄存器为零,则执行跳转的跳转指令。

\n
jcxz\njecxz\njrcxz\n
Run Code Online (Sandbox Code Playgroud)\n

重复前缀

\n

这些重复前缀与字符串指令一起使用并使用计数寄存器。

\n
rep\nrepe\nrepz\nrepne\nrepnz\n
Run Code Online (Sandbox Code Playgroud)\n

位移位

\n

逻辑、移位、循环和位指令(省略了双字和四字变体,例如 shld、shlq...)

\n
shl\nshr\nsal\nsar\nrol\nror\nrcl\nrcr\n
Run Code Online (Sandbox Code Playgroud)\n

Fastcall 调用约定

\n

参数列表中从左到右找到的前两个 DWORD 或更小的参数被传入ECXEDX 寄存器;所有其他参数都在堆栈上从右向左传递。

\n
__attribute__((fastcall)) void printnums(int num1, int num2, int num3){\n    printf("The numbers you sent are: %d %d %d", num1, num2, num3);\n}\n\nint main(){\n    printnums(1, 2, 3);\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Microsoft x64 调用约定

\n

在 Microsoft x64 调用约定中,前四个整数或指针参数将传递给RCX、RDX、R8 和 R9 寄存器中的函数。如果参数超过四个,则剩余参数将在堆栈上传递。

\n

系统 V AMD64 ABI

\n

前六个整数或指针参数在寄存器 RDI、RSI、RDX、...、R8、R9 中传递RCX

\n

问题

\n

还有其他场景需要使用计数器寄存器吗?

\n

最好的检查位置是Intel\xc2\xae 64 和 IA-32 架构软件开发人员\xe2\x80\x99s 手册的组合卷集吗

\n

Pet*_*des 5

在http://ref.x86asm.net/coder32.html / http://ref.x86asm.net/coder64.html中搜索“CX”和“CL” ,因为它们有一列用于隐式操作数。

您已经提到的隐式用途或 rCX:

  • 可变计数移位/旋转/shrd/shld(BMI2shlx等除外)
  • j*cxz//looploop[n]e
  • rep/rep[n]e字符串操作

其他隐式用途或 rCX:

  • cpuid- 输入(对于某些 EAX 值,EAX=叶,ECX=子叶)以及输出
  • xgetbv/ xsetbv(扩展控制寄存器访问,例如用于检查操作系统启用的 AVX)
  • SSE4.2 pcmpistri/ pcmpestri- 第一个匹配的索引
  • monitor/ mwait(电源管理扩展)
  • rdmsr/ wrmsr(MSR 号)
  • rdtscp(处理器 ID 输出)
  • 非 64 位模式pusha/ popa(以及所有其他旧版注册表)
  • syscall(用用户空间 RIP 编写,以便内核可以返回)

对 coder32 和 coder64 表的搜索错过了以下内容,因为 rCX 是 的一部分...

  • cmpxchg16b- RCX:RBX 输入的一部分。(RDX:RAX 是另一个非内存输入)。cmpxchg8bECX 也一样。
  • 可能还有其他我没有想到的。

还有你已经提到过的:

  • 标准调用约定

相关:为什么RBP和RSP被称为通用寄存器?- 除了 r8-r15 中的一些寄存器之外,几乎每个寄存器都有隐式用途。