寄存器(intel-x86-64)

调用寄存器与被调用寄存器  因为要保证在调用函数返回后寄存器的值恢复为未被调用之前,所以下面的例子运用pushq指令保存被调用寄存器rbx的值(函数) 
gcc产生的指令指示操作数的大小 
寄存器的作用
 
%rax存储返回值 %rsp存储栈指针的位置 %rdi %rsi %rdx %rcx %r8 %r9分别保存函数参数1-6

指令的构成【操作码+操作数】

内存引用
内存引用的类型 
数组的引用: 

数据存送指令

数据的入栈

数据的出栈

leaq指令(存储64位,因为地址只能是64位)
- leaq指令加载有效地址(注意计算得到的是地址,而不是地址内的值)
 - leaq进行加法和乘法运算

加法指令

移位指令

条件码

条件指令cmpq设置条件码的值
cmpq指令只设置条件码的值,不会把结果存入寄存器 
跳转指令
 
跳转逻辑的优化(基于数据逻辑传送的) 
跳转指令和cmpq指令实现while循环

for循环的实现与while一致 
switch指令
多分支结构,switch指令比if-else高效,switch通过跳转表跳转一次来达到分支效果,与case的长度无关,而if-else有关 
过程调用(C语言)
 
 
caller函数的执行  
栈的变量分配
 
递归调用

数组的访问(顺序访问)

结构的访问
起始地址+偏移量访问结构体 
结构体的对齐
对齐原则:
- 任何数据类型(K字节)的起始地址必须是K字节的倍数
- 总的字节数是最大的数据类型的整数倍

 
|