div函数有返回值的情况
先用Visual C++写一个C语言程序:
#include<stdio.h>
int div(int a , int b){
return a/b;
}
int main(){
int result = div(10,5);
printf("test!\n");
printf("%d\n",result);
return 0;
}
用OD打开动态调试,找到div函数,0x5和0xA先后入栈然后调用div函数:
当div函数运行结束时,返回值由eax保存:
返回main函数之后,将返回值eax保存在本地变量[local.1]上:
之后输出的时候再把值从本地变量[local.1]上取出来给eax,然后eax入栈、%d\n入栈:
最后输出。
div函数没有返回值的情况
#include<stdio.h>
void div(int * a , int * b,int c){
*a = *b / c;
}
int main(){
int m = 2;
int n = 8;
int * a = &m;
int * b = &n;
div(a, b,2);
printf("%d\n",*a);
printf("test!\n");
return 0;
}
先找到div函数,将变量[local.4]=0019FF38(地址上的值是00000008)放到edx入栈,将变量[local.3]=0019FF3C(地址上的值是00000002)放到eax入栈:
进入div函数,将参数2[arg.2](值为8)的值给eax,之后进行过除法idiv [arg.3],用eax的值去除以参数3[arg.3](值为2),结果4保存在eax中,之后将eax的值给参数1[arg.1]:
返回main函数之后,就是将变量[local.3]=19FF3C的值给ecx,再将ecx=19FF3C地址上的值4取出来给edx。
最后edx=00000004入栈,输出。