除了扩展原来存在的通用寄存器,x64架构还引入了8个新的通用寄存器: r8-r15 在原来32位时代,函数调用时,那个时候通用寄存器少,参数绝大多数时候是通过线程的栈来进行传递(当然也有使用寄存器传递的,比如著名的C++this指针使用ecx寄存器传递,不过能用的寄存器毕竟不多)。 进入x64时代,寄存器资源富裕了,参数传递绝大多数...
x86-64 中,有 6 个寄存器来存储参数,如前面第二个表所示,依次为%rdi、%rsi、%rdx、%rcx、%r8、%r9,如下表所示,如果多于 6 个参数,依然还是通过入栈实现,如上面的图4图5中的param部分所示,所以从性能的角度上来看,我们设计的函数参数最好不超过六个,这样参数就都会直接通过寄存器传递,而不用通过栈传递。
(3)调用时,rsp向下移动8位(存入返回地址),寄存器参数无影响,第7个及之后的参数现在则是从rsp+8开始第7个,rsp+16开始第8个,以此类推; 0x05:栈帧的不同 很多情况下不再需要栈帧,比如在没有调用别的函数,且寄存器足以存储参数,那么就只需要存储返回地址即可。 需要栈帧的情况: (1)本地变量太多,寄存器不够...
Itanium 处理器拥有更先进的寄存器引擎(128 个浮点寄存器和120 个通用寄存器),并且支持更复杂的寄存器操作,这些都是通过全新的体系结构实现的。通过提供更多寄存器以及更多寄存器空间,64 位处理器(以及为它们编写的应用程序和操作系统)可以更有效地处理数据,每个时钟周期可以移动更多信息。 增加的可靠性 Windows 64 位系统...
参数的压栈是从右向左的,最后面的参数最先处理,我们知道寄存器里存储函数参数的只有6个,所以还需要使用栈上的空间来存储其他参数。把0xa放在rsp+0x18的地址上,然后把0x9放在rsp+0x10的地址上,以此类推。 mov$0x6,%r9dmov$0x5,%r8dmov$0x4,%ecxmov$0x3,%edxmov$0x2,%esimov$0x1,%edi ...
%rsp :堆栈指针寄存器,指向栈顶位置。pop操作通过增大rsp的值实现出栈,push操作通过减小rsp的值实现入栈。 %rbp :栈帧指针,标识当前栈帧的起始位置。 %rdi, %rsi, %rdx, %rcx,%r8, %r9 :六个寄存器,当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9;当参数为7个以上时,前...
如果要使用段寄存器,在括号外使用:标志段偏移,如下,表示的是将rbx的值放到[fs + eax]对应空间 highlighter- mov QWORD PTR fs:[eax], rbx 2.intel汇编的参数寄存器传递 参数传递会使用六个寄存器: %rdi %rsi %rdx %rcx %r8 %r9 返回值寄存器: %rax ...
%rdx 【参数】六个寄存器用于存储函数调用时的6个参数 %rcx 【参数】六个寄存器用于存储函数调用时的6个参数 %r8 【参数】六个寄存器用于存储函数调用时的6个参数 %r9 【参数】六个寄存器用于存储函数调用时的6个参数 x86-64 寄存器内容.png©...
再往后,开始参数入栈,前6个参数依次保存到对应的寄存器中,最后两个参数从右到左压入栈中。 进入add 函数后之后的操作如下: add:.LFB2:pushq %rbp ; 保存父栈帧指针.LCFI0:movq %rsp, %rbp ; 创建新栈帧.LCFI1:movl %edi, -20(%rbp) ; 在寄存器中的参数压栈movl %esi, -24(%rbp)movl %edx,...
x64是64位 x86是32位