段寄存器詳解:
段寄存器分8個:ds,ss,cs,es,fs,gs,ldtr,tr
回想我們寫匯編的時候我們對一處內存進行操作時舉個移動的例子吧
mov dword ptr ds:[0x35687],eax
實際我們的地址是ds+0x35687
我們使用棧空間時使用的是ss段寄存器,訪問內存數據段的時候是使用的ds寄存器進行訪問,我們使用ds寄存器對數據段進行操作時在cpu角度上有權限描述我們在使用es對附加段進行源數據與目標數據進行操作時有也權限描述,我們的段選擇子都是一樣的都是002b
cs代碼段寄存器又是0023,我們的fs寄存器的則是0053
我們學過匯編的都知道我們這句指令的意思是把eax的值給到35687這個地址這,那我把35687改成800000這種高地址我們還能這樣搞顯然不能會直接報錯,那為什么會報錯呢,換句話說就是是什么原因導致的報錯呢,這個我們就要說到我們剛剛提到的002b,的這個東西了,這個002b它是有個含義的拆成二進制我們就知道了,0000 0000 0010 1011 后3位 011 11這個東西是RPL(請求權限級別) 后兩位又有4個標識,0代表是0環的最大權限請求 1,2,3,4分別代表處於的環,我這個是處於在3環的代碼那它的請求級別就是3 ,前面0的含義又是什么呢,查的表,表有兩張一張ldt,一張gdt,這個ldt里面就是段選擇子,gdt是張總表,代碼怎么去執行操作什么數據查的都是gdt這張表 那現在我們就應該知道 11是3環請求級別 0是查gdt,這個段選擇子去執行代碼或者說是操作數據時都會去對gdt表進行查詢,查詢結果為1的話會執行lldt裝載某一個ldt,之后段選擇子會在gdt表里找ldt,之后的操作大致為判斷選擇子然后到ldt里去尋找要執行的指令
過程大致為:ds=2b 0010 1011 00101為索引,0為查詢哪張表,11為權限
0我們到gdt表進行查詢,查詢位置公式為:段選擇子=gdt首地址+HEX(5*8)
我們對段寄存器讀的值為16位,寫的值為96位
我們接着看看段寄存器的結構體
struct segment
{
word slector
word atrribute
dword base
dword limit
}
這篇文章內容大概就是這樣
下一篇講段寄存器的探測了