概述
代码如下
#include"stdafx.h"
int result=0;
int getmax(int i,int j,int k)
{
if(i>j)
{
if(i>k)
{
return i;
}
else
{
return k;
}
}
else
{
if(j>k)
{
return j;
}
else
{
return k;
}
}
}
int main(int argc,char* argv[])
{
result=getmax(1,2,3);
printf("%dn",result);
result=getmax(1,3,2);
printf("%dn",result);
result=getmax(2,1,3);
printf("%dn",result);
result=getmax(2,3,1);
printf("%dn",result);
result=getmax(3,1,2);
printf("%dn",result);
result=getmax(3,2,1);
printf("%dn",result);
system("pause");
return 0;
}
这里调用pause函数实现程序运行后不退出驻留
验证代码运行结果没问题
# 调试
找到main函数入口
函数将3,2,1依次压入堆栈
跳转进入getmax函数,如上图所示,地址为00401000。步入getmax函数,发现
不如getmax函数后,在堆栈中压入00401028,即函数返回地址。
getmax函数
getmax(1,2,3)函数,即i=1,j=2,k=3
由于在跳转进入getmax函数时,堆栈额外压入了返回函数地址,即00401028,那么ESP+4所指向的地址保存着1,ESP+8所指向的地址保存着2,那么上图方框里的指令便是实现比较i与j大小。CMP命令比较,JLE即jump less equal,小于等于则跳转。如果i小于等于j,则跳转到00401015。如果i大于j,则略过,执行下一条指令。
这里由于i=1,j=2,所以我们的程序跳转到00401015。
判断j,k大小
现在跳转到00401015处,ESP+C处存储着3,即k值。EAX在前面比较i和j的时候已经被赋值2,即j值。但在此处,系统采用JG指令比较,即jump greater equal,大于等于跳转。由于j<k,我们便略过该条指令,执行下一条。MOV EAX,ECX。将比较后存储最大值3的ECX赋值给EAX,作为函数返回值。,如下图。
RET命令返回,从堆栈中弹出函数返回地址,ESP地址+4。
最后
以上就是朴实发带为你收集整理的汇编嵌套if else分析代码如下的全部内容,希望文章能够帮你解决汇编嵌套if else分析代码如下所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复