寄存器(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字节的倍数
- 总的字节数是最大的数据类型的整数倍
|