当前位置:网站首页>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
边栏推荐
- 7. Scala class
- 漏洞复现----48、Airflow dag中的命令注入(CVE-2020-11978)
- Machine learning 02: model evaluation
- Matery主题自定义(一)黑夜模式
- 中国银河证券开户安全吗 开户后多久能买股票
- 統計php程序運行時間及設置PHP最長運行時間
- Cartoon: interesting pirate problem (full version)
- Disabling and enabling inspections pycharm
- Customize the theme of matrix (I) night mode
- Force deduction solution summary 1200 minimum absolute difference
猜你喜欢
企业数字化发展中的六个安全陋习,每一个都很危险!
漏洞复现----48、Airflow dag中的命令注入(CVE-2020-11978)
Kafaka技术第一课
IDEA 项目启动报错 Shorten the command line via JAR manifest or via a classpath file and rerun.
云主机oracle异常恢复----惜分飞
33:第三章:开发通行证服务:16:使用Redis缓存用户信息;(以减轻数据库的压力)
Database design in multi tenant mode
Redis+caffeine two-level cache enables smooth access speed
33: Chapter 3: develop pass service: 16: use redis to cache user information; (to reduce the pressure on the database)
基于Redis实现延时队列的优化方案小结
随机推荐
漫画:寻找股票买入卖出的最佳时机
Abnormal recovery of virtual machine Oracle -- Xi Fenfei
In depth understanding of redis memory obsolescence strategy
请问下为啥有的表写sql能查到数据,但在数据地图里查不到啊,查表结构也搜不到
Ordinary programmers look at the code, and top programmers look at the trend
Summary of optimization scheme for implementing delay queue based on redis
机器学习02:模型评估
Cartoon: interesting [pirate] question
基于Redis实现延时队列的优化方案小结
QT console printout
Tips for extracting JSON fields from MySQL
Compter le temps d'exécution du programme PHP et définir le temps d'exécution maximum de PHP
力扣解法汇总1200-最小绝对差
华为云云原生容器综合竞争力,中国第一!
WebApp开发-Google官方教程
使用QT设计师界面类创建2个界面,通过按键从界面1切换到界面2
How MySQL uses JSON_ Extract() takes JSON value
Humi analysis: the integrated application of industrial Internet identity analysis and enterprise information system
Example tutorial of SQL deduplication
C # mixed graphics and text, written to the database in binary mode