#include<iostream>
using namespace std;
void ff(){
cout << "f executing "<< endl;
int a =0,b = 0,c = 0,d = 0,e =0;
/*
* cpu 的读值顺序,是从低地址到高地址,这里不要以big-endian或者
* little-endian的方式去理解哈,是一小段低地址读取"完"后,又从高地址读
* 取一小段值.如,变量int a 在 低地址,int b在高地址,
* int *p指定a地址处,read (int)p,就读的是a的值,
* read (int)(p+4)就读的是b的值
*
*
*/
__asm{
mov a,ebp;
mov b,esp;
mov eax,[ebp+4];//调用者的"call ff"后的EIP,指令地址
mov c,eax;
jmp c; //跳转到该指令地址
mov eax,[ebp-8];
mov d,eax;
mov eax,[ebp];//用被调用者(即ff函数)的[ebp]地址处的值,得到调用者的ebp的值
mov e,eax;
}
cout << "in f ebp := " << a << endl;
cout << "in f esp := " << b << endl;
cout << "in f ebp+4 := " << c << endl;
cout << "in f ebp-8 := " << d << endl;
cout << "in f [ebp] := " << e << endl;
}
int main(){
int a = 0,b=0,c=0,d=0,e=0,f=0;
int g =0,h=0,i=0;
int addr = 0;
__asm{
mov g,ebp;
mov a,esp
push 123;
push 456;
push 789;
push 999;
push 888;
call ff;
mov h,ebp;
mov b,esp;
pop c;
mov d,esp;
pop e;
mov f,esp;
mov i,ebp;
mov eax,[ebp];
mov addr,eax;
}
cout << "esp first := " << a << endl;
cout << "esp second after push order := " << b << endl;
cout << "after pop order, c := " << c << endl;
cout << "esp third after pop order := " << d << endl;
cout << "after pop order,e := " << e << endl;
cout << "esp fourth after pop order := " << f << endl;
cout << "ebp first := " << g << endl;
cout << "ebp second after push order := " << h << endl;
cout << "ebp third after two pop order := " << i << endl;
cout << "main address := " << (int)main << endl;
cout << "ebp pointer address content := " << addr << endl;
cout << "ff address := " << int(ff) << endl; //被调用者的指令地址
cout << "我已经执行过了!" << endl;
return 0;
}
f executing
esp first := 14881597
esp second after push order := 3274656
after pop order, c := 0
esp third after pop order := 14883616
after pop order,e := 14881788
esp fourth after pop order := 3274676
ebp first := 15043440
ebp second after push order := 15043440
ebp third after two pop order := 14887950
main address := 14881488
ebp pointer address content := 3274652
ff address := 14881168
我已经执行过了!
esp first := 3274704
esp second after push order := 3274684
after pop order, c := 888
esp third after pop order := 3274688
after pop order,e := 999
esp fourth after pop order := 3274692
ebp first := 3274744
ebp second after push order := 3274744
ebp third after two pop order := 3274744
main address := 14881488
ebp pointer address content := 3274816
ff address := 14881168
我已经执行过了!
#include<iostream>
using namespace std;
void ff(){
cout << "f executing "<< endl;
int a =0,b = 0,c = 0,d = 0,e =0;
/*
* cpu 的读值顺序,是从低地址到高地址,不是big-endian或者
* little-endian的方式哈,是一小段低地址读取"完"后,又从高地址读
* 取一小段值.如,变量int a 在 低地址,int b在高地址,
* int *p指定a地址处,read (int)p,就读的是a的值,
* read (int)(p+4)就读的是b的值
*
*
*/
__asm{
mov a,ebp;
mov b,esp;
mov eax,[ebp+4];//调用者的代码中"call ff"后 EIP,指令地址
mov c,eax;
//jmp c; //跳转到该指令地址执行,不在执行下面的内容
//call c; //同样也不再执行下面的内容
mov eax,[ebp-8];
mov d,eax;
mov eax,[ebp];//用被调用者(即ff函数)的[ebp]地址处的值,得到调用者的ebp的值
mov e,eax;
}
cout << "in f ebp := " << a << endl;
cout << "in f esp := " << b << endl;
cout << "in f ebp+4 := " << c << endl;
cout << "in f ebp-8 := " << d << endl;
cout << "in f [ebp] := " << e << endl;
}
int main(){
int a = 0,b=0,c=0,d=0,e=0,f=0;
int g =0,h=0,i=0;
int addr = 0;
__asm{
mov g,ebp;
mov a,esp
push 123;
push 456;
push 789;
push 999;
push 888;
call ff;
mov h,ebp;
mov b,esp;
pop c;
mov d,esp;
pop e;
mov f,esp;
mov i,ebp;
mov eax,[ebp];
mov addr,eax;
}
cout << "esp first := " << a << endl;
cout << "esp second after push order := " << b << endl;
cout << "after pop order, c := " << c << endl;
cout << "esp third after pop order := " << d << endl;
cout << "after pop order,e := " << e << endl;
cout << "esp fourth after pop order := " << f << endl;
cout << "ebp first := " << g << endl;
cout << "ebp second after push order := " << h << endl;
cout << "ebp third after two pop order := " << i << endl;
cout << "main address := " << (int)main << endl;
cout << "ebp pointer address content := " << addr << endl;
cout << "ff address := " << int(ff) << endl; //被调用者的指令地址
cout << "我已经执行过了!" << endl;
return 0;
}
f executing
in f ebp := 3537220
in f esp := 3537200
in f ebp+4 := 660269
in f ebp-8 := 3537200
in f [ebp] := 3537288
esp first := 3537248
esp second after push order := 3537228
after pop order, c := 888
esp third after pop order := 3537232
after pop order,e := 999
esp fourth after pop order := 3537236
ebp first := 3537288
ebp second after push order := 3537288
ebp third after two pop order := 3537288
main address := 660160
ebp pointer address content := 3537360
ff address := 659856
我已经执行过了!