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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
8 `$ e! V: J. l我调试发现他是取得那个字段的地址。8 [0 n! ~  `0 S/ A* D2 n3 ?8 W
大侠能详细解释一下吗?. c- M& j( Y/ ]8 U1 g; s! T. @

! |* r' W3 R+ S/ z这段是我Debug的用例。  \: X, {5 g; ^+ @" Z

6 g5 ]( J! H3 N! M6 u7 q9 d#include "stdio.h"/ S% N6 W, c2 e8 g& Z. P
#include "stdlib.h"
- c4 |+ X! k0 M#include "string.h"" ]! }. M! s4 A/ z, z8 c
1 t& i8 J) p+ Z
#define        CHAR8                unsigned char* @6 T2 j* H; h# f. o! m2 o
& ]$ K/ ?/ }& d7 t
typedef struct _tagjany
2 l$ y- Y( |# E# E8 `, v, B, @7 C& `{
; O: Q- `% ?( Z# ~' Z        char name[8];# Y: u4 t; w+ h7 t1 c/ E6 ^  p5 g
        int  age;
( v/ Y! m+ J  w: t}JANY, *PJANY;: q0 z" P/ G1 O' f  K! c( Q
5 ?9 U4 r$ J4 D# d9 g0 t
typedef struct _tagowen) P6 z  S" E% b
{/ n! x3 ?! Q: Y; `
        JANY jy;
5 c7 X3 v: S& d9 D        char home[5];" k& K5 W8 K. ^/ U( i6 R) c5 z1 Y. U
}OWEN, *POWEN;
! d% e0 y$ `, w- d4 N2 H4 m7 o% F( _! u* \( N1 ^! r7 L3 A: C( m
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"7 z% {& w5 u4 k& Y" G9 ]

! g; B0 ~9 \7 I# S7 e#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))7 r9 l, S& f0 I, Y' x

" h+ s4 w1 p' J& _#define PEI_CR(Record, TYPE, Field, Signature)   \2 _+ c% U8 F1 c# D
            _CR(Record, TYPE, Field)             % l% {/ G0 N4 f

# s( N* [" p, D$ f# J, N2 w4 }#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
$ L! g& H' f  V4 b  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE)): N* i8 ?5 L" ~5 ]5 k) K; |% M2 V

# X% W" n% r3 v( zvoid main()+ ^" v# m& q% C$ ^
{
2 v2 |7 ^9 A- Y+ [# F7 [, v        PJANY        jany;
; |+ B1 y3 i6 i1 Z  J' t        POWEN        owen;* t* H$ z4 L* B# k; h
        jany = malloc(sizeof(JANY));+ W% w7 W+ z, w0 b
        owen = malloc(sizeof(OWEN));
( B7 Y+ U. ^* I$ V1 D        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);0 j7 j7 {+ ?. c5 [7 [
        free(owen);" X+ F( h2 Z; }, s
        free(jany);, @. l# n; {$ q- \
        return;        + T, U8 O$ D6 r
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。/ q2 _1 S. |% d' D' V3 Y9 @* E
2 i8 T! a1 V# p$ ~) r/ W/ R! b
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
; s1 D5 K2 v7 ]" P' F6 ~( L/ m谢谢 “kelvinklee” 指点。& y' F6 {+ S7 F4 A8 d* o
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                / \4 v, `7 T4 N
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!: b/ i' g6 x3 G
输入:一个结构体成员的地址指针,该成员所在结构体的结构8 T! Q' _/ i# e8 a, z, D
输出:该成员所在结构体的地址指针/ T* z* G% i5 v3 g1 f9 }
# g) {' [& C1 W
算法:
- p1 G* N6 ]4 l! q5 I* {1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量) x: V- w7 L! [. T8 b" s
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 09:12 , Processed in 0.120157 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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