程序轉換概述
“指令”的概念
- 計算機中的指令有微指令、機器指令和偽(宏)指令之分
- 機器指令處於硬件和軟件的交界面
- 相當於一個菜譜指定的一個完整做菜過程
- – 本章中提及的指令都指機器指令
- 微指令是微程序級命令,屬於硬件范疇
- 相當於洗、切、煮、炒等做菜“微過程“
- 偽指令是由若干機器指令組成的指令序列,屬於軟件范疇
- 相當於由多個菜譜合成一個”大菜“的過程
- 匯編指令是機器指令的匯編表示形式,即符號表示 • 機器指令和匯編指令一一對應,它們都與具體機器結構有關,都 屬於機器級指令
機器級指令
Gcc使用
• 兩個源程序文件main.c和test.c,最終生成可執行文件為test
• 選項-O1表示一級優化,-O2為二級優化,選項-o指出輸出文件名
兩種目標文件
可執行文件的存儲器映像
總結
高級語言程序總是轉換為機器代碼才能在機器上執行 • 轉換過程:預處理、編譯、匯編、鏈接 • 機器代碼是二進制代碼,可DUMP為匯編代碼表示 • ISA規定了一台機器的指令系統涉及到的所有方面 例如: – 所有指令的指令格式、功能 – 通用寄存器的個數、位數、編號和功能 – 存儲地址空間大小、編址方式、大/小端 – 指令尋址方式
IA-32的系統概述
IA-32/x64指令系統概述
- x86是Intel開發的一類處理器體系結構的泛稱
- – 包括 Intel 8086、80286、i386和i486等,因此其架構被 稱為“x86”
- – 由於數字並不能作為注冊商標,因此,后來使用了可注冊的 名稱,如Pentium、PentiumPro、Core 2、Core i7等
- – 現在Intel把32位x86架構的名稱x86-32改稱為IA-32
- – IA是Intel Architecture的縮寫
- • 由AMD首先提出了一個兼容IA-32指令集的64位版本
- – 擴充了指令及寄存器長度和個數等,更新了參數傳送方式
- – AMD稱其為AMD64,Intel稱其為Intl64(不同於IA-64)
- – 命名為“x86-64” ,有時也簡稱為x64
IA-32的體系結構
IA-32的寄存器組織
IA-32的標志寄存器
IA-32的尋址方式
尋址方式 – 如何根據指令給定信息得到操作數或操作數地址 • 操作數所在的位置 – 指令中:立即尋址 – 寄存器中:寄存器尋址 – 存儲單元中(屬於存儲器操作數,按字節編址):其他尋址方式 • 存儲器操作數的尋址方式與微處理器的工作模式有關 – 兩種工作模式:實地址模式和保護模式 • 實地址模式(基本用不到) – 為與8086/8088兼容而設,加電或復位時 – 尋址空間為1MB,20位地址:(CS)<<4+(IP) • 保護模式(需要掌握) – 加電后進入,采用虛擬存儲管理,多任務情況下隔離、保護 – 80286以上微處理器的工作模式 – 尋址空間為232B,32位線性地址分段(段基址+段內偏移量)
保護模式下的尋址方式
存儲器操作數的尋址方式
各變量應采用什么尋址方式? x、c:位移 / 基址 a[i]:104+i×4,比例變址+位移 d[i]:544+i×8,比例變址+位移 b[i][j]: 504+i×8+j×2, 基址+比例變址+位移 將b[i][j]取到AX中的指令可以是: “movw 504(%ebp,%esi,2), %ax” 其中, i×8在EBP中,j在ESI中, 2為比例因子
IA-32機器指令格式
總結