当前位置:网站首页>Read libco save and restore the on-site assembly code
Read libco save and restore the on-site assembly code
2022-07-05 17:38:00 【There are trees in the mountain】
x86 64 Place below
struct coctx_t
{
void *regs[ 14 ];
size_t ss_size;
char *ss_sp;
};
void coctx_swap(coctx_t*, coctx_t*) asm("coctx_swap");
/** Before entering this code, there will be call Operation and stack pressing operation , about x86 64bit machine : %rdi, %rsi, %rdx, %rcx, %r8, %r9 : Six registers , When the parameter is less than 7 Time , The parameters are put into the register from left to right : rdi, rsi, rdx, rcx, r8, r9; When the parameter is 7 More than one time , front 6 One is the same as before , But the later ones start from " Right to left " Put in stack , Namely and 32 Bit assembly So the stack should be h <- rbp Return value address <- rsp l */
leaq (%rsp),%rax /* rsp Store the address of the return value rax = &ra ra: rerurn address */
movq %rax, 104(%rdi) /* The last row rsp The value of the register is put in rax, So at this point the parameter 1( Assuming that param1) Of regs[13] What you save is rsp Register value */
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 Store the address of the return value ,mov The instruction assigns the return value to rax register *&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 /* XOR instruction rax = rax ^ rax = 0 , Empty rax value */
/* The above is used to save the current stack to the first parameter */
/* The following is used to restore the site from the second parameter */
movq 48(%rsi), %rbp /* Because recovery is the opposite of saving , So you can refer to the above analysis */
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 First, the storage is from param2->regs[13] The value taken out , After this operation, the rsp Address in register +8 byte Assign a value to rsp, here rsp It refers to the function parameter 1 to be executed ( If there is no parameter, it is equal to rbp Value ) */
pushq 72(%rsi) /* take param2->regs[9] ( That is, the return value address ) Pressing stack rsp Address - 8*/
/* The function of these two sentences is to update the return value address */
movq 64(%rsi), %rsi
ret
边栏推荐
- 求解为啥all(())是True, 而any(())是FALSE?
- 请问下为啥有的表写sql能查到数据,但在数据地图里查不到啊,查表结构也搜不到
- IDEA 项目启动报错 Shorten the command line via JAR manifest or via a classpath file and rerun.
- 服务器配置 jupyter环境
- 云安全日报220705:红帽PHP解释器发现执行任意代码漏洞,需要尽快升级
- Cartoon: how to multiply large integers? (next)
- 深入理解Redis内存淘汰策略
- 漫画:如何实现大整数相乘?(下)
- 漫画:寻找无序数组的第k大元素(修订版)
- 漫画:寻找股票买入卖出的最佳时机
猜你喜欢

Knowledge points of MySQL (7)
Database design in multi tenant mode

Seven Devops practices to improve application performance

ICML 2022 | Meta propose une méthode robuste d'optimisation bayésienne Multi - objectifs pour faire face efficacement au bruit d'entrée

How to write a full score project document | acquisition technology

漏洞复现----48、Airflow dag中的命令注入(CVE-2020-11978)

CVPR 2022最佳学生论文:单张图像估计物体在3D空间中的位姿估计

Mongodb (quick start) (I)

33: Chapter 3: develop pass service: 16: use redis to cache user information; (to reduce the pressure on the database)

c#图文混合,以二进制方式写入数据库
随机推荐
Knowing that his daughter was molested, the 35 year old man beat the other party to minor injury level 2, and the court decided not to sue
Rider set the highlighted side of the selected word, remove the warning and suggest highlighting
数据访问 - EntityFramework集成
普通程序员看代码,顶级程序员看趋势
How to save the trained neural network model (pytorch version)
Use of ThinkPHP template
Alpha conversion from gamma space to linner space under URP (II) -- multi alpha map superposition
[binary tree] insufficient nodes on the root to leaf path
The five most difficult programming languages in the world
Knowledge points of MySQL (7)
华为云云原生容器综合竞争力,中国第一!
Learn about MySQL transaction isolation level
Compter le temps d'exécution du programme PHP et définir le temps d'exécution maximum de PHP
Cartoon: looking for the k-th element of an unordered array (Revised)
求解为啥all(())是True, 而any(())是FALSE?
毫无章法系列
Independent development is a way out for programmers
哈趣K1和哈趣H1哪个性价比更高?谁更值得入手?
Kafaka技术第一课
Cartoon: how to multiply large integers? (I) revised version