当前位置:网站首页>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
边栏推荐
猜你喜欢
Check the WiFi password connected to your computer
机器学习01:绪论
Beijing internal promotion | the machine learning group of Microsoft Research Asia recruits full-time researchers in nlp/ speech synthesis and other directions
7 pratiques devops pour améliorer la performance des applications
ICML 2022 | Meta提出魯棒的多目標貝葉斯優化方法,有效應對輸入噪聲
Summary of optimization scheme for implementing delay queue based on redis
十个顶级自动化和编排工具
33:第三章:开发通行证服务:16:使用Redis缓存用户信息;(以减轻数据库的压力)
IDEA 项目启动报错 Shorten the command line via JAR manifest or via a classpath file and rerun.
Short the command line via jar manifest or via a classpath file and rerun
随机推荐
Cartoon: looking for the k-th element of an unordered array (Revised)
mysql如何使用JSON_EXTRACT()取json值
Abnormal recovery of virtual machine Oracle -- Xi Fenfei
Rider set the highlighted side of the selected word, remove the warning and suggest highlighting
Error in compiling libssh2. OpenSSL cannot be found
IDEA 项目启动报错 Shorten the command line via JAR manifest or via a classpath file and rerun.
To solve the problem of "double click PDF file, pop up", please install Evernote program
Flask solves the problem of CORS err
Debug kernel code through proc interface
Alpha conversion from gamma space to linner space under URP (II) -- multi alpha map superposition
这个17岁的黑客天才,破解了第一代iPhone!
ICML 2022 | meta proposes a robust multi-objective Bayesian optimization method to effectively deal with input noise
Webapp development - Google official tutorial
Seven Devops practices to improve application performance
2022年信息系统管理工程师考试大纲
VBA drives SAP GUI to realize office automation (II): judge whether elements exist
Oracle recovery tools -- Oracle database recovery tool
Tita performance treasure: how to prepare for the mid year examination?
一文了解Go语言中的函数与方法的用法
华为云云原生容器综合竞争力,中国第一!