我是靠谱客的博主 朴实发带,最近开发中收集的这篇文章主要介绍汇编嵌套if else分析代码如下,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

代码如下

#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分析代码如下所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部