当前位置:网站首页>读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
边栏推荐
- 解决“双击pdf文件,弹出”请安装evernote程序
- Machine learning 02: model evaluation
- 漫画:如何实现大整数相乘?(下)
- 华为云云原生容器综合竞争力,中国第一!
- C # mixed graphics and text, written to the database in binary mode
- VBA驱动SAP GUI实现办公自动化(二):判断元素是否存在
- goto Statement
- Troubleshooting - about clip not found Visual Studio
- Example tutorial of SQL deduplication
- 張平安:加快雲上數字創新,共建產業智慧生態
猜你喜欢

Judge whether a string is a full letter sentence
一文了解MySQL事务隔离级别

Which is more cost-effective, haqu K1 or haqu H1? Who is more worth starting with?

Mongodb (quick start) (I)

Design of electronic clock based on 51 single chip microcomputer

一个满分的项目文档是如何书写的|得物技术

企业数字化发展中的六个安全陋习,每一个都很危险!

激动人心!2022开放原子全球开源峰会报名火热开启!
SQL删除重复数据的实例教程

VBA驱动SAP GUI实现办公自动化(二):判断元素是否存在
随机推荐
Alpha conversion from gamma space to linner space under URP (II) -- multi alpha map superposition
Ordinary programmers look at the code, and top programmers look at the trend
33: Chapter 3: develop pass service: 16: use redis to cache user information; (to reduce the pressure on the database)
Short the command line via jar manifest or via a classpath file and rerun
How to save the trained neural network model (pytorch version)
Read the basic grammar of C language in one article
网络威胁分析师应该具备的十种能力
统计php程序运行时间及设置PHP最长运行时间
基于51单片机的电子时钟设计
漫画:寻找股票买入卖出的最佳时机
ICML 2022 | Meta propose une méthode robuste d'optimisation bayésienne Multi - objectifs pour faire face efficacement au bruit d'entrée
Check the WiFi password connected to your computer
flask解决CORS ERR 问题
漫画:有趣的【海盗】问题
mongodb(快速上手)(一)
解决“双击pdf文件,弹出”请安装evernote程序
CMake教程Step3(添加库的使用要求)
MySQL之知识点(七)
漫画:如何实现大整数相乘?(上) 修订版
How MySQL uses JSON_ Extract() takes JSON value