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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?5 N! _; k  W3 z/ L7 o
我调试发现他是取得那个字段的地址。$ l! j# X  f5 {6 n& ]0 K4 `0 m
大侠能详细解释一下吗?+ ^- u+ `/ `$ D: |# x8 H% r* G4 ~

9 u2 Y. j+ j6 p6 ?. C0 G9 Y/ V这段是我Debug的用例。; G% k2 o% ]7 J. z, c( k8 T0 m
4 G2 w  r9 r  ^3 u8 x" y# B7 @
#include "stdio.h"
6 o4 T( P6 A4 J% A% W  {7 m+ {#include "stdlib.h"- X/ S$ y  N% ]- D3 U
#include "string.h"5 y# W( Y" f6 \: H+ `& n! P# @* ?

3 z9 y2 y. H" h" c/ m6 A3 O#define        CHAR8                unsigned char  v9 q9 e) S6 J  S) H) @" ?2 M
0 y% x. Y: t+ z; K" Y3 g- I- ^
typedef struct _tagjany
3 s0 f% I% ?3 D# }* A- |0 ]{
$ j- ~2 C* u, C& r. q# O5 l        char name[8];
$ k* F/ \% V% C/ _        int  age;
) o. R0 Z# {; V5 W) A}JANY, *PJANY;7 V5 v9 o7 ~& |4 ]( R! p

# f% z8 _: U# ^4 htypedef struct _tagowen: B, R) j1 M& p# U: k( O0 L
{) f, h* ^$ g0 l5 g  y1 S
        JANY jy;
5 b. L  Z4 J9 ]        char home[5];
% k, A1 _8 K8 n4 ]+ Y}OWEN, *POWEN;+ I% d  Z" g) D! A# Z
( `- g! u( \" v7 D. @% N# f* I
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"4 U! T# F' ^" b3 Z3 a) G% `2 W5 q

7 P! A! o: Z9 ]$ P- ]#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))2 g( A  K: L2 v5 n
' @$ ~2 j; f3 H4 I1 W
#define PEI_CR(Record, TYPE, Field, Signature)   \7 x7 H9 K! e$ S8 M
            _CR(Record, TYPE, Field)             . `0 c, z8 S4 N
% P' f* A5 b% Q
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
6 ?' E, W) ~4 M+ m7 _  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
& O7 `% r6 o$ f3 K# w& @* k( D$ x! v+ Z+ k8 C
void main()0 t( ]. E. s! T$ r+ Z7 Y
{
& a$ t' n+ h6 ^        PJANY        jany;
$ E* l- @3 r8 n$ W  T1 @2 A3 N        POWEN        owen;2 I; z% I  c2 D! m, G4 P+ M
        jany = malloc(sizeof(JANY));# ^3 \% m4 v3 ]' z: ]
        owen = malloc(sizeof(OWEN));
- u5 j" U, E; C& O) Q6 {" R        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);: Y) n4 x; \2 Q6 B& U( M
        free(owen);( E- Z3 P/ M0 z, y* I5 A! T0 @
        free(jany);  f7 p5 `' v* q
        return;        - x7 J5 i6 @" ~5 X
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。+ _9 {& m4 z4 o. c. u, f
1 P, m7 v! O: q( k( e# r
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
+ V3 I" @5 a" G+ A5 Y) s2 K' J2 X$ {谢谢 “kelvinklee” 指点。
. D4 A$ S0 B4 rhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                ) J" }4 g3 Z, b2 Z
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!$ A  M! M! u# T
输入:一个结构体成员的地址指针,该成员所在结构体的结构
  W7 t4 f0 Z0 \9 H输出:该成员所在结构体的地址指针
* {& h6 O! c8 `5 i1 P5 l5 }
5 W. \' n3 X; D4 V5 F2 v: E算法:7 L5 |, q. p  T. Y$ y% D6 {  c
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
, v% d! v; w, V- @( E* z2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 12:05 , Processed in 0.059170 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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