关于printf不定参数怎么实现的有关问题

关于printf不定参数如何实现的问题
小弟不才,最近在学习汇编,遇到"关于printf不定参数如何实现"的问题,深感疑惑,看了printf函数的反汇编码还是不懂,望各位大虾,高人不吝赐教.
最好能解释下以下代码,尤其是0040d4b0处的 push offset string "%d,%d,%d"

遇到过同样问题的各位朋友也可以一起来讨论...

3: printf("%d,%d,%d",1,2,3,4);
0040D4A8 6A 04 push 4
0040D4AA 6A 03 push 3
0040D4AC 6A 02 push 2
0040D4AE 6A 01 push 1
0040D4B0 68 6C 2F 42 00 push offset string "%d,%d,%d" (00422f6c)
0040D4B5 E8 36 02 00 00 call printf (0040d6f0)
0040D4BA 83 C4 14 add esp,14h

printf:
0040D6F0 55 push ebp
0040D6F1 8B EC mov ebp,esp
0040D6F3 83 EC 0C sub esp,0Ch
0040D6F6 53 push ebx
0040D6F7 56 push esi
0040D6F8 57 push edi
0040D6F9 8D 45 0C lea eax,[ebp+0Ch]
0040D6FC 89 45 F4 mov dword ptr [arglist],eax
0040D6FF 83 7D 08 00 cmp dword ptr [format],0
0040D703 75 1E jne printf+33h (0040d723)
0040D705 68 7C 26 42 00 push offset string "format != NULL" (0042267c)
0040D70A 6A 00 push 0
0040D70C 6A 36 push 36h
0040D70E 68 9C 2F 42 00 push offset string "printf.c" (00422f9c)
0040D713 6A 02 push 2
0040D715 E8 66 3C FF FF call _CrtDbgReport (00401380)
0040D71A 83 C4 14 add esp,14h
0040D71D 83 F8 01 cmp eax,1
0040D720 75 01 jne printf+33h (0040d723)
0040D722 CC int 3
0040D723 33 C9 xor ecx,ecx
0040D725 85 C9 test ecx,ecx
0040D727 75 D6 jne printf+0Fh (0040d6ff)
0040D729 68 40 6F 42 00 push offset __iob+20h (00426f40)
0040D72E E8 9D FD FF FF call _stbuf (0040d4d0)
0040D733 83 C4 04 add esp,4
0040D736 89 45 FC mov dword ptr [buffing],eax
0040D739 8B 55 F4 mov edx,dword ptr [arglist]
0040D73C 52 push edx
0040D73D 8B 45 08 mov eax,dword ptr [format]
0040D740 50 push eax
0040D741 68 40 6F 42 00 push offset __iob+20h (00426f40)
0040D746 E8 45 C7 FF FF call _output (00409e90)
0040D74B 83 C4 0C add esp,0Ch
0040D74E 89 45 F8 mov dword ptr [retval],eax
0040D751 68 40 6F 42 00 push offset __iob+20h (00426f40)
0040D756 8B 4D FC mov ecx,dword ptr [buffing]
0040D759 51 push ecx
0040D75A E8 D1 FE FF FF call _ftbuf (0040d630)
0040D75F 83 C4 08 add esp,8
0040D762 8B 45 F8 mov eax,dword ptr [retval]
0040D765 5F pop edi
0040D766 5E pop esi
0040D767 5B pop ebx
0040D768 8B E5 mov esp,ebp
0040D76A 5D pop ebp
0040D76B C3 ret

------解决方案--------------------
__cdecl的函数,参数由栈传递,最右边的先入栈,函数返回后由调用者平衡栈。

push offset string "%d,%d,%d" 就是把字符串的地址入栈……
------解决方案--------------------
http://topic.csdn.net/t/20041124/09/3582660.html
------解决方案--------------------
printf的实现很简单。
他依靠你的格式化字符串(那个"%d%d%d")来确定你传入的参数有几个,你的格式化字符串中匹配了多少个,他就认为是几个参数,不信你把这个格式化字符串和传入的参数数量弄做不匹配,之后程序就会因为堆栈而出错了。