2017-10-13 99 views
0
 0x0  0x6  0x0  0x1 

BIG - 00000000 00000110 00000000 00000001小尾數

LIT - 00000001 00000000 00000110 00000000

所以我期待0xcfb01420 + 2是爲0x6,但事實並非如此。我錯過了什麼嗎?

(gdb) p &tx_q_sem->mlock.u.mtxa_owner 
$41 = (volatile __uintptr_t *) 0xcfb01420 
(gdb) p/x tx_q_sem->mlock.u.mtxa_owner 
$34 = 0x601 
(gdb) p (char)*(char*)(0xcfb01420+0) 
$36 = 0x1 
(gdb) p (char)*(char*)(0xcfb01420+1) 
$37 = 0x6 
(gdb) p (char)*(char*)(0xcfb01420+2) 
$38 = 0x0 
(gdb) p (char)*(char*)(0xcfb01420+3) 
$39 = 0x0 

我的假設是,小尾數格式的0x601的字節序列應該與我上面表示的方式相匹配。因此第二個字節應該全部爲零。在那裏,我猜想所有的啃都是正確的。

+1

使用'的x/4xb 0xcfb01420'以檢查在存儲器中的4個字節,分別表示各字節。比打印更容易。儘管你也可以完成'p/x(char [4])tx_q_sem-> mlock.u.mtxa_owner',我想。 –

+0

感謝您的評論,但是我想我沒有清楚地表達我的想法。即使用你的方法也沒有什麼變化我的問題是在GDB中沒有正確顯示小端。對於x86小端格式,0x6應該位於第三個字節。 (gdb)x/4xb 0xcfb01420給我 0xcfb01420:0x01 0x06 0x00 0x00。還是我的轉換本身是錯誤的? –

+1

請記住,一個字節是2個十六進制數字(半字節)寬。湯姆的回答是正確的,當你單獨打印每個字節時,gdb會忽略前導零。 '0x601'中'6'的位置值是2^8:它是* 2nd *字節底部的'6 *(1U << 8)'。 –

回答

2

您的初始十六進制值全都是丟失數字,相對於您實際正在檢查的數字。

000000010x01 - 它是8個二進制數字,所以是一個完整的字節。

所以0x601 == 0x0601 == 00000110 00000001

可以在gdb與看到這一點:

(gdb) print /t 0x601 
$1 = 11000000001