当前位置:网站首页>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
边栏推荐
- 忽米沄析:工业互联网标识解析与企业信息系统的融合应用
- 一文了解Go语言中的函数与方法的用法
- Force deduction solution summary 1200 minimum absolute difference
- 毫无章法系列
- Cloud security daily 220705: the red hat PHP interpreter has found a vulnerability of executing arbitrary code, which needs to be upgraded as soon as possible
- 请问下为啥有的表写sql能查到数据,但在数据地图里查不到啊,查表结构也搜不到
- VBA drives SAP GUI to realize office automation (II): judge whether elements exist
- Complete solution instance of Oracle shrink table space
- Accuracy of BigDecimal Division
- About JSON parsing function JSON in MySQL_ EXTRACT
猜你喜欢

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

Server configuration jupyter environment
What are the precautions for MySQL group by
SQL删除重复数据的实例教程
In depth understanding of redis memory obsolescence strategy

解决“双击pdf文件,弹出”请安装evernote程序

提高應用程序性能的7個DevOps實踐
Complete solution instance of Oracle shrink table space

Knowledge points of MySQL (7)

哈趣K1和哈趣H1哪个性价比更高?谁更值得入手?
随机推荐
Example tutorial of SQL deduplication
Which is more cost-effective, haqu K1 or haqu H1? Who is more worth starting with?
得知女儿被猥亵,35岁男子将对方打至轻伤二级,法院作出不起诉决定
求解为啥all(())是True, 而any(())是FALSE?
Alpha conversion from gamma space to linner space under URP (II) -- multi alpha map superposition
Database design in multi tenant mode
Machine learning 02: model evaluation
一文读懂简单查询代价估算
Humi analysis: the integrated application of industrial Internet identity analysis and enterprise information system
CVPR 2022 best student paper: single image estimation object pose estimation in 3D space
毫无章法系列
Short the command line via jar manifest or via a classpath file and rerun
独立开发,不失为程序员的一条出路
About JSON parsing function JSON in MySQL_ EXTRACT
外盘黄金哪个平台正规安全,怎么辨别?
Cartoon: how to multiply large integers? (I) revised version
MySQL queries the latest qualified data rows
C (WinForm) the current thread is not in a single threaded unit, so ActiveX controls cannot be instantiated
BigDecimal除法的精度问题
How to save the trained neural network model (pytorch version)