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

92dk7w1h  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(111)

阅读完这个问题Why is %cl the only register the sal-operation will accept as a parameter?,我很好奇还有哪些指令需要计数寄存器?

循环控制

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

loop
loopnz
loopne
loopz
loope

字符串

跳跃

当CX、ECX或RCX寄存器为零时执行跳转的跳转指令。

jcxz
jecxz
jrcxz

重复前缀

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

rep
repe
repz
repne
repnz

移位

逻辑、移位、旋转和位指令(省略dword和qword变体,如shld、shlq...)

shl
shr
sal
sar
rol
ror
rcl
rcr

Fastcall呼叫约定

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

__attribute__((fastcall)) void printnums(int num1, int num2, int num3){
    printf("The numbers you sent are: %d %d %d", num1, num2, num3);
}

int main(){
    printnums(1, 2, 3);
    return 0;
}

Microsoft x64调用约定

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

System V AMD64 ABI

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

问题

是否有其他需要使用计数器寄存器的情况?
最好的检查地点是Combined Volume Set of Intel® 64 and IA-32 Architectures Software Developer’s Manuals吗?

9udxz4iz

9udxz4iz1#

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

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

  • 可变计数移位/旋转/ shrd/shld(BMI 2 shlx等除外)
  • j*cxz / loop / loop[n]e
  • rep/rep[n]e字符串操作
    其他隐式用法或rCX:
  • cpuid-输入(对于某些EAX值,EAX=叶,ECX=子叶)和输出
  • xgetbv/xsetbv(扩展控制寄存器访问,例如用于检查OS启用的AVX)
  • SSE4.2 pcmpistri/pcmpestri-第一个匹配的索引
  • monitor/mwait(电源管理扩展)
  • rdmsr/wrmsr(MSR编号)
  • rdtscp(处理器ID输出)
  • 非64位模式pusha/popa(沿着所有其他传统规则)
  • syscall(使用用户空间RIP编写,以便内核可以返回)

对coder 32和coder 64表的搜索遗漏了以下内容,因为rCX是...的一部分:

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

你已经提到的:

  • 标准调用约定

相关:* Why are RBP and RSP called general-purpose registers? * -几乎每个寄存器都有隐式用法,除了r8-r15中的一些。

相关问题