- 論壇徽章:
- 0
|
題外話:關(guān)于數(shù)據(jù)的訪問倒底是使用哪個(gè) selector registers 進(jìn)行引用?
對(duì)于 code segment 的訪問,都知道是使用 CS selector register 。對(duì)于 data segment 的訪問,則是根據(jù)指令或內(nèi)存的尋址方式來(lái)決定使用哪個(gè) selector registers。
1、對(duì)于串操作指令來(lái)說,在缺省的情況下:源串引用 DS 作為參考對(duì)象,目標(biāo)串引用 ES 作為參考對(duì)象。
loadsd /* 從源串 ds:[esi] 中 load 到 eax 中 */
stosd /* 從 eax 中 store 到目標(biāo)串 es:[edi] 中 */
movsd /* 從源串 ds:[esi] 復(fù)制到目標(biāo)串 es:[edi] 中 */
----------------------------------------------------------------
stosd 缺省使用 ES selector register 來(lái)引用數(shù)據(jù),而 movsd 更是同時(shí)使用了 DS 和 ES selector register 來(lái)引用數(shù)據(jù)。
2、強(qiáng)制性改變?nèi)笔〉膮⒖紝?duì)象。
loadsd dword ptr fs:[esi] /* 這里強(qiáng)制性地將缺省引用對(duì)象 ES 改變?yōu)?FS,這將使用 FS 作為參考對(duì)象 */
mov eax, dword ptr es:[eax] /* 強(qiáng)制使用 ES 作為 參考對(duì)象 */
-------------------------------------------------------------
以上是使用修改指令前綴方法,強(qiáng)制使用指令的 selector registers 作為引用對(duì)象進(jìn)行數(shù)據(jù)訪問。對(duì)于 mov eax, dword ptr es:[eax] 這條指令來(lái)說:它的內(nèi)存操作數(shù) [eax] 缺省是使用 DS 來(lái)訪問 data segment 的。es:[eax] 則改為使用 ES 來(lái)訪問 data segment。
將 DS 強(qiáng)制改為 ES 后,當(dāng)然是使用 ES selector 來(lái)讀取 data segment descriptor。若 ES = DS 則與缺省情況并無(wú)兩樣,若 ES <> DS 則 ES selector 要先通過權(quán)限檢查,加載到 ES register 再作訪問。
3、push / pop 指令使用 SS 作為參考對(duì)象。
push / pop 之類的指令是固定使用 SS selector register 作為引用對(duì)象的。push 指令使用 SS 作為目標(biāo)操作數(shù)的引用對(duì)象。而 pop 指令使用 SS 作為源操作數(shù)的引用對(duì)象,這兩個(gè)是無(wú)法改變的。
push 指令的源操作數(shù)和 pop 指令的目標(biāo)操作數(shù),它們的引用對(duì)象則是可改的。
4、 基于 ebp 和 esp 的尋址方式使用 SS 作為參考對(duì)象
mov eax, dword ptr [ebp+0x0c]
-------------------------------------------
ebp 作為 stack frame base pointer 它缺省是使用 SS 來(lái)訪問數(shù)據(jù)的。
實(shí)際上等于顯式的: mov eax, dword ptr ss:[ebp+0x0c],當(dāng)然這個(gè)情況下,可以強(qiáng)制改為 DS,如:mov eax, dword ptr ds:[ebp+0x0c],這樣改為使用 DS 訪問數(shù)據(jù)。
又如:
mov eax, dword ptr [esp]
------------------------------------------------
esp 作為 stack pointer 它缺省是使用 SS 來(lái)訪問數(shù)據(jù)的。
實(shí)際上等于顯式的: mov eax, dword ptr ss:[esp],同樣也可以強(qiáng)制改為:mov eax dword ptr ds:[esp] 這樣就使用 DS 來(lái)訪問數(shù)據(jù)。
5、除了上述幾種情況下,其它都是使用 DS 作為缺省的參考對(duì)象
大多數(shù)情況下,指令的內(nèi)存操作數(shù)都是使用 DS 作為缺省對(duì)象來(lái)訪問數(shù)據(jù)。
典型的如:
mov eax, [eax]
mov eax, [ebx]
mov byte ptr [esi], 0x0c
等等... ...
6、 在 64 bit 模式下的 selector registers 使用
在 64 bit 模式下 DS、ES、SS 是無(wú)效的,因此,已經(jīng)沒有該使用哪個(gè) selector register 來(lái)訪問數(shù)據(jù)這種考慮了。所有的 data segment 的 base 都是 0。
無(wú)論是:
mov rax, qword ptr [rsp]
mov rax, qword ptr [rbp]
還是:
movsq
mov rax, qword ptr [rax]
--------------------------------------------------
它們的結(jié)果都是在基于 0 的 data segment 上進(jìn)行數(shù)據(jù)訪問。都是在一個(gè)平垣的內(nèi)存塊上進(jìn)行操作。所以,無(wú)所謂 selector 是什么?segment register 的值是什么?data segment descriptor 是什么?
但是,F(xiàn)S 和 GS 還是有效的。程序中依舊可以使用 FS 和 GS 訪問附加的 data segment。這些附加的 data segment 的 base 值可以不為 0,也就是 FS 和 GS 依舊可以構(gòu)造有限的 segmentation 功能。 |
|