1. 程序计数器(PC, %rip)给出将要执行的下一条指令在内存中的地址。
2. 程序内存包含:可执行机器代码、操作系统需要的一些信息、用来管理过程调用和返回的运行时栈、用户分配的内存块。x86-64的虚拟地址是由64位的字来表示的,目前高16位不可用,被设置为0,实际可用48位地址。操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器内存中的物理地址。
3. 链接器的任务之一就是为函数调用找到匹配的函数的可执行代码的位置。
4. gcc objdump和其他一些我们使用的工具的默认格式使用的是ATT(AT&T)格式的汇编。
5. 16位--字(word)、32位--双字(double word) 、 64位--四字(quad word)
6.
7. 通用目的寄存器,存储指针和整数数据。
8. 栈指针:用来指明运行时栈的结束位置。
9. 操作数的格式,已ATT汇编为例。
10. 数据传送指令,将数据从一个位置复制到另一个位置。
11. 最简单的数据传送指令---MOV类,把数据从原位置复制到目的位置,不做任何变化。
!!!!注意:传送指令的两个操作数S D不能同时指向内存位置。
12. 较小的源值复制到较大的目的,MOVZ类中使用0填充高位
13. MOVS类使用符号位填充高位
14. 很好的例子
15. 函数通过把值存在寄存器%rax或者该寄存器某个低位部分返回
16. leaq S D,加载有效内存,将S表示的有效地址写到目的操作数D
17. 访问条件码
18. jmp跳转指令,分为直接跳转和间接跳转。直接跳转:jmp .L1 间接跳转:jmp *%rax
19. 条件传送
20. switch在汇编中用跳转表方式实现,跳转表的标号总是从0开始。
21. 过程的机器级实现,以P调用Q为例。a.传递控制:调用Q时,程序计数器需要设置为Q代码起始地位置,Q在P中返回后,程序计数器需设置为Q返回点下一条指令的位置。b.传递数据:P必须能够向Q提供一个或多个参数,Q能够向P返回数据。c.分配和释放内存:开始时,Q可能会为局部变量分配空间,返回时释放这些空间。
22. C语言过程调用机制一个关键的特性是使用了栈结构提供的后进先出的内存管理机制。
23. 栈帧结构
24.
callq 把400568压入栈,跳转到400540,retq将400568从栈中弹出,跳转到400568继续执行。
25. X86-64系统函数调用时可以通过寄存器最多传送6个整形参数,如果参数个数大于6个,多余的要通过栈来传递。
26. 函数参数存储在寄存器的位置及名称
27. 被调用者保存寄存器:%rbx、%rbp、%r12、%r13、%r14、%r15是被调用者保存寄存器。可以存储在栈帧 被保存的寄存器 区域。