首先是函数传参,
先说下edi esi edx ecx 和 rdi rsi rdx rcx的关系
正常的centos x86的架构,
函数的前6个参数一般是用着几个寄存器存储的 edi esi edx ecx r8 r9(也可能是rdi rsi rdx rcx r8 r9),从左依次往右
第7个参数以后,就放在栈上了,也就是通过栈传递,每个参数占用 8 字节(即使类型小于 8 字节,也会对齐填充),从右向左依次压栈(即最右边的参数先入栈,位于低地址)。
计算的时候,第 7 个参数在栈上的位置:%rsp + 8
(调用后的栈顶 + 8 字节,跳过返回地址),第 8 个参数在栈上的位置:%rsp + 16
(依次递增 8 字节)。
例如
其他的一些命令
disassemble可以展开断点函数的汇编
disassemble 地址
disassemble 函数声明
disassemble 开始地址, 结束地址
disassemble 地址加字节数
disassemble 函数声明加字节数
disassemble /m 地址或者函数声明 反汇编命令将显示与反汇编指令相对应的源代码行
disassemble /r 地址或者函数声明 显示所有反汇编指令的原始字节值
info r 查看寄存器信息
set disassemble-next-line on 显示下一条要执行的汇编代码
si 执行以下一步汇编
b *main+12 在某处汇编地址断点,只能从函数声明处,通过地址偏移实现。例如
除了disassemble可以展开汇编之外,display,x/i等之类的也可以展开汇编,
display /20i function_name/addr display展开main函数的前20行汇编,函数名和地址都行
比如用x/i展开汇编
x/10i function_name/addr 展开main函数的10行汇编 ,函数名和地址都行