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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?2 Q. Z( R( |' Y+ R
我调试发现他是取得那个字段的地址。
: d) `+ |+ B5 O4 D7 x3 ^6 V大侠能详细解释一下吗?5 U* Y8 s4 j" |! N) S- ?3 g, B' _
3 {& ]/ t/ T+ r5 \) g
这段是我Debug的用例。- t! U! `. @) y$ q
- k+ n5 T/ c/ c" o) {$ e; Y) T. @; q4 M
#include "stdio.h"
! ^5 W) {3 s$ N( c#include "stdlib.h"
- b  Y9 H) ~( C" Q& L/ w1 h% ?#include "string.h", V; x5 o; t& E1 f# ^$ r9 }* a
+ ?4 n; W  x3 l
#define        CHAR8                unsigned char
4 _9 Y  e1 [7 m- d$ F3 x8 Q# P+ j) M* q, ~5 z2 A/ v
typedef struct _tagjany4 H4 t) j7 M+ T+ X) `5 K+ c
{
, B" b/ z& X% W+ I% s! _        char name[8];
. D6 u0 ~" b0 W& K1 b! E        int  age;
& Z7 `9 q* D- j) J2 V, x}JANY, *PJANY;
# N9 P' M2 @; l* u# @6 @' w; _6 D0 Y/ C% l# L$ |
typedef struct _tagowen
4 m( L0 D/ N# r( i& f0 O{
; g  q8 f# [7 n( F+ `5 e' |        JANY jy;
; J# L3 q6 A3 E! [8 G' v' e) Q$ P        char home[5];
* K+ i6 \$ f! F3 D, I+ a" m1 I}OWEN, *POWEN;: ]9 N; J- O$ @9 C. A5 H7 O9 Y) ~5 v
1 _8 l. |% w7 {5 W4 |* }
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"# y% H+ Q. C# h# g9 j9 w0 T
7 @3 T6 V8 u4 f9 Q  E' M! r$ [
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
) _" K) s4 B, K) Q& r) j4 |9 Z1 d6 C* f* b! p% O* g  a
#define PEI_CR(Record, TYPE, Field, Signature)   \: Y# u2 ~- g, B8 N
            _CR(Record, TYPE, Field)             * m# V' a* A1 Z% b' W8 m# u' O. x
2 _! F. j2 j  \' f' [
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
9 A2 z; S" D2 g: K) R; t+ f. M  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
5 j) y1 a& F/ h/ d/ O' ]' o
. }$ o3 |6 m1 g' E1 f/ B" K# U/ ^void main()
" M6 `# R8 V! e) A* L! T{
5 ~2 Y# W" B% ^+ M+ R. {6 u        PJANY        jany;3 o2 \# t2 B& @) G% |6 q" `" K
        POWEN        owen;2 L( R2 ]: a# f
        jany = malloc(sizeof(JANY));& g! j1 F6 Y* B8 j$ n* _* B0 g
        owen = malloc(sizeof(OWEN));
6 D1 C% D' ~# }9 ?% M        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);" L" H6 c( I( E  o+ s, _+ x
        free(owen);
  \; M0 f! f' p) p. s1 ]        free(jany);
. R5 q* ~1 N/ ~3 f+ M        return;        . G$ ~  N+ z$ N. X
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
: P; ~4 Q+ q8 d1 n0 e0 g  k" f; u6 N% a1 t' P! B' H2 \
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
0 _7 Y+ {. l7 s' S8 x谢谢 “kelvinklee” 指点。
/ S6 g9 R4 N0 k! b* G) X6 Fhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                6 L  ?0 y9 B" _( e
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
6 q3 h% d8 I& {" ]* k& n( k5 ]! |9 w输入:一个结构体成员的地址指针,该成员所在结构体的结构% G9 O' \) W2 L" n' U9 N6 l
输出:该成员所在结构体的地址指针
7 K  h& ~, w2 u+ l4 }# x0 ]4 c0 b% z
, a2 A5 U' ^; z* h算法:# t2 W0 u$ F! {
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
# L- i3 ?5 Y5 c7 r( I1 a" c2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-20 03:38 , Processed in 0.040611 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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