2008年8月5日星期二

va_arg 令我平靜下來 ( update)

va_arg是printf 的重要techqniue 就是variable number and type of argument。
即係話佢個function 不限制arugment既數目(最少一個), 也不限制arugment既type ( int,char*...)

printf好重要,無左個都唔知點debug..
廢話少說係linux kernal 抄個printf source code 出來睇睇!

int
printf(char *fmt, ...)
{
va_list args;
int n;

va_start(args, fmt);
n = vsprintf(sprint_buf, fmt, args);
va_end(args);
write(stdout, sprint_buf, n);
return n;
}

variable argument既語法就係"..."
int printf(char *fmt, ...);

跟住要認識以下既define,
#define _AUPBND (sizeof (acpi_native_int) - 1)
#define _ADNBND (sizeof (acpi_native_int) - 1)
typedef char *va_list;
#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))
#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
#define va_end(ap) (void) 0
#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))

_bnd round up X to multiple of bnd
va_arg , get the next argument
va_start, set ap to first agrument

看了這3個marco 還是不很了解?其實可以簡單一點吧..因為va_arg(ap,t)的t 是取決於stack 是16 bit/32bit..這在每個platform是故定的。

第一個fmt argument的作用是說明... 究竟代表了多少arugment, argument是什麼 type。

說了半天還沒有說print如何用... 很累了...有興趣去prom.c 看一看吧!有空再討論!

aa:abcdefg aa:x10dc4 &aa:x10dc4
bb:123 bb:x10dcc &bb:x10dcc
cc:100 &cc:x10de0
dd:10 &dd:x10de6
ee:f &ee:x10de4
ff:x0 &ff:x10ddc
&type_a:x10dec
fmt:x8c14 &fmt:xbef78cd8
args:xbef78cdc &args:xbef78cbc
Offset|00000000 00000004 00000008 0000000C
000000|00008C14 00008CA4 00010DCC 00000064
000010|0000000A 00000066 0000000B 0000000C
000020|00000061 BEF78D24 00000001 00000000
000030|00000000 BEF78D18 40032E44
num_var_arg:0 args:xbef78ce0 &args:xbef78cbc
uuuuuuuu x8ca4
num_var_arg:1 args:xbef78ce4 &args:xbef78cbc
123 x10dcc
num_var_arg:2 args:xbef78ce8 &args:xbef78cbc
100 xbef78cb8
num_var_arg:3 args:xbef78cec &args:xbef78cbc
10 xbef78cb8
num_var_arg:4 args:xbef78cf0 &args:xbef78cbc
f xbef78cb7
num_var_arg:5 args:xbef78cfc &args:xbef78cbc
type_tmp.x 11

這個是function call,
var_arg_fc(arg_1,"uuuuuuuu\0",bb,cc,dd,ee,typ_a);
TYP_A is
typedef struct
{
int x;
int y;
char xx;
} TYPEA;

這個例子充份解釋了,pass by value, pass by reference, stack usage.
看懂了身體更健康,看不懂也不要緊!沒什麼相干的。

沒有留言:

發佈留言