Chinaunix首页 | 论坛 | 博客
  • 博客访问: 468088
  • 博文数量: 62
  • 博客积分: 1742
  • 博客等级: 中尉
  • 技术积分: 859
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-06 00:13
个人简介

这是一句很长很长而且又很啰嗦并且很无聊的废话...

文章分类

全部博文(62)

文章存档

2013年(1)

2012年(13)

2011年(48)

分类: C/C++

2011-05-13 22:04:24

   今天老师讲到了可变形参,就man了下va_arg,看着郁闷,都是宏...照着va_arg的大体,自己写了个玩玩,第一个参数稍微做点修改,应该可以处理更多类型参数.
下面贴下代码:
  1. #include <stdio.h>

  2. void m_printf(int,...);

  3. int main(char argc,char **argv){
  4.     m_printf(3,3323,23323,3453453);
  5.     return 0;
  6. }

  7. void m_printf(int i,...){
  8.     int c=0;
  9.     __asm__ __volatile__("pushl %%esi;"::);
  10.     while(i){
  11.         int eax;
  12.            __asm__ __volatile__("movl -12(%%ebp),%%esi;movl 12(%%ebp,%%esi),%0;"
  13.                           :"=r"(eax)
  14.                          :);
  15.         printf("%d\n",eax);
  16.         c+=4;
  17.         i--;
  18.     }
  19.     __asm__ __volatile__("popl %%esi;"::);
  20. }

顺便也贴下她的汇编:

  1. .file "01.c"
  2. .text
  3. .globl main
  4. .type main, @function
  5. main:
  6. pushl %ebp
  7. movl %esp, %ebp
  8. andl $-16, %esp
  9. subl $32, %esp
  10. movl 8(%ebp), %eax
  11. movb %al, 28(%esp)
  12. movl $3453453, 12(%esp)
  13. movl $23323, 8(%esp)
  14. movl $7885558, 4(%esp)
  15. movl $3, (%esp)
  16. call m_printf
  17. movl $0, %eax
  18. leave
  19. ret
  20. .size main, .-main
  21. .section .rodata
  22. .LC0:
  23. .string "%d\n"
  24. .text
  25. .globl m_printf
  26. .type m_printf, @function
  27. m_printf:
  28. pushl %ebp
  29. movl %esp, %ebp
  30. subl $40, %esp
  31. movl $0, -12(%ebp)
  32. #APP
  33. # 12 "01.c" 1
  34. pushl %esi;
  35. # 0 "" 2
  36. #NO_APP
  37. jmp .L4
  38. .L5:
  39. #APP
  40. # 15 "01.c" 1
  41. movl -12(%ebp),%esi;movl 12(%ebp,%esi),%eax;
  42. # 0 "" 2
  43. #NO_APP
  44. movl %eax, -16(%ebp)
  45. movl $.LC0, %eax
  46. movl -16(%ebp), %edx
  47. movl %edx, 4(%esp)
  48. movl %eax, (%esp)
  49. call printf
  50. addl $4, -12(%ebp)
  51. subl $1, 8(%ebp)
  52. .L4:
  53. cmpl $0, 8(%ebp)
  54. jne .L5
  55. #APP
  56. # 22 "01.c" 1
  57. popl %esi;
  58. # 0 "" 2
  59. #NO_APP
  60. leave
  61. ret
  62. .size m_printf, .-m_printf
  63. .ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
  64. .section .note.GNU-stack,"",@progbits
阅读(987) | 评论(0) | 转发(0) |
0

上一篇:指针和数组名

下一篇:函数声明

给主人留下些什么吧!~~