程序_通过汇编了解程序的实际构成

举报
内核笔记 发表于 2021/06/08 23:20:29 2021/06/08
【摘要】 首先引出一个问题 void sum (int a, int b) { a+b; } 1234 这个函数运用正确 为什么,但是我的疑惑是我在函数里面并没有定义a,b。这个两个参数只是传进来。为什么可以运用那。 我们可以通过汇编来很好的解释 函数调用的过程。 1、汇编语言是一些助记符的编程语言。 2、通过底下两个函数来来分析下汇编: ##(x86环境) //返...

首先引出一个问题

void sum (int a, int b)
{ a+b;
}

  
 
  • 1
  • 2
  • 3
  • 4

这个函数运用正确

为什么,但是我的疑惑是我在函数里面并没有定义a,b。这个两个参数只是传进来。为什么可以运用那。

我们可以通过汇编来很好的解释 函数调用的过程。

1、汇编语言是一些助记符的编程语言。

2、通过底下两个函数来来分析下汇编: ##(x86环境)

//返回两个参数值之和的函数
int AddNum(int a,int b)
{ return a+b;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

//调用AddNum函数的函数
void MyFunc()
{ int c; c = AddNum(123,456);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

__AddNum proc near

int AddNum(int a,int b)

在函数内部利用的寄存器,要尽量返回到函数调用前的状态。为此,我们就需要将其战术保存在栈中,然后再在函数处理完毕前出栈,使其返回到原理的状态。

这里强调一点:

参数是通过栈来传递的,返回值是通过寄存器来返回的。

push ebp

mov ebp,esp

  
 
  • 1
  • 2
  • 3

{

return a+b;

mov eax,dword   ptr [ebp+8]
add eax,dword   ptr [ebp+12]

  
 
  • 1
  • 2

}

pop ebp

ret

  
 
  • 1
  • 2
  • 3

__AddNum endp


__MyFunc proc near

void MyFunc()

push ebp

mov ebp,esp

  
 
  • 1
  • 2
  • 3

{

int c;

c = AddNUm{123,456};

这里的参数是通过push入栈的

C语言规定是位于后面的数值先入栈。

汇编语言中函数名表示是所在的内存地址

下面这个add esp,8 会把栈中存储的两个参数(456和123)进行销毁,虽然内存中的数据实际还存在着,但只要把esp寄存器的值更新为数据存储地址前面的数据位置,该数据就相当销毁了。

push 456
push 123
call _AddNum
add esp,8

  
 
  • 1
  • 2
  • 3
  • 4

}

pop ebp

ret

__MyFunc endp

3、不会换成本地代码的伪指令

伪指令负责把程序的构造及汇编的方法指示给汇编器

源代码的开始位置,定义了3个名称分别为

__TEXT(指令的段定义)

__DATA(有初始值的数据段定义)

__BSS(是尚未初始化的数据的段定义)

文章来源: xuesong.blog.csdn.net,作者:内核笔记,版权归原作者所有,如需转载,请联系作者。

原文链接:xuesong.blog.csdn.net/article/details/78698155

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。