學習:彙編語言

一、leaveq與retq
leaveq和retq中的q是指64位操作數。
leaveq相當於:
movq %rbp, %rsp
popq %rbp

retq相當於:
popq %rip
注意leaveq跟開頭是對應的:
push   %rbp
mov    %rsp,%rbp

有些指令集也把它叫做enterq。
而與retq對應的是callq,相當於:
pushq %rip
jmpq addr


二、系統啓動時BIOS會找到啓動設備,然後把其第一個扇區的512字節內容複製到RAM中從物理地址0x00007c00開始的位置,然後跳轉到這個地址處,開始執行剛剛裝載進來的代碼。

三、8個通用寄存器,6個段寄存器,EFLAGS寄存器,,EIP (instruction pointer) 寄存器構成了IA-32體系的基本執行環境,用以執行通用指令。

四、Intel 64

在"x86-64"出現以前,英特爾與惠普聯合設計出"IA-64"架構,惟這款64位架構並不與x86兼容,且市場反應較冷淡,同時受制於多個專利權,使其他廠商不能模仿。與x86兼容的AMD64架構便應運而生,其主要特點如名稱所述,既有支持64位通用暫存器、64位整數及邏輯運算,以及64位虛擬地址。

AMD64代表AMD放棄了跟隨Intel標準的一貫作風,選擇了像把16位的Intel 8086擴充成32位的80386般,去把x86架構擴充成64位版本,且兼容原有標準。

AMD64架構在IA-32上新增了64位暫存器,併兼容早期的16位和32位軟件,可使現有以x86爲對象的編譯器容易轉爲AMD64版本。除此之外,NX bit也是引人注目的特色之一。AMD64能有效地把x86架構移至64位的環境,並且能兼容原有的x86應用程序。

Intel 64計劃的歷史可謂相當長及複雜,其原因主要是因爲Intel自身的內政問題。該計劃開始時,其代號爲Yamhill,不過Intel一直對外宣稱其計劃不存在,至2004年初才改口承認,並把代號改爲CT(Clackamas Technology)。在宣佈CT計劃的數個星期內,Intel爲計劃給予多個新名稱。在2004年春季的IDF開發者論壇後,Intel將之命名爲“IA-32E”,意即IA-32的延伸,在數星期後才改稱爲EM64T。

Intel曾長時間把該計劃保持機密,其原因有以下兩點。第一,Intel不想給客戶混淆信息,把未來Itanium IA-64處理器的展望與x86混爲一談,但在Intel眼見使用AMD64的Opteron及Athlon 64取得成功,便需要對競爭者的威脅作出迎擊。而第二個原因,是Intel爲了自身的面子,必然不會承認使用了對手AMD的技術,因此Intel把該技術以EM64T這個名字來推出,雖然核心與AMD64幾乎相同,猶如一對孿生兄弟,但如果Intel使用了AMD64這名字,等於在幫對手做廣告宣傳。在以往Intel的營銷中,Intel總把AMD的產品貶爲自家技術的仿製品,不過這回AMD率先開發民用64位技術,Intel需要反過來吸納AMD的技術,使Intel在研發x86處理器技術的領導地位受到重挫,因此Intel在造勢方面便需要使用更多的人力物力。Intel主席Craig Barrett之後也承認在保密方面,這個機密算是保護得最差的。

在Intel 64(EM64T)的文件中,對於其指令集的起源隻字不提,因此有媒體便爲它起了“iAMD64”這個別名,諷刺Intel在迎擊AMD的民用64位技術上,使用了AMD的技術,直接把AMD64吸納過來,並以新名重新包裝使用。後來Intel索性將此技術正式命名爲Intel 64

Intel自家的64位IA-64與Intel 64並不兼容,即IA-64的軟件不能直接在Intel 64上運行。Intel 64所用的x86-64是IA-32指令集的延伸,而IA-64則是另一款獨立的架構,沒有任何IA-32的影子。雖然IA-64可通過模擬來運行IA-32的指令,但指令在運行前需經轉換,才能在IA-64上運行,導致其速度變慢。由於x86-64是從IA-32派生而來,因此運行IA-32與64位程序的表現也顯得綽綽有餘。

五、Intel 64通用寄存器(general-purpose registers,GPRs) 的數量是16。 GPRs是64-bits寬且支持對字節,字, 雙字和四倍長字整數的操作. 訪問字節寄存器統一地通過訪問最低8 bits來實現。instruction pointer寄存器變成64 bits。EFLAGS寄存器被擴展到64 bits寬,並且被用作RFLAGS寄存器。RFLAGS寄存器的高32 bits被保留,低32 bits與EFLAGS寄存器是相同的。

六、Instruction Pointer Sizes in 64-Bit Mode
                                                   名稱      使用位     高位
16-bit instruction pointer            IP       低16位     Not Modified
32-bit instruction pointer          EIP       低32位    Zero Extension
64-bit instruction pointer          RIP       全部64位
    
七、保護模式下尋址的機制
1、段寄存器中存放段選擇子Selector
2、GDTR中存放着段描述符表的首地址
3、通過選擇子(放在段寄存器中)根據GDTR中的首地址,就能找到對應的段描述符
4、段描述符中有段的基址(可以是這個段的線性首地址),就得到段在內存中的首地址
Linux系統中所有段的基地都爲0,故其邏輯地址與線性地址一致

5、加上偏移量,就找到在這個段中存放的數據的真正線性地址。

八、Intel 8086 16位CPU環境下:
物理地址=段值X16 + 偏移
在GAS彙編代碼中表示爲%es:(%bx),即%es<<4 + %bx

九、系統在進入保護模式之後會先建立分頁機制,這時內存尋址方式是段尋址;在Linux中段的基址爲0,故其地址等於物理地址;在分頁建立完成後,設置cr0寄存器的PG=1,則分頁開始生效;這時內存尋址方式是分頁尋址。

十、執行call指令時,當前執行代碼的下一條指令的地址被壓棧,這就是所謂的“返回地址”;call執行時,棧頂會指向這個返回地址;當call調用的函數返回前,會執行ret指令,這樣就會把之前壓棧的地址彈出到EIP寄存器,然後CPU根據EIP寄存器中保存的地址執行下一條指令。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章