当前位置:网站首页>读libco保存恢复现场汇编代码
读libco保存恢复现场汇编代码
2022-07-05 17:14:00 【山有木兮啊】
x86 64位下
struct coctx_t
{
void *regs[ 14 ];
size_t ss_size;
char *ss_sp;
};
void coctx_swap(coctx_t*, coctx_t*) asm("coctx_swap");
/** 在进入这块代码之前会有call操作及压栈操作, 对于x86 64bit机器: %rdi, %rsi, %rdx, %rcx, %r8, %r9 :六个寄存器,当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9; 当参数为7个以上时,前 6 个与前面一样, 但后面的依次从"右向左"放入栈中,即和32位汇编一样 所以栈应该是 h <- rbp 返回值地址 <- rsp l */
leaq (%rsp),%rax /* rsp存放的是返回值的地址 rax = &ra ra: rerurn address */
movq %rax, 104(%rdi) /* 上一行把rsp寄存器的值放到了rax,所以此时参数1(假设为param1)的regs[13]的存的是rsp寄存器的值 */
movq %rbx, 96(%rdi) /* param1->regs[12] = rbx */
movq %rcx, 88(%rdi) /* param1->regs[11] = rcx */
movq %rdx, 80(%rdi) /* param1->regs[10] = rdx */
movq 0(%rax), %rax /* rax存放的是返回值的地址,mov指令将返回值赋值给rax寄存器 *&ra = ra */
movq %rax, 72(%rdi) /* param1->regs[9] = rax */
movq %rsi, 64(%rdi) /* param1->regs[8] = rsi */
movq %rdi, 56(%rdi) /* param1->regs[7] = rdi */
movq %rbp, 48(%rdi) /* param1->regs[6] = rbp */
movq %r8, 40(%rdi) .
movq %r9, 32(%rdi) .
movq %r12, 24(%rdi) .
movq %r13, 16(%rdi)
movq %r14, 8(%rdi)
movq %r15, (%rdi) /* param1->regs[0] = r15 */
xorq %rax, %rax /* 异或指令 rax = rax ^ rax = 0 , 清空rax值*/
/* 以上用于保存当前的堆栈至第一个参数 */
/* 以下用于从第二个参数恢复现场 */
movq 48(%rsi), %rbp /* 由于恢复和保存相反,所以可参照上面进行分析 */
movq 104(%rsi), %rsp
movq (%rsi), %r15
movq 8(%rsi), %r14
movq 16(%rsi), %r13
movq 24(%rsi), %r12
movq 32(%rsi), %r9
movq 40(%rsi), %r8
movq 56(%rsi), %rdi
movq 80(%rsi), %rdx
movq 88(%rsi), %rcx
movq 96(%rsi), %rbx
leaq 8(%rsp), %rsp
/* rsp先是存放的是从param2->regs[13]取出的值, 此操作后将rsp寄存器里的地址+8字节 赋值给rsp, 此时rsp指向的是将要执行的函数参数一(没参数则等于rbp的值) */
pushq 72(%rsi) /* 将param2->regs[9] (即返回值地址) 压栈 rsp地址 - 8*/
/* 这两句的作用就是更新返回值地址 */
movq 64(%rsi), %rsi
ret
边栏推荐
- Oracle Recovery Tools ----oracle数据库恢复利器
- 华为云云原生容器综合竞争力,中国第一!
- Read the basic grammar of C language in one article
- Using C language to realize palindrome number
- In depth understanding of redis memory obsolescence strategy
- ThoughtWorks global CTO: build the architecture according to needs, and excessive engineering will only "waste people and money"
- Sentinel-流量防卫兵
- What are the precautions for MySQL group by
- Which is more cost-effective, haqu K1 or haqu H1? Who is more worth starting with?
- 排错-关于clion not found visual studio 的问题
猜你喜欢
基于Redis实现延时队列的优化方案小结
33: Chapter 3: develop pass service: 16: use redis to cache user information; (to reduce the pressure on the database)
Rider set the highlighted side of the selected word, remove the warning and suggest highlighting
統計php程序運行時間及設置PHP最長運行時間
机器学习02:模型评估
Kafaka技术第一课
Knowledge points of MySQL (7)
IDC报告:腾讯云数据库稳居关系型数据库市场TOP 2!
7 pratiques devops pour améliorer la performance des applications
Compter le temps d'exécution du programme PHP et définir le temps d'exécution maximum de PHP
随机推荐
统计php程序运行时间及设置PHP最长运行时间
查看自己电脑连接过的WiFi密码
机器学习01:绪论
[binary tree] insufficient nodes on the root to leaf path
WebApp开发-Google官方教程
Read the history of it development in one breath
ICML 2022 | Meta propose une méthode robuste d'optimisation bayésienne Multi - objectifs pour faire face efficacement au bruit d'entrée
Matery主题自定义(一)黑夜模式
SQL Server(2)
Which is more cost-effective, haqu K1 or haqu H1? Who is more worth starting with?
蚂蚁金服的暴富还未开始,Zoom的神话却仍在继续!
Sentinel-流量防卫兵
mysql如何使用JSON_EXTRACT()取json值
mongodb(快速上手)(一)
Cloud security daily 220705: the red hat PHP interpreter has found a vulnerability of executing arbitrary code, which needs to be upgraded as soon as possible
一文了解MySQL事务隔离级别
SQL删除重复数据的实例教程
MySQL queries the latest qualified data rows
MYSQL group by 有哪些注意事项
To solve the problem of "double click PDF file, pop up", please install Evernote program