除了扩展原来存在的通用寄存器,x64架构还引入了8个新的通用寄存器: r8-r15 在原来32位时代,函数调用时,那个时候通用寄存器少,参数绝大多数时候是通过线程的栈来进行传递(当然也有使用寄存器传递的,比如著名的C++this指针使用ecx寄存器传递,不过能用的寄存器毕竟不多)。 进入x64时代,寄存器资源富裕了,参数传递绝大多数...
(gdb) x/[内存单元个数][显示变量的方式][一个地址单元的长度] 地址 寄存器 一个x86-64的CPU包含16个64位的寄存器,允许操作寄存器的64位-低32位-低16位-低8位: rsp-esp-sp-spl :栈指针 rax-eax-ax-al : 返回值 rdi-edi-di-dil : 第1个参数 rsi-esi-si-sil : 第2个参数 rdx-edx-dx-dxl :...
call Func(备注:用栈在进行参数传递时,即便参数<8字节,也要对齐放在8字节的空间中) 函数执行前后必须保持原始的寄存器有3个:是rbx、rbp、rsp。rx寄存器中,最后4个必须保持原值:r12、r13、r14、r15。保持原值的意义是为了让当前函数有可信任的寄存器,减小在函数调用过程中的保存&恢复操作。除了rbp、rsp用于特定用途...
– 指令可直接访问16个8位寄存器:AL、BL、CL、DL、BPL、SPL 、SIL、DIL,以及R8B~R15B – 为向后兼容,指令也可直接访问AH、BH、CH、DH – 通过寄存器传送参数,因而很多过程不用访问栈,因此,与IA-32不同,x86-64不需要帧指针寄存器,即RBP可用作普通寄存器使用 – 程序计数器为64位寄存器RIP x86-64的地址和...
简介 通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。除此之外,它们还各自具有一些特殊功能。通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途,只有这样,才能在程序中做到正确、合理地使用它们。 16位cp
%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,...
(5)一些寄存器被设计成为被调用者-存储的寄存器,这些必须在需要改变他们值的时候存储他们并且之后恢复他们。 0x04:参数传递的不同 (1)6个寄存器用来传递参数(见前文); (2)剩下的寄存器按照之前的方式传递(不过是与rsp相关了,ebp不再作为栈帧指针,并且从rsp开始第7个参数,rsp+8开始第8个,以此类推); ...
简介寻址是使用与寄存器保存的地址对应的内存中的值,如(%rsp)表示rsp寄存器指向的内存中的值。 相对基址寻址 表示把一个常数加到寄存器值上,例如-16(%rcx)表示把rcx指向的地址前移16个字节后对应的内存值。 寻址模式相对于管理栈空间、局部变量、函数参数很重要,相对基址寻址也有很多变种,例如-16(%rbx, %rcx, ...
rbp和rsp寄存器在 x86-64 架构中用于管理函数调用栈,分别指向当前函数的栈帧基址和栈顶。这两个寄存器...