当前位置:网站首页>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
边栏推荐
- ThoughtWorks global CTO: build the architecture according to needs, and excessive engineering will only "waste people and money"
- Redis+caffeine two-level cache enables smooth access speed
- 如何保存训练好的神经网络模型(pytorch版本)
- Database design in multi tenant mode
- How to save the trained neural network model (pytorch version)
- Cartoon: how to multiply large integers? (integrated version)
- Is it safe for China Galaxy Securities to open an account? How long can I buy stocks after opening an account
- 外盘黄金哪个平台正规安全,怎么辨别?
- 北京内推 | 微软亚洲研究院机器学习组招聘NLP/语音合成等方向全职研究员
- In depth understanding of redis memory obsolescence strategy
猜你喜欢

基于51单片机的电子时钟设计
Database design in multi tenant mode

Knowledge points of MySQL (7)

Oracle Recovery Tools ----oracle数据库恢复利器

Count the running time of PHP program and set the maximum running time of PHP

Machine learning 02: model evaluation

统计php程序运行时间及设置PHP最长运行时间

7 pratiques devops pour améliorer la performance des applications

Design of electronic clock based on 51 single chip microcomputer

十个顶级自动化和编排工具
随机推荐
为什么阳历中平年二月是28天
WR | Jufeng group of West Lake University revealed the impact of microplastics pollution on the flora and denitrification function of constructed wetlands
WebApp开发-Google官方教程
Alpha conversion from gamma space to linner space under URP (II) -- multi alpha map superposition
哈趣K1和哈趣H1哪个性价比更高?谁更值得入手?
云安全日报220705:红帽PHP解释器发现执行任意代码漏洞,需要尽快升级
力扣解法汇总729-我的日程安排表 I
Kafaka technology lesson 1
SQL Server(2)
十个顶级自动化和编排工具
Cartoon: looking for the best time to buy and sell stocks
Cartoon: how to multiply large integers? (next)
漫画:寻找股票买入卖出的最佳时机
Force deduction solution summary 1200 minimum absolute difference
Ordinary programmers look at the code, and top programmers look at the trend
Compter le temps d'exécution du programme PHP et définir le temps d'exécution maximum de PHP
Accuracy of BigDecimal Division
统计php程序运行时间及设置PHP最长运行时间
一文读懂简单查询代价估算
c#图文混合,以二进制方式写入数据库