首先对汇编进行初步了解
几个简单汇编指令
mov----------->传送字或字节
movsx----------->先符号扩展,在传送
movzx----------->先0扩展,再传送
push ----------->入栈
pop----------->出栈
lea----------->装入有效地址
pusha----------->把ax,cx,dx,bx,sp,bp,si,di依次压入堆栈
popa----------->把di,si,bp,sp,bx,dx,cx,ax依次弹出堆栈
pushad----------->把eax,ecx,edx,ebx,esp,ebp,esi,edi依次压入堆栈
add----------->两数相加(不带进位)
xadd----------->先交换在累加
**sub----------->减法指令 **
bswap----------->交换32位寄存器里面字节的顺序
xchg----------->交换字或字节(至少有一个操作数为寄存器,段寄存器不可作为操作数)
cmpxchg----------->比较并交换操作数(第二个操作数必须为累加器al/ax/eax)
call----------->调用子程序,子程序结束已ret结束
les ----------->传送目标指针,把指针内容装入ES
未完(不待)续。。。
通用寄存器
eax----------->是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。
ebx----------->是"基地址"(base)寄存器, 在内存寻址时存放基地址
ecx----------->是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
edx----------->则总是被用来放整数除法产生的余数。
esi/edi ----------->分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串
ebp----------->是"基址指针"(BASE POINTER),常用作栈底指针
esp----------->专门用作堆栈指针,被形象地称为栈顶指针
.
#源代码
#include<stdio.h>
int sum(int a,int b)
{
return a+b;
}
int main()
{
int x=10;
int y=20;
int z=sum(x,y);
return z;
}
实现过程
(此处栈从上到下,地址由低到高)
00991760 push ebp (栈底指针入栈)
00991761 mov ebp,esp (让栈底指针指向之前的栈顶指针)
00991763 sub esp,0E4h (栈顶指针上移0e4h)
00991769 push ebx (存放基地址)
00991783 call main (调用main函数)
00991788 mov dword ptr [x],0Ah (将10赋值给x)
0099178F mov dword ptr [y],14h (将20赋值给y)
00991796 mov eax,dword ptr [y] (将y的值传给eax)
00991799 push eax (eax入栈)
0099179A mov ecx,dword ptr [x] (将x的值传给ecx)
0099179D push ecx (ecx入栈)
0099179E call sum (099107Dh) (调用sum函数,记录下一条指令)
009917A3 add esp,8 (esp下移8)
009917A6 mov dword ptr [z],eax (将sum的返回值传给z)
009917A9 mov eax,dword ptr [z] (将z的值传给eax)
009917AE pop ebx (ebx地址出栈)
009917AF add esp,0E4h (esp下移0e4h,返回栈底)
009917BC mov esp,ebp (栈顶指针指向栈底)
009917BE pop ebp (栈底指针出栈)
009917BF ret (结束调用)
sum调用过程
009916F0 push ebp (栈底指针入栈)
009916F1 mov ebp,esp (让栈底指针指向之前的栈顶指针)
009916F3 sub esp,0C0h (栈顶指针上移0c0h)
009916F9 push ebx (记录栈基地址)
00991718 mov eax,dword ptr [a] (将a的值存入a)
0099171B add eax,dword ptr [b] (将b加a的值传入eax)
00991720 pop ebx (ebx出栈)
00991721 add esp,0C0h (esp下移0c0h,返回栈底)
0099172E mov esp,ebp (栈底指针指向栈顶)
00991730 pop ebp (栈底指针出栈)
00991731 ret (结束调用sum)