一些杂七杂八的知识点
- RDI:用于传递第一个整数参数。
- RSI:用于传递第二个整数参数。
- RDX:用于传递第三个整数参数。
- RCX:用于传递第四个整数参数。
- R8:用于传递第五个整数参数。
- R9:用于传递第六个整数参数。
写个总结方便查表
寄存器
常见的寄存器以e开头或r开头,代表不同的架构。
开头 | 架构 |
---|---|
~l(低位),~h(高位) | 8位 |
16位 | |
e | 32位 |
r | 64位 |
SP、BP、IP(栈与函数调用相关)
寄存器 | 说明 |
---|---|
SP | 放栈的偏移地址,SP始终指向栈顶元素 栈指针 (Stack Pointer) |
BP | 栈帧基址指针寄存器为访问栈空间数据提供方便 帧指针 (Frame Pointer) |
IP | 指令寄存器指向当前栈帧中执行的指令(可以理解为读取esp地址中所对应的信息) |
eax、edx和ecx为主调函数保存寄存器,在函数调用前主函数将其入栈,调用结束后出栈
ebx、esi和edi为被调函数保存寄存器,在函数调用后子函数将其入栈,返回时出栈
转移控制ret call
转移控制指令与%rip
和%rsp
寄存器有关
leave
栈溢出的基础原理,EBP/EIP/ESP详解 —- buuctf rip 1题目讲解_buuctf rip1-CSDN博客
使用 bp 寻址栈空间时,需要先 mov bp,sp,将当前栈顶赋值给 bp,然后以当前栈顶为起始地址,通过 [bp+idata] 的寻址方式来访问栈空间内数据。
关于ubuntu18版本以上调用64位程序中的system函数的栈对齐问题 - ZikH26 - 博客园 (cnblogs.com)
CS、IP (指令执行)
寄存器 | 说明 |
---|---|
CS | 代码段寄存器 |
IP | 指针寄存器 |
CS和IP寄存器的作用及执行分析cs ip猪哥-嵌入式的博客-CSDN博客
C语言函数调用栈(一) - clover_toeic - 博客园 (cnblogs.com)
(30 封私信 / 80 条消息) 函数调用过程中栈到底是怎么压入和弹出的? - 知乎 (zhihu.com)
栈帧
栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。简言之,栈帧就是利用EBP
(栈帧指针,请注意不是ESP)寄存器访问局部变量、参数、函数返回地址等的手段。
1 | ;栈帧结构 |
EBP
指向当前栈帧的底部,ESP
始终指向栈帧的顶部。
实参N~1→主调函数返回地址→主调函数帧基指针EBP→被调函数局部变量1~N
OFFSET 属性操作符
取得标号的偏移地址
助记符
助记符(mnemonic)是便于人们记忆、并能描述指令功能和指令操作数的符号,助记符是表明指令功能的英语单词或其缩写。
助记符 | 说明 |
---|---|
JNE | 不相等跳转 |
JE | 相等跳转 |
JNZ | JNZ |
JE ;等于则跳转
JNE ;不等于则跳转
JZ ;为 0 则跳转
JNZ ;不为 0 则跳转
JS ;为负则跳转
JNS ;不为负则跳转
JC ;进位则跳转
JNC ;不进位则跳转
JO ;溢出则跳转
JNO ;不溢出则跳转
JA ;无符号大于则跳转
JNA ;无符号不大于则跳转
JAE ;无符号大于等于则跳转
JNAE ;无符号不大于等于则跳转
JG ;有符号大于则跳转
JNG ;有符号不大于则跳转
JGE ;有符号大于等于则跳转
JNGE ;有符号不大于等于则跳转
JB ;无符号小于则跳转
JNB ;无符号不小于则跳转
JBE ;无符号小于等于则跳转
JNBE ;无符号不小于等于则跳转
JL ;有符号小于则跳转
JNL ;有符号不小于则跳转
JLE ;有符号小于等于则跳转
JNLE ;有符号不小于等于则跳转
JP ;奇偶位置位则跳转
JNP ;奇偶位清除则跳转
JPE ;奇偶位相等则跳转
JPO ;奇偶位不等则跳转
汇编语言—-跳转指令ja、jb、jl_ja指令-CSDN博客