ven*_*ngy 3 assembly x86-64 masm nasm calling-convention
读完这个问题后为什么 %cl 是 sal 操作接受作为参数的唯一寄存器?,我很好奇还有哪些指令需要计数寄存器?
\n循环控制
\nLOOP 指令假定 CX、ECX 或 RCX 寄存器包含循环计数。
\nloop\nloopnz\nloopne\nloopz\nloope\nRun Code Online (Sandbox Code Playgroud)\n跳跃
\n如果 CX、ECX 或 RCX 寄存器为零,则执行跳转的跳转指令。
\njcxz\njecxz\njrcxz\nRun Code Online (Sandbox Code Playgroud)\n重复前缀
\n这些重复前缀与字符串指令一起使用并使用计数寄存器。
\nrep\nrepe\nrepz\nrepne\nrepnz\nRun Code Online (Sandbox Code Playgroud)\n位移位
\n逻辑、移位、循环和位指令(省略了双字和四字变体,例如 shld、shlq...)
\nshl\nshr\nsal\nsar\nrol\nror\nrcl\nrcr\nRun Code Online (Sandbox Code Playgroud)\nFastcall 调用约定
\n参数列表中从左到右找到的前两个 DWORD 或更小的参数被传入ECXEDX 寄存器;所有其他参数都在堆栈上从右向左传递。
__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}\nRun Code Online (Sandbox Code Playgroud)\nMicrosoft x64 调用约定
\n在 Microsoft x64 调用约定中,前四个整数或指针参数将传递给RCX、RDX、R8 和 R9 寄存器中的函数。如果参数超过四个,则剩余参数将在堆栈上传递。
系统 V AMD64 ABI
\n前六个整数或指针参数在寄存器 RDI、RSI、RDX、...、R8、R9 中传递RCX。
问题
\n还有其他场景需要使用计数器寄存器吗?
\n最好的检查位置是Intel\xc2\xae 64 和 IA-32 架构软件开发人员\xe2\x80\x99s 手册的组合卷集吗?
\n在http://ref.x86asm.net/coder32.html / http://ref.x86asm.net/coder64.html中搜索“CX”和“CL” ,因为它们有一列用于隐式操作数。
您已经提到的隐式用途或 rCX:
shlx等除外)j*cxz//looploop[n]erep/rep[n]e字符串操作其他隐式用途或 rCX:
cpuid- 输入(对于某些 EAX 值,EAX=叶,ECX=子叶)以及输出xgetbv/ xsetbv(扩展控制寄存器访问,例如用于检查操作系统启用的 AVX)pcmpistri/ pcmpestri- 第一个匹配的索引monitor/ mwait(电源管理扩展)rdmsr/ wrmsr(MSR 号)rdtscp(处理器 ID 输出)pusha/ popa(以及所有其他旧版注册表)syscall(用用户空间 RIP 编写,以便内核可以返回)对 coder32 和 coder64 表的搜索错过了以下内容,因为 rCX 是 的一部分...:
cmpxchg16b- RCX:RBX 输入的一部分。(RDX:RAX 是另一个非内存输入)。cmpxchg8bECX 也一样。还有你已经提到过的:
相关:为什么RBP和RSP被称为通用寄存器?- 除了 r8-r15 中的一些寄存器之外,几乎每个寄存器都有隐式用途。