【汇编语言】镜像迁移能力之一通百通——由代码段和CS:IP的原理,掌握一类寄存器的使用
0 前言
你應該知道8086CPU的物理地址形成方式及其原理,才能完成本文的學習。
1 內存的分段
對于內存,人們人為地將其劃分為一段一段的,比如代碼段和數據段等,特別注意,這是人為劃分的結果,方面人類使用,在物理器件上并不是真正的斷開了。
內存的分段就好比這樣,人們
- 把代碼放在代碼段
- 把數據放在數據段
再強調一次,這是幫助人們和匯編語言編譯器區分,并不是真的把內存切開,這是虛擬的分段。
1.1 代碼段
現在,我們以代碼段為例,來學習一些知識。
先給出以下這樣一部分匯編指令
mov ax,0000h // 占3個字節 add ax,0123h // 占3個字節 mov bx,ax // 占2個字節 jmp bx // 占2個字節我們將這樣幾行代碼,稱為一個代碼段,假設我們使用內存地址123B0H ~ 123B9H來存儲它。
對于地址123B0H,我們稱之為該代碼段的起始地址,它必須是16的整倍數,它對應的段地址是123BH。
該代碼段的長度為10個字節。
我們先介紹這些,請繼續往下看。
2 CS:IP
CS:Code Segment(代碼段寄存器)
IP:Instruction Pointer(指令指針寄存器)
這兩個寄存器都是16位的,由CS提供段地址,這個段地址對應上一小節的123BH,由IP提供偏移地址。
CS:IP的意義是,將兩個16位的地址,在CPU內部合成為20位地址,并輸出到外部,CS:IP合成的地址是對于內存地址的,比如上一小節的123B0H,其公式是合成地址 = CS*16 + IP,比如123B0H = 123BH*16 + 0H
CS:IP所指向的內存地址,代表這個內存地址所存儲的二進制信息是指令,然后會進入CPU執行該指令。
3 代碼段與CS:IP的聯系
這里給出了CS:IP、內存地址、代碼段和匯編指令之間的對應關系,建立起了CPU和內存之間的聯系。
本文并不講解CS:IP的原理,是幫助你加深理解內存和CPU操作之間的關系。
這里重點強調:
- 先確定CS:CS寄存器存儲的是段地址,左移一位后(乘16),對應的是代碼段的基礎地址
- 再確定IP:IP寄存器存儲的是段內偏移地址,偏移地址是在基礎地址的基礎上,進行偏移,以便于執行代碼段中的各個指令。
需要注意的是,代碼段,以及其他段,最大的段長等于IP的最大值,這里是16位,也就是一個段最大2^16B = 64KB。
4 段地址和偏移地址的本質
段地址有兩重含義:
偏移地址,更本質的說法是段內偏移地址,這里的段內含義的某一代碼段內,例如上述實例
- 偏移0H,執行mov ax,0000h
- 偏移3H,執行add ax,0123h
- 偏移6H,執行mov bx,ax
- 偏移8H,執行jmp bx
5 鏡像遷移——掌握其他類型
對于類似的操作及其對應關系,模式都一樣!,就好比
- 國家之下有省
- 省之下有市
- 市之下有縣
整體來看,同一層級的管理模式整體來說,是一樣的。
這里我需要說明,寄存器的能力是一樣的,就是暫存數據,只不過其分工不同,做的事情不同,但是因為其能力一樣,因此只需要掌握一種模式,就可以進行快速復制。
我們需要做的是,學好一個內容,然后使用鏡像遷移的能力,復制成功的模式,這樣你就快速學會各種匯編操作。
你會發現,以下內容,你能夠快速掌握!
這里我直接引用了一個表格,請讀者按照CS:IP的模式,自行完成學習,這里有一個可替換段地址,請自行查閱資料,這也是必備的能力。
總結
以上是生活随笔為你收集整理的【汇编语言】镜像迁移能力之一通百通——由代码段和CS:IP的原理,掌握一类寄存器的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【计算机网络】手动配置hosts文件解决
- 下一篇: 成都欢乐谷入园需要身份证吗