阅读完这个问题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吗?
1条答案
按热度按时间9udxz4iz1#
在http://ref.x86asm.net/coder32.html/http://ref.x86asm.net/coder64.html中搜索“CX”和“CL”,因为它们有一个隐式操作数列。
您已经提到的隐式用法或rCX:
shlx
等除外)j*cxz
/loop
/loop[n]e
rep
/rep[n]e
字符串操作其他隐式用法或rCX:
cpuid
-输入(对于某些EAX值,EAX=叶,ECX=子叶)和输出xgetbv
/xsetbv
(扩展控制寄存器访问,例如用于检查OS启用的AVX)pcmpistri
/pcmpestri
-第一个匹配的索引monitor
/mwait
(电源管理扩展)rdmsr
/wrmsr
(MSR编号)rdtscp
(处理器ID输出)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中的一些。