. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->自由讨论区
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  由int型数据如何转化为long型数据引发的思考?  [待解决] 回复[ 2次 ]   点击[ 578次 ]  
tomato
[帖 主]   [ 发表时间:2012-05-20 00:16 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
  在高级语言的函数调用中,如果参数定义的类型为长整形,而实际传过去的类型为整形,那该如何处理呢?

  这个问题我们可以在汇编层面去研究一下,可以写个C语言函数调用,比如,

  图

  在这个程序中,add函数的两个参数和返回值都是long类型的,而main函数中我们传递的却是两个int型数据,而这样就出现了类型不匹配的情况,但是,C编译器是不会报错的,是完全可以通过编译的,是因为这种int型和long型的数据之间,编译器会自动进行类型转换。我们看一下下面这段代码。

  图
  图

  上面这段代码即为那段C语言程序对应的汇编代码,有些汇编基础的同学不妨试着去理解一下这段代码的执行功能。

  我明白是怎么转换的了,我就不再这里说明白了,主要是想给有一定基础的汇编学习者留些思考的空间。

  我提几个问题吧。

  1.这个汇编程序中分别对应C程序的哪部分?哪些是main函数对应的代码?哪些是add函数对应的代码?

  2.定义的变量存放在哪里了?参数存放在哪里了?

  3.int型数据和long型数据不匹配的问题是如何解决的呢?

  4.函数之间的参数是如何传递的?


  欢迎大家来讨论交流。O(∩_∩)O~
tomato
[第1楼]   [ 回复时间:2012-05-20 00:22 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
以上这些问题,没有汇编语言基础的计算机学习者是很难说清楚是怎么回事的,所以,从这一点上来说,汇编语言的基础学习是多么重要,趋向本质!
zhujinwu
[第2楼]   [ 回复时间:2012-05-20 09:57 ]   [引用]   [回复]   [ top ] 
荣誉值:15
信誉值:0
注册日期:2011-11-03 09:29
1、076A:01FA-076A:0218对应main函数,076A:0219-076A:022B对应add函数;
2、定义的变量分别存放在SI、DI中,参数存放在栈中;
3、int型和long型数据不匹配的问题是通过字符扩展(CWD)来解决的;
4、函数之间的参数是通过栈来传递的,其中一个关键的寄存器是BP.
不知道我说的对不对?
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved