抽象层次:
硬件:唯一的物理层,由电子电路组成,是XOR、AND、OR和NOT等逻辑运算器的复杂组合,称为数字逻辑。(digital logic)
微指令:又称为固件(firmware),只能在为它设计的特定电路上执行,从更高的机器码层翻译而来,提供了访问硬件的接口。
机器码:由操作码(opcode)组成,操作码是一些十六进制形式的数字,每一个代表特定的指令。
低级语言:计算机体系结构指令集的人类易读版本,主要是汇编语言。
高级语言:对机器层做了很高的抽象,可以轻松实现程序逻辑和流控制机制,包括C、C++等,被编译器编译为机器码。
解释型语言:C#、Perl、Java等解释语言,这一层的代码不会被编译为机器码,而是被翻译为字节码(bytecode)。字节码是特定于该语言的一种中间表示,在解释器(interpreter)中执行,解释器可在运行时将字节码实时翻译为可执行机器码的程序。相比于传统被编译的代码,解释器提供了一种自动的抽象层次,可以独立于操作系统,自己处理错误和管理内存。
x86体系结构:
内存:
一个程序的内存可以分为四个主要的段:
栈+堆+代码+数据
数据段(data section)存放了程序初始加载的值,称为静态值(static value),因为不发生改变,也称为全局值(global value)。
代码段包含了执行执行程序任务时CPU所取得的指令。
堆是为程序执行期间需要的动态内存准备的,用于创建、消除值,称为动态内存(dynamic memory),因为在程序运行期间经常被改变。
栈用于函数的局部变量和参数,以及控制程序执行流。
指令:
助记符+目标操作数+源操作数
mov ecx 0x42
操作码:
每条指令使用操作码告诉CPU该执行什么操作,反汇编器将操作码翻译为人类易读的指令。
指令 mov ecx, 0x42
操作码 B9 42 00 00 00
所以指令mov ecx,0x42的操作码就是B9 42 00 00 00
字节序:
数据的字节序(endianness)是指在一个大数据项中,最高位(大端big-endian)还是最低位(小端little-endian)被排在第一位(即排在最低的地址上)。
网络数据使用大端字节序,x86使用小端字节序,如127.0.01在大端字节序下被表示为0x7F000001,在小端字节序下被表示为0x0100007F。
操作数:
说明指令要使用的数据。有以下三种类型:
立即数(immediate):一个固定的值,如0x42
寄存器(register):指向寄存器,如ecx
内存地址(memory address):指向内存地址,一般由方括号内包含值、寄存器或方程式组成,如[eax]
寄存器:
被CPU使用的少量数据存储器,主要分为以下四类:
通用寄存器:CPU在执行期间使用(32位)。eax、ebx、ecx、edx、ebp、esp、esi
EAX:AX表示后有16位,AL后8位,AH次后8位。
段寄存器:用于定位内存节。cs、ss、ds、es、fs、gs
标志寄存器:用于作出决定。eflags
在x86中是32位,每一位是一个标志,要么是置位(1),要么清除(0),由这些值控制CPU的运算,或者给出某些运算的值。
ZF:当一个运算的结果位0时,ZF被置位,否则被清除。
CF:当一个运算结果相对于目标操作数太大或太小时,CF被置位,否则被清除。
SF:一个运算结果为负数时,SF被置位,否则被清除。对算术运算,若结果最高位为1,被置位。
TF:用于调试,当它被置位时,x86处理器每次只执行一条指令。
指令指针:用于定位要执行的下一条指令。eip
又称为程序计数器,保存了程序将要执行的下一条指令在内存中的地址。
简单指令:
mov eax,1000 把1000赋给eax寄存器
push eax 把eax寄存器的值入栈
pop eax 把栈底值赋给eax寄存器