当前浏览

海思笔记

分类目录

展开|收起

看你喜欢

(1) (1) (42) (1) (1) (1) (16) (2) (1) (1) (4) (1) (2) (7) (4) (1) (1) (1) (1) (3) (1) (5) (1) (1) (1) (1) (1) (2) (1) (4) (4) (3) (1) (1) (2) (1) (37) (2) (1) (5) (3) (1) (4) (1) (1) (11) (3) (1) (9) (3) (1) (23) (2) (1) (2) (1) (1) (1) (1)

最新精华

第 1 页,共 2 页12

函数调用汇编分析【4】- 典型问题分析2(可变参数函数的实现原理)

代码中经常会看到va_start、va_arg以及va_end这样奇怪的东东,查看定义原来都是宏定义,许多人不知道这个是干什么的,其实这个是用于实现可变参数的函数。有时候我们自己也需要写一个可变参数的函数来方便使用。理解可变参数的实现原理的核心是理解函数参数的入栈方式,如果你理解了本文前面的内容,实际你就基本掌握了可变参数的函数原理,可能你自己还不知道,呵呵。以下内容copy网上的一篇介绍“C中的可变参数研究”(原作者和出处一时不记得了,请原作者见谅,并致谢,当初是看这篇文章才明白的),我基本没修改,因为它描述得已经很好了,看完你就明白了。

标题:C中的可变参数研究

(1)何谓可变参数

这是使用过C语言的人所再熟悉不过的printf函数原型,它的参数中就有固定参数format和可变参数(用”…”表示)。而我们又可以用各种方式来调用printf,如:

(2)实现原理

C语言用宏来处理这些可变参数。这些宏看起来很复杂,其实原理挺简单,就是根据参数入栈的特点从最靠近第一个可变参数的固定参数开始,依次获取每个可变参数的地址。下面我们来分析这些宏。在VC中的stdarg.h头文件中,针对不同平台有不同的宏定义,我们选取X86平台下的宏定义:…

【阅读全文】

函数调用汇编分析【4】- 典型问题分析1(什么时候用指向指针的指针?)

许多时候,我们想通过调用一个函数来获取一个数据区的指针,编码时常常会被到底如何使用指针的问题困扰(到底是用一级指针,还是用指向指针的指针呢?),不得不定下心来仔细研究一番。在一些较复杂的链表操作中,指向指针的指针在实际代码中用得也很多,往往是看代码的一个难点,一般看到这种代码很难再气定神闲了,总要来回捣腾或动笔画画才行。问题的关键还是在于我们对函数调用的参数传递没有深刻或牢固的认识,导致我们没有很直接的反应,都是C语言把我们惯的。

分析1:

如上,add中的c++以及d++操作不会改变main函数中p1和p2的值,因为c和d操作的只是p1和p2在栈中的一个副本。这个小问题在代码中有时候会引起看代码的困惑,但其实是很简单的。

分析2:什么时候要用指向指针的指针呢?

从分析1看,如果我们要改变p1本身(而不是改变p1所指向的地址的内容),这种情况下就要用指向指针的指针。如果用一级指针,显然无法把结果返回给caller中的指针变量。当然我们可以用一个结果指针作为函数返回值传递给caller中的指针变量,这时候能正确的赋值。但不幸的是,有些时候,函数返回值要用来返回函数操作的错误码/成功。…

【阅读全文】

函数调用汇编分析【3】- 实例分析6(返回浮点值)

3.6 返回浮点值

(1)源程序

(2)汇编代码…

【阅读全文】

函数调用汇编分析【3】- 实例分析5(结构作为参数和返回值,返回值长度大于8)

3.5 结构作为参数和返回值(返回值长度大于8)

(1)源程序

(2)汇编代码…

【阅读全文】

函数调用汇编分析【3】- 实例分析4(结构作为参数和返回值,返回值长度小于等于8)

3.4 结构作为参数和返回值(返回值长度小于等于8)

(1)源程序

(2)汇编代码…

【阅读全文】

函数调用汇编分析【3】- 实例分析3(引用传参)

3.3 引用传参

(1)源程序

(2)汇编代码…

【阅读全文】

第 1 页,共 2 页12