1 / 64

第三章 CPU 與組合語言

第三章 CPU 與組合語言. 組合語言之指令行 常數與記憶體變數 程式風格 指令集 與 指引指令. 組合語言之指令行. 標籤欄 :. 運算子欄. 運算元欄. ; 註解 欄. 繼續. 基本組合語言指令行為四欄式 標籤 (選用, 視情況需要使用) 運算子 :指令助憶符號(必要) 運算元 (通常需要) 註解 (選用, 最好養成說明程式習慣). 2. 標籤. 標籤欄 :. 運算子欄. 運算元欄. ; 註解欄. 標籤( Label ) 是一種 識別碼 , 做為程式或資料的標的。

yael
Download Presentation

第三章 CPU 與組合語言

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三章 CPU與組合語言 組合語言之指令行 常數與記憶體變數 程式風格 指令集與指引指令

  2. 組合語言之指令行 標籤欄: 運算子欄 運算元欄 ;註解欄 繼續 • 基本組合語言指令行為四欄式 • 標籤(選用, 視情況需要使用) • 運算子:指令助憶符號(必要) • 運算元(通常需要) • 註解(選用, 最好養成說明程式習慣) 2

  3. 標籤 標籤欄: 運算子欄 運算元欄 ;註解欄 • 標籤(Label)是一種識別碼,做為程式或資料的標的。 • 程式碼標籤(Code Label):程式位址,以:結束。(MASM範例) • 資料標籤(Data Label):變數位址,不可加: • 標籤需獨特,一程式中不能有兩個相同之標籤。

  4. 標籤(masm範例) • 程式碼標籤以:結束 Target: mov ax,bx jmp Target • 資料標籤,不可加: First BYTE 10

  5. 運算子 標籤欄: 運算子欄 運算元欄 ;註解欄 • 指定CPU之動作, • 以指令助憶符號(instruction Mnemonic)表示。 • 依指令用途運算元有0~3個。 • CPU指令集格式:學習指令功能與用法。

  6. 指令助憶符號 • 指令助憶符號(instruction Mnemonic) :CPU指令集, 用簡短之英文字幫助記憶。 • 以MASM為例,如: mov(move 搬移、複製) 、 add (addition加)、sub(substration減)、mul( multply乘)、jmp(jump跳至位址) 、call(call呼叫程序)

  7. CPU指令集指令說明格式與要點 • 指令說明格式與要點 • 指令名稱:簡單說明 • 影響旗標(狀態暫存器) • 功能與用途 • 指令格式 • 學組合語言要件 瞭解指令集 • 指令集:MASM指令集、指引指令

  8. 運算元 標籤欄: 運算子欄 運算元欄 ;註解欄 • 可以是常數、記憶體變數、暫存器。 • 暫存器可直接使用。 • 常數分常數符號與數字 • 常數符號需以指引指令先定義 • 記憶體變數,需使用資料定義指引指令定義後,才可使用。

  9. 運算元定義 定義運算元 • 定義記憶體變數運算元變數之MASM範例。 • 定義常數符號運算元常數符號之MASM範例。 • 定義暫存器運算元使用CPU內建之暫存器保留字。

  10. 變數之MASM範例 • 位元組定義: • BYTE及SBYTE、DB、字串。 • 字組定義: • WORD及SWORD、DW、字組陣列 • 初值宣告:多重初值、未初始資料、data&data?比較

  11. 常數符號之MASM範例 • =指引(等號) • (範例) • EQU指引 • (範例) • TEXTEQU • =與EQU比較

  12. 註解 標籤欄: 運算子欄 運算元欄 ;註解欄 • 註解(comments):用於說明程式, 不會執行單列註解,各種組合語言有不同之規定, • 以MASM為例 12

  13. MASM之註解 • 由分號(;)起始。或區段註解,由COMMENT xx 設定符號 xx 開始, 至 xx 結束。如: inc EAX ;EAX=EAX+1 COMMENT $ (此例xx為$) this line is a comment this line also is a comment $ 13

  14. 常數與記憶體變數 基本定義語法 • 記憶體資料變數定義語法定義記憶體變數。 • 常數符號之定義語法定義常數符號。 繼續

  15. 資料籤欄 指引 初始設定式 ;註解欄 資料變數定義語法 • 資料定義敘述(data definition statement):以組譯器內建資料型態,建立變數。 • 語法(MASM): • 初始設定式: 給定該變數初值, 使用?代表不定初值(可能為任意數值) • 變數在記憶體之格式(MASM範例)。

  16. 資料變數在記憶體之格式(以MASM為例) • 位元組定義: • BYTE及SBYTE、DB、字串。 • 字組定義: • WORD及SWORD、DW、字組陣列 • 資料在記憶體中之排列順序: • 小印地安排序(MASM使用) :(範例) • 大印地安排序:(範例) • 初值宣告:多重初值、未初始資料、data&data?比較

  17. BYTE及SBYTE • BYTE(定義位元組)及SBYTE(定義有號位元組) 如: Value1 BYTE 10h Value2 SBYTE -100 變數名稱: 上例之Value1, Value2 資料 10h(16進位) 資料 100(十進位)

  18. BYTE及SBYTE早期為DB • DB指引: BYTE, SBYTE早期可以DB取代 Value1 DB 10h Value2 DB -100

  19. 位移值 數值 List+00 List+1 List+2 List+3 10 20 30 40 多重初始值 • 一個變數也可同時給與一段位址(陣列型態), 如: List BYTE 10,20,30,40

  20. 以BYTE定義字串 • 建立字串資料定義,以引號包住一串字元,最常見的字串以空白位元結尾,也就是位元組值為0,如: Greeting1 BYTE“Good”, 0 等於 Greeting1 BYTE‘G’,‘o’,‘o’,‘d’, 0 若太長可以以 \ 將兩行連接為一行 Greeting1 \ BYTE “Good”, 0

  21. WORD及SWORD • WORD(定義字組)及SWORD(定義有號字組)指引建立一個或多個十六位元的整數。 Word1 WORD 65535 Word2 SWORD –32768

  22. WORD及SWORD早期版本 DW Word1 WORD 65535 Word2 SWORD –32768 • 早期版本 DW Word1 DW 65535 Word2 DW –32768

  23. 位移值 數值 myList+00 myList+02 myList+04 myList+06 1 2 3 4 字組陳列 • 字組陳列(Array of Words) myList WORD 1,2,3,4,5

  24. 小印地安排序 • Intel處理器從記憶體存取資料使用稱為小印地安排序(little endian order)的方式, • 表示最小有意義的位元組(LSB)資料存在最低的位址,其餘的位元組(MSB)就接著存放在相鄰的位置。

  25. 位移值 數值 d1+01 d1+02 d1+03 d1+04 78h MSB LSB 56h 34h 12h 小印地安排序(例) 如: d1 DWORD 12345678h

  26. 大印地安排序 • 有些其他的電腦系統使用大印地安排序(big endian order)(高到低) • 表示最大有意義的位元組(MSB)資料存在最低的位址,其餘的位元組(LSB)就接著存放在相鄰的位置。

  27. 位移值 數值 d1+01 d1+02 d1+03 d1+04 12h 34h 56h 78h 大印地安排序(例) • 如: d1 DWORD 12345678h MSB LSB

  28. 宣告未初始資料 • DATA?指引可以用來宣告未初始資料,特別是在宣告大區塊的未初始資料特別好用。 .data Smallarray DWORD 10 DUP(0) .data ? Bigarray DWORD 5000 DUP(?)

  29. 宣告未初始資料(比較) .data Smallarray DWORD 10 DUP(0) .data ? Bigarray DWORD 5000 DUP(?) • 下面的程式碼產生的編譯後程式會比上的程式多20000位元組 .data Smallarray DWORD 10 DUP(0) Bigarray DWORD 5000 DUP(?)

  30. 符號常數 • 符號常數(symbolic constant)、符號定義(symbol definition) • 一個符號(識別碼) • 或是一個整數運算式 • 或一些文字 • 符號常數不使用任何儲存空間,不像變數定義,會保留儲存體空間。

  31. 符號常數與變數比較 • 所有運算之數值計算方式: • 符號常數:在組譯時完成。 • 變數:在執行階段由程式完成,且記得給初始值。

  32. 常數之定義方式(MASM語法) • =指引(等號) • (範例) • EQU指引 • (範例) • TEXTEQU • =與EQU比較

  33. 程式風格 • 程式區 • 資料區 • 程式架構 • 基本架構 • 混合式 • 簡易程式架構經驗 繼續

  34. 程式區 • 組合與言一行一指令,且相鄰指令會組譯在相鄰之記憶體(指令或變數皆是如此) 。 • 因此指令最好有一專屬之區塊。編輯可執行之指令。 • MASM範例: • .CODE、SEGMENT。

  35. 資料區 • 組合語言之資料最好依使用特性設定不同之資料區。編輯相關之資料變數定義。 • 如:堆疊(STACK) 、一般資料。 • MASM範例: • .DATA、.STACK、SEGMENT。

  36. 程式架構 • 需包含 • 程式說明、 • 常數定義、 • 變數定義(資料區) 、 • 堆疊定義(資料區) 、 • 程式指令與副程式(程式區)及 • 其他相關定義。

  37. 基本架構 • 至少需有下列定義程式才能執行: • 變數(資料區) 。 • 堆疊(資料區) 。 • 程式指令與副程式(程式區) • 右圖為MASM範例。 .STACK DB 100 DUP(?) .DATA A DB 12, 44, 55 NUM DB 3 .CDOE MOV AX, @DATA …..

  38. 混合程式碼與資料 • 一些組譯器,可讓你在程式中程式碼與資料自由來回切換,程式宣告變數時很方便。如: .code mov eax,ebx .data temp DWORD ? .code mov temp, eax 沒有錯, 但 不建議使用

  39. 簡易之程式經驗 • 使用常數符號 • MASM之組譯, • 16bit • 32bit • 16bit32bit

  40. 使用常數符號 • 為何使用符號?經驗告訴我們,使用符號會讓程式容易閱讀及維護。 • 容易閱讀 • 重新定義

  41. 容易閱讀 • 鍵盤定義 Esc_key =27 LF =0Ah CR =0dh • 可以將不易記憶之各種數字定義為所代表之文字意義,如上列定義,就是將鍵盤按鍵值定義為一般使用之文字。

  42. 重新定義常數 count=6000 array db count DUP(0) count=5 mov al, count count=10 mov al, count Count 0,0,0…. 共6000個0 mov al, 5 mov al,10

  43. 16bit • 基本程式架構需含: INCLUDE Ivrin16.inc。 mov AX, @data mov DS, AX • 組譯及連結你的程式的批次檔名為make16.bat。 • 資料及程式碼標籤的位移值(位址)是十六位元。

  44. 32-bit • 基本程式架構需含: INCLUDE Ivrin32.inc。 • 組譯及連結你的程式的批次檔名為make32.bat。 • 資料及程式碼標籤的位移值(位址)是三十二位元。

  45. 32-bit16bit • 三十二位元程式轉換成十六位元程式,只有少數的地方需要改變: • INCLUDE指引對應不同的函數庫,Ivrin32.inc Ivrin16.inc。 • 16bit之資料區段需有 mov AX, @data mov DS, AX • 組譯及連結你的程式的批次檔名為make32.batmake16.bat。 • 資料及程式碼標籤的位移值(位址)是 是三十二位元十六位元。

  46. 指引指令 • 舉幾個MASM常用指引為例: • include • 等號指引: (範例) • EQU指引: (範例) • SEGMENT、ENDS • .CODE、.STACK、.DATA

  47. 等號指引 • 等號指引(equal-sign directive)連結符號名稱到整數運算式 • 名稱=運算式 • 例: count=500

  48. 等號指引(範例) • 例: count=500 mov al,count 組譯後產生 mov al, 500

  49. EQU指引 • EQU指引連結符號名稱、整數常數或是任意文字 • 定義為某運算式值 • 定義為另一個符號 • 定義為某<文字> 名稱 EQU 運算式 名稱 EQU 符號 名稱 EQU <文字…..>

  50. EQU範例 Matrix1 equ 10*10 Matrix2 equ <10*10> .data M1 WORD Matrix1 M2 WORD Matrix2 運算式(數值) 文字<> M1 WORD 100 M2 WORD “10*10”

More Related