对于机器编程而言,有两种抽象尤为重要。第一种是由ISA来定义机器级程序的格式和行为,第二种是机器级别程序使用的内存地址是虚拟地址,提供的内存模型看上去是一个非常大的字节数组。
ISA指Instruction Set Architecture, 即指令集体系结构。是一种规约,它定义了处理器状态、指令的格式,以及每条指令对状态的影响。ISA在计算机系统是必不可少的一个抽象层,没有它软件就无法使用硬件。没有它,一台计算机就不能称为"通用计算机"。
程序计数器(pc,在x86-64中使用%rip表示):给出将要执行的下一条指令在内存中的地址。
整数寄存器:x86-64的cup包含一组16个存储64位值的通用目的寄存器,用来存储整数数据和存储地址。
条件码寄存器:保存着最近执行的算数活逻辑指令的状态信息
指令组成:操作码 源操作数1 或/和源操作数2(立即数、寄存器编号、存储地址) 目的操作数地址(寄存器编号、存储地址)
操作数有三种类型:1.立即数,用来表示常数 。2.寄存器,表示某个寄存器的内容。3.内存引用:会根据计算出来的地址访问某个内存位置。
寻址方式:如何根据指令给定信息得到操作数或操作数地址。参照下图:
常用指令类型:
1)传送指令:
通用数据传送指令:mov,movs,movz,push/pop
地址传送指令:leal,加载有效地址。如 leal(%edx,%eax), %eax 的功能为R[eax] <---R[edx] + R[eax], 执行前,若R[edx] =i, R[eax] = j, 则指令执行后,R[eax] = i+j。 这个指令第一个参数看上去是个内存引用,但不是从指定的位置读入数据,而是将有效地址写入目的操作数。
2)控制转移指令
指令执行可按顺序或跳转到转移目标指令出执行
--无条件转移指令 jmp dst:无条件转移到目标指令dst处执行
--条件转移 Jcc dst:cc为条件码,根据标志(条件码)判断是否满足条件,若满足,则转移到目标指令dst处执行,否则按顺序执行
--条件设置 SETcc dst:按条件码cc判断的结果保存到dst中(是一个8位的寄存器)
--调用和返回指令(用于程序调用)
call dst:返回地址RA入栈,转dst处执行
ret:从栈中取出返回地址ra,转到ra处执行