單元1: 基本概念
章節概要 歡迎來到組合語言的世界 虛擬機器的概念 資料表示法 布林運算
歡迎來到組合語言 一些很好的問題 組合語言的應用
疑問 為什麼我們要學習組合語言? 讀者應該俱備什麼樣的背景智識? 什麼是組譯器? 我需要什麼樣的硬體及軟體? 讀者可以開發出什麼樣類型的程式? 讀者可以從這本書獲得什麼樣的資源? 讀者可以學習到什麼?
歡迎來到組合語言的世界 (要旨) 組合語言和機器語言之間有什麼關聯性? C++和Java跟組合語言之間有什麼關聯性? 組合語言俱有可移值性嗎? 為什麼要學習組合語言?
組合語言的應用 一些代表性的應用: 單一平台的商業應用軟體 硬體裝置驅動程式 多平台的商業應用軟體 嵌入式系統和電腦遊戲 (see next panel)
組合語言與高階語言的比較
下一步是什麼 歡迎來到組合語言的世界 虛擬機器的概念 資料表示法 布林運算
虛擬機器的概念 虛擬機器 特定用途機器
虛擬機器 電腦通常可以執行以本機機器語言形式所撰寫的程式,我們稱此種語言為 L0。 Tanenbaum:虛擬機器的概念 Programming Language analogy: 電腦通常可以執行以本機機器語言形式所撰寫的程式,我們稱此種語言為 L0。 假如有一個新的語言稱為 L1,此語言是希望程式設計者能夠易於使用,那麼我們就可以拿 L1 來開發程式。 用 L1 來開發程式,要達到此目的有兩種方法: : 直譯 – :在 L1 所寫的程式執行時,程式的每道指令都會由另一個用 L0 所寫的程 式加以解碼與執行 轉譯 –:整個用 L1 所寫的程式可以被轉換成 L0 的程式,其作法是,使用另一個為 了此目的而設計的L0程式來負責此動作, 然後所產生的L0程式便可以直接由電腦硬體執行。
Translating Languages English: Display the sum of A times B plus C. C++: cout << (A * B + C); 組合語言: mov eax,A mul B add eax,C call WriteInt Intel機器語言: A1 00000000 F7 25 00000004 03 05 00000008 E8 00500000
各層級的虛擬機器 (descriptions of individual levels follow . . . )
高階語言 Level 5 高階語言的應用方向 C++, Java, Pascal, Visual Basic . . . Level 5 的程式通常是以編譯器將其轉換成 Level 4 的程式,接著再轉譯 成 Level 4 的程式碼。
組合語言 Level 4 助憶碼有類似機器語言一對一的功能 中斷呼叫這樣的組合語言敘述式,則直接交由 Level 3 的作業系統加以執行。 組合語言是出現在 Level 4,它使用了許多簡短的助憶碼,例如ADD、 SUB 及 MOV 等等,這些助憶碼可以很容易地轉譯到 Level 2 的指令集架構。
作業系統 Level 3 可以檢測Level 4的程式。 作業系統軟體會經過轉譯成為機器碼,然後在 Level 2 機器上執行。
指令集架構 Level 2 也了解傳統的機器語言。 每一個機器語言的指令會由數個微指令來負責執行。
微架構 Level 1 翻譯傳統的機器指令 (Level 2) 藉由數位硬體來執行動作 (Level 0)
數位邏輯 Level 0 CPU是由數位邏輯閘建構成的。 系統匯流排。 記憶體。 是由雙極電晶體所構成的。 next: Data Representation
下一章 歡迎來到程式語言的世界 虛擬機器的概念 資料表示法 布林運算
資料表示法 二進位數值 二進位加法 整數儲存空間的大小 十六進位整數 有號整數 字元的儲存空間 二進位與十進位的轉換 十六進位與十進位的轉換 十六進位的減法 有號整數 二進位的減法 字元的儲存空間
二進位數值 數字不是1就是0 1 = 真 0 = 假 MSB –最大有效位元 LSB –最小有效位元 位元表:
二進位數值 每個位元不是1就是0 每個位元代表2的次方: 每個二進位的值是2次方的加總
將二進位的轉變為成十進位的 位加權表示法顯示出如何計算十進位中每個二進位的位元 的值: : 位加權表示法顯示出如何計算十進位中每個二進位的位元 的值: : dec = (Dn-1 2n-1) + (Dn-2 2n-2) + ... + (D1 21) + (D0 20) D =二進位數字 二進位的 00001001 = 十進位的 9: (1 23) + (1 20) = 9
將無號十進位整數轉換為二進位 將該十進位整數重複除以 2,並 且將每次除法運算的每個餘數,儲存起來作為各個二進位數字。 37 = 100101
二進位加法 由最低階位元對 ( 最右邊 ) 開 始,並且將每個後續位元對相加起來。
整數儲存空間的大小 每種儲存空間單位的位元數目: 可能被儲存在20位元的最大無號整數是多少?
十六進位整數 二進位的值被十六進位取代
將二進位轉換成十六進位 十六進位整數中的每個數字,代表 4 個二進位位元,而兩個結合 起來的十六進位數字則能代表 1 個位元組。 例如: 000101101010011110010100 會等同於十 六進位整數 16A794 :
將無號十六進位整數轉換為十進位 每個數字位置都代表一個 16 的次方: dec = (D3 163) + (D2 162) + (D1 161) + (D0 160) 十六進位 1234 = (1 163) + (2 162) + (3 161) + (4 160) 或等於十進位的 4660。 十六進位3BA4 = (3 163) + (11 * 162) + (10 161) + (4 160), 或 十進位的15,268.
16的各次方 列舉出從 160 到 167 各個 16 的次方值
將無號十進位整數轉換為十六進位 十進位的422 = 十六進位的1A6
Hexadecimal Addition 36 28 28 6A 42 45 58 4B 78 6D 80 B5 Divide the sum of two digits by the number base (16). The quotient becomes the carry value, and the remainder is the sum digit. 1 1 36 28 28 6A 42 45 58 4B 78 6D 80 B5 21 / 16 = 1, rem 5 Important skill: Programmers frequently add and subtract the addresses of variables and instructions.
Hexadecimal Subtraction When a borrow is required from the digit to the left, add 16 (decimal) to the current digit's value: 16 + 5 = 21 -1 C6 75 A2 47 24 2E Practice: The address of var1 is 00400020. The address of the next variable after var1 is 0040006A. How many bytes are used by var1?
有號整數 最大有效位元 (MSB) 可以用於標示數值的正負號。此時,0 表示該整數為正,1 則表示該整數為負。 如果有一個十六進位的最高位元 > 7, 則此值為負號 例如: 8A, C5, A2, 9D
2's補數表示法 在表示負數時,可以使用 2‘s 補數表示法 在此表示法中,一個整數 的 2's 補數,即為它的加法逆元素 注意 00000001 + 11111111 = 00000000
二進位的減法 當要做A-B的動作時,將B轉換成二的補數 即A+(-B) 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 – 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 練習:1001 - 0101
Learn How To Do the Following: 形成十六進位整數二的補數 將有號二進位轉換成十進位 將有號十進位轉換成二進位 將有號十進位轉換成十六進位 將有號十六進位轉換成十進位
最大值與最小值 保留最高位元的符號,限定的範圍是: 練習: 可能儲存空間為20位元的最大整數值是多少
字元的儲存空間 字元集 空字元終止字串 使用ASCII字元表 標準的美國資訊交換標準碼 (0 – 127) 廣義的美國資訊交換標準碼 (0 – 255) 美國國家標準協會(0 – 255) 萬國碼標準(0 – 65,535) 空字元終止字串 一個由若干字元所組成的字串,而且這些字元後面緊接著其內容值為零的單一位元組 使用ASCII字元表 本書封底內頁有一個表格,其內列舉出在 MS-DOS 模式下執行時所使 用的 ASCII 碼。
數值資料表示法的術語 單純的二進位 ASCII 二進位 ASCII 十進位 ASCII 十六進位l 可以直接計算 數值字串為: "01010101" ASCII 十進位 數值字串為: "65" ASCII 十六進位l 數值字串為: "9C" next: Boolean Operations
下一個是什麼? 歡迎來到程式語言的世界 虛擬機器的概念 資料表示法 布林運算
布林運算 否 (NOT) 運算:其符號為 ¬、~ 或 ' (AND) 運算:其符號為 ∧ 或 • (OR) 運算:其符號為 ∨ 或+ 運算子優先權 真值表
布林代數 布林運算式也在軟體程式設計中,用於表示邏 輯運算。十九世紀中期一位數學家 George Boole 所發明的 基本的布林運 算子: NOT, AND, OR
NOT NOT 運算可以將其運算元的布林值予以反轉 真值表使用變數 X 來顯示出 NOT 運算的所有可能結果: 數位閘圖形表示:
AND 以下真值表 針對變數 X 和 Y 的值,顯示所有可能的結果 ( 陰影部分 ): 數位閘圖形表示:
OR 真值表 針對變數 X 和 Y 的值,顯示所有可能的結果 ( 陰影部分 ): 數位閘圖形表示:
運算子優先權 例子顯示出順序
真值表 (3-1) 布林函數會接收布林輸入,然後再產生布林輸出 真值表內會顯示所有可能的輸入和輸出。 範例: X Y
真值表 (3-2) 範例: X Y
真值表 (3-3) 範例: (Y S) (X S) 二輸入多工器
摘要 組合語言幫助你學習如何在最低的標準下建構出軟體 組合語言和機器語言之間具有一對一的關係 虛擬機器概念是說明計算機架構中的每一層,如何代表一個抽象機器的有效方法 虛擬機器中的各層可以是硬體或軟體建構而成 布林運算式對電腦硬體與軟體的設計是非常重要的