Re: [問題] big endian中bit field 的問題

作者: descent (「雄辯是銀,沉默是金」)   2022-12-28 15:32:41
一樣用 qemu, 安裝 ppc32 debein8 測試, 這個花了我比較多時間。
ref:
https://gist.github.com/nstarke/c6593da117c459c18c255395211fa311
ppc32
(gdb) p reg
$1 = {B1 = {A1 = 9 '\t', A2 = 0 '\000', A3 = 1 '\001', A4 = 1 '\001', A5 = 4
'\004', A6 = 22136}, B2 = 305419896 (0x12345678),
memory layout
(gdb) x/4xb &reg
0xbffffb28: 0x12 0x34 0x56 0x78
x86
(gdb) p reg
$2 = {B1 = {A1 = 18 '\022', A2 = 0 '\000', A3 = 1 '\001', A4 = 0 '\000',
A5 = 3 '\003', A6 = 30806}, B2 = 2018915346 (0x78563412), B3 = "\022\064Vx"}
memory layout
(gdb) x/32xb &reg
0xffffd058: 0x12 0x34 0x56 0x78
memory layout 都一樣, 但 bit fields 的解釋卻不一樣。
※ 引述《ca5270 (蘭陵哭哭生)》之銘言:
: 各位大神好,小弟在最近的面試中碰到了這類的考題
: Q:在big endian中B1.A1的值會是多少
: 小弟的想法是因為在little endian中會取REG_SET.B3[0]這個記憶體中的低7位,值為0x12,
: 所以在big endian中會取記憶體中的高7位,所以值為0x9,請問這樣的想法正確嗎
: typedef unsigned char u8;
: typedef unsigned short u16;
: typedef unsigned long u32;
: typedef union{
: struct{
: u8 A1 :7;
: u8 :1;
: u8 A2 :2;
: u8 A3 :1;
: u8 A4 :1;
: u8 A5 :4;
: u16 A6;
: } B1;
: u32 B2;
: u8 B3[4];
: } REG_SET
: REG_SET.B3[0] = 0x12;
: REG_SET.B3[1] = 0x34;
: REG_SET.B3[2] = 0x56;
: REG_SET.B3[3] = 0x78;

Links booklink

Contact Us: admin [ a t ] ucptt.com