本节我们看看X86指令集以及X86的硬件体系架构。在汇编语言中最常见的指令就是mov,他将数据从一个地方转移到指定位置,该指令能将数据转移到特定位置的内存或是给定寄存器。mov指令的格式为(mov 目的,源头),源头指的是要被挪到的数据,目的是数据被挪动的目的地, 我们看几个具体例子:
mov eax, ebx (把寄存器ebx中的数据拷贝到eax寄存器)
mov eax, 0x42 (把数值0x42赋值给eax寄存器)
mov eax, [0x4037c4](把地址为0x4037c4的4字节数据拷贝到eax寄存器]
mov eax, [ebx] (先从寄存器ebx中获取数值,然后找到该数值对应的内存地址,接着再把地址所在处4字节数据赋值给寄存器eax)
mov eax, [ebx + esi*4] (取出ebx中的数值,取出esi寄存器中的数值,将后者乘以4后加上前者,所得结果作为内存地址,并把给定地址的4字节数据拷贝到eax寄存器)
另一个跟mov指令很像的是指令lea,lea eax, [ebx+8],其作用为把ebx寄存器的值加上8后所得结果放入eax,这里需要注意区别,利润mov eax, [ebx+8]是把ebx的值加上8,所得结果作为内存地址,然后将地址所在处的4字节数据转移到eax寄存器,因此指令lea eax, [ebx+8]等价于mov eax, ebx+8,这是一个容易混淆之处,我们看下图会更清楚一些: