找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 10858|回复: 4

请做EFI的大侠&前辈指点一下这个宏。-谢谢!

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?! {2 m$ W! s( A( S, r
我调试发现他是取得那个字段的地址。. E* E1 @, U! `: d
大侠能详细解释一下吗?2 c7 f2 A1 d* w& ]' D0 N
% w9 K' {( c& e0 x3 \: @; o) [  n
这段是我Debug的用例。
  j+ G, N' `3 w1 v( [
- Q2 W/ w5 |' F0 H7 J0 D#include "stdio.h"
5 G+ A4 m% Q  o#include "stdlib.h"
- @( k/ M; c+ G% v: z% x6 ]5 ?9 C#include "string.h"* X9 A0 _% E6 w

( V' Z( b  w+ ^" d2 @#define        CHAR8                unsigned char& H/ ^- O: O3 l7 |
8 W7 I2 @' a/ N/ ^2 ], q! n
typedef struct _tagjany3 H4 J, W) P- q' r; ]. ^) R
{8 [* H$ O/ q. ]* [8 U0 t
        char name[8];. G: j# X; p1 u% d2 |
        int  age;: ~6 R* W' Z7 X' c- A
}JANY, *PJANY;
8 j+ P( _* @  r8 I6 W4 W8 A1 S+ u- _' _
1 v& }* M) k) Vtypedef struct _tagowen/ i" c# o3 Y6 g
{) j" L% `( m4 t( X& B, j
        JANY jy;& T  \7 [' H' E/ t% b" [
        char home[5];+ ?) f$ {$ v6 m4 e9 W' l% s! Z
}OWEN, *POWEN;1 H% j& I' T) T; I

$ D8 J& \8 g! m2 g- o, ?#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"  ~/ [. Q, S2 V- m+ f8 G

7 d5 ^* n( E4 l7 f5 l+ e#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field))); M8 C. |: W3 g" f0 e9 r' K

) ^8 t. Z4 j1 b; {% }! _, {) c  \#define PEI_CR(Record, TYPE, Field, Signature)   \
8 u: G6 }( E" \* _            _CR(Record, TYPE, Field)             5 `7 j6 |, {$ c/ }3 T3 _) }

9 ]- H" R3 t! @5 o0 V#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
# s( ^: f  p2 A% w6 l  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))0 l4 `1 T) c* `+ G6 B
4 l0 y2 H1 r6 t; p& c! F( c
void main()0 f6 C3 O, @; \' X0 r/ b& Q( H( X
{
- y9 c: [& I' k  {: R        PJANY        jany;7 @5 M, a; A3 O
        POWEN        owen;: t9 j) K' F: j& A5 _
        jany = malloc(sizeof(JANY));
( B: W- T' X* D' V) d* F        owen = malloc(sizeof(OWEN));
* b/ c* k! P5 j: Q- i, a        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);1 ^* X8 g7 m( M. o9 k
        free(owen);
4 t# [) h1 h/ F# D) D8 r        free(jany);
; a+ Q+ R" X# K        return;        , u- z" g7 y5 z' u. l
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。# \1 M5 E' n3 u9 r. C2 A( S" D

, N( e  u9 f7 {你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。1 {$ B( z0 [2 {6 c" O
谢谢 “kelvinklee” 指点。3 y0 `3 {: J- C3 U9 s9 \! ]: _
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
* s2 _& B' E) t# P3 T.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
  ?9 A  J7 t! d# j0 c1 E输入:一个结构体成员的地址指针,该成员所在结构体的结构
0 D  C: ~& K# I/ R输出:该成员所在结构体的地址指针# n/ }8 @# ?7 o/ o4 |
1 R1 t& E" }3 J+ c- H& L8 M% W, o1 n
算法:
2 T# G% f& A* |2 n' y* Z, c' x1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量. u, Y- W$ c4 a5 s- R5 ^
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-6-4 19:02 , Processed in 1.885583 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表