640 likes | 813 Views
第三章 CPU 與組合語言. 組合語言之指令行 常數與記憶體變數 程式風格 指令集 與 指引指令. 組合語言之指令行. 標籤欄 :. 運算子欄. 運算元欄. ; 註解 欄. 繼續. 基本組合語言指令行為四欄式 標籤 (選用, 視情況需要使用) 運算子 :指令助憶符號(必要) 運算元 (通常需要) 註解 (選用, 最好養成說明程式習慣). 2. 標籤. 標籤欄 :. 運算子欄. 運算元欄. ; 註解欄. 標籤( Label ) 是一種 識別碼 , 做為程式或資料的標的。
E N D
第三章 CPU與組合語言 組合語言之指令行 常數與記憶體變數 程式風格 指令集與指引指令
組合語言之指令行 標籤欄: 運算子欄 運算元欄 ;註解欄 繼續 • 基本組合語言指令行為四欄式 • 標籤(選用, 視情況需要使用) • 運算子:指令助憶符號(必要) • 運算元(通常需要) • 註解(選用, 最好養成說明程式習慣) 2
標籤 標籤欄: 運算子欄 運算元欄 ;註解欄 • 標籤(Label)是一種識別碼,做為程式或資料的標的。 • 程式碼標籤(Code Label):程式位址,以:結束。(MASM範例) • 資料標籤(Data Label):變數位址,不可加: • 標籤需獨特,一程式中不能有兩個相同之標籤。
標籤(masm範例) • 程式碼標籤以:結束 Target: mov ax,bx jmp Target • 資料標籤,不可加: First BYTE 10
運算子 標籤欄: 運算子欄 運算元欄 ;註解欄 • 指定CPU之動作, • 以指令助憶符號(instruction Mnemonic)表示。 • 依指令用途運算元有0~3個。 • CPU指令集格式:學習指令功能與用法。
指令助憶符號 • 指令助憶符號(instruction Mnemonic) :CPU指令集, 用簡短之英文字幫助記憶。 • 以MASM為例,如: mov(move 搬移、複製) 、 add (addition加)、sub(substration減)、mul( multply乘)、jmp(jump跳至位址) 、call(call呼叫程序)
CPU指令集指令說明格式與要點 • 指令說明格式與要點 • 指令名稱:簡單說明 • 影響旗標(狀態暫存器) • 功能與用途 • 指令格式 • 學組合語言要件 瞭解指令集 • 指令集:MASM指令集、指引指令
運算元 標籤欄: 運算子欄 運算元欄 ;註解欄 • 可以是常數、記憶體變數、暫存器。 • 暫存器可直接使用。 • 常數分常數符號與數字 • 常數符號需以指引指令先定義 • 記憶體變數,需使用資料定義指引指令定義後,才可使用。
運算元定義 定義運算元 • 定義記憶體變數運算元變數之MASM範例。 • 定義常數符號運算元常數符號之MASM範例。 • 定義暫存器運算元使用CPU內建之暫存器保留字。
變數之MASM範例 • 位元組定義: • BYTE及SBYTE、DB、字串。 • 字組定義: • WORD及SWORD、DW、字組陣列 • 初值宣告:多重初值、未初始資料、data&data?比較
常數符號之MASM範例 • =指引(等號) • (範例) • EQU指引 • (範例) • TEXTEQU • =與EQU比較
註解 標籤欄: 運算子欄 運算元欄 ;註解欄 • 註解(comments):用於說明程式, 不會執行單列註解,各種組合語言有不同之規定, • 以MASM為例 12
MASM之註解 • 由分號(;)起始。或區段註解,由COMMENT xx 設定符號 xx 開始, 至 xx 結束。如: inc EAX ;EAX=EAX+1 COMMENT $ (此例xx為$) this line is a comment this line also is a comment $ 13
常數與記憶體變數 基本定義語法 • 記憶體資料變數定義語法定義記憶體變數。 • 常數符號之定義語法定義常數符號。 繼續
資料籤欄 指引 初始設定式 ;註解欄 資料變數定義語法 • 資料定義敘述(data definition statement):以組譯器內建資料型態,建立變數。 • 語法(MASM): • 初始設定式: 給定該變數初值, 使用?代表不定初值(可能為任意數值) • 變數在記憶體之格式(MASM範例)。
資料變數在記憶體之格式(以MASM為例) • 位元組定義: • BYTE及SBYTE、DB、字串。 • 字組定義: • WORD及SWORD、DW、字組陣列 • 資料在記憶體中之排列順序: • 小印地安排序(MASM使用) :(範例) • 大印地安排序:(範例) • 初值宣告:多重初值、未初始資料、data&data?比較
BYTE及SBYTE • BYTE(定義位元組)及SBYTE(定義有號位元組) 如: Value1 BYTE 10h Value2 SBYTE -100 變數名稱: 上例之Value1, Value2 資料 10h(16進位) 資料 100(十進位)
BYTE及SBYTE早期為DB • DB指引: BYTE, SBYTE早期可以DB取代 Value1 DB 10h Value2 DB -100
位移值 數值 List+00 List+1 List+2 List+3 10 20 30 40 多重初始值 • 一個變數也可同時給與一段位址(陣列型態), 如: List BYTE 10,20,30,40
以BYTE定義字串 • 建立字串資料定義,以引號包住一串字元,最常見的字串以空白位元結尾,也就是位元組值為0,如: Greeting1 BYTE“Good”, 0 等於 Greeting1 BYTE‘G’,‘o’,‘o’,‘d’, 0 若太長可以以 \ 將兩行連接為一行 Greeting1 \ BYTE “Good”, 0
WORD及SWORD • WORD(定義字組)及SWORD(定義有號字組)指引建立一個或多個十六位元的整數。 Word1 WORD 65535 Word2 SWORD –32768
WORD及SWORD早期版本 DW Word1 WORD 65535 Word2 SWORD –32768 • 早期版本 DW Word1 DW 65535 Word2 DW –32768
位移值 數值 myList+00 myList+02 myList+04 myList+06 1 2 3 4 字組陳列 • 字組陳列(Array of Words) myList WORD 1,2,3,4,5
小印地安排序 • Intel處理器從記憶體存取資料使用稱為小印地安排序(little endian order)的方式, • 表示最小有意義的位元組(LSB)資料存在最低的位址,其餘的位元組(MSB)就接著存放在相鄰的位置。
位移值 數值 d1+01 d1+02 d1+03 d1+04 78h MSB LSB 56h 34h 12h 小印地安排序(例) 如: d1 DWORD 12345678h
大印地安排序 • 有些其他的電腦系統使用大印地安排序(big endian order)(高到低) • 表示最大有意義的位元組(MSB)資料存在最低的位址,其餘的位元組(LSB)就接著存放在相鄰的位置。
位移值 數值 d1+01 d1+02 d1+03 d1+04 12h 34h 56h 78h 大印地安排序(例) • 如: d1 DWORD 12345678h MSB LSB
宣告未初始資料 • DATA?指引可以用來宣告未初始資料,特別是在宣告大區塊的未初始資料特別好用。 .data Smallarray DWORD 10 DUP(0) .data ? Bigarray DWORD 5000 DUP(?)
宣告未初始資料(比較) .data Smallarray DWORD 10 DUP(0) .data ? Bigarray DWORD 5000 DUP(?) • 下面的程式碼產生的編譯後程式會比上的程式多20000位元組 .data Smallarray DWORD 10 DUP(0) Bigarray DWORD 5000 DUP(?)
符號常數 • 符號常數(symbolic constant)、符號定義(symbol definition) • 一個符號(識別碼) • 或是一個整數運算式 • 或一些文字 • 符號常數不使用任何儲存空間,不像變數定義,會保留儲存體空間。
符號常數與變數比較 • 所有運算之數值計算方式: • 符號常數:在組譯時完成。 • 變數:在執行階段由程式完成,且記得給初始值。
常數之定義方式(MASM語法) • =指引(等號) • (範例) • EQU指引 • (範例) • TEXTEQU • =與EQU比較
程式風格 • 程式區 • 資料區 • 程式架構 • 基本架構 • 混合式 • 簡易程式架構經驗 繼續
程式區 • 組合與言一行一指令,且相鄰指令會組譯在相鄰之記憶體(指令或變數皆是如此) 。 • 因此指令最好有一專屬之區塊。編輯可執行之指令。 • MASM範例: • .CODE、SEGMENT。
資料區 • 組合語言之資料最好依使用特性設定不同之資料區。編輯相關之資料變數定義。 • 如:堆疊(STACK) 、一般資料。 • MASM範例: • .DATA、.STACK、SEGMENT。
程式架構 • 需包含 • 程式說明、 • 常數定義、 • 變數定義(資料區) 、 • 堆疊定義(資料區) 、 • 程式指令與副程式(程式區)及 • 其他相關定義。
基本架構 • 至少需有下列定義程式才能執行: • 變數(資料區) 。 • 堆疊(資料區) 。 • 程式指令與副程式(程式區) • 右圖為MASM範例。 .STACK DB 100 DUP(?) .DATA A DB 12, 44, 55 NUM DB 3 .CDOE MOV AX, @DATA …..
混合程式碼與資料 • 一些組譯器,可讓你在程式中程式碼與資料自由來回切換,程式宣告變數時很方便。如: .code mov eax,ebx .data temp DWORD ? .code mov temp, eax 沒有錯, 但 不建議使用
簡易之程式經驗 • 使用常數符號 • MASM之組譯, • 16bit • 32bit • 16bit32bit
使用常數符號 • 為何使用符號?經驗告訴我們,使用符號會讓程式容易閱讀及維護。 • 容易閱讀 • 重新定義
容易閱讀 • 鍵盤定義 Esc_key =27 LF =0Ah CR =0dh • 可以將不易記憶之各種數字定義為所代表之文字意義,如上列定義,就是將鍵盤按鍵值定義為一般使用之文字。
重新定義常數 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
16bit • 基本程式架構需含: INCLUDE Ivrin16.inc。 mov AX, @data mov DS, AX • 組譯及連結你的程式的批次檔名為make16.bat。 • 資料及程式碼標籤的位移值(位址)是十六位元。
32-bit • 基本程式架構需含: INCLUDE Ivrin32.inc。 • 組譯及連結你的程式的批次檔名為make32.bat。 • 資料及程式碼標籤的位移值(位址)是三十二位元。
32-bit16bit • 三十二位元程式轉換成十六位元程式,只有少數的地方需要改變: • INCLUDE指引對應不同的函數庫,Ivrin32.inc Ivrin16.inc。 • 16bit之資料區段需有 mov AX, @data mov DS, AX • 組譯及連結你的程式的批次檔名為make32.batmake16.bat。 • 資料及程式碼標籤的位移值(位址)是 是三十二位元十六位元。
指引指令 • 舉幾個MASM常用指引為例: • include • 等號指引: (範例) • EQU指引: (範例) • SEGMENT、ENDS • .CODE、.STACK、.DATA
等號指引 • 等號指引(equal-sign directive)連結符號名稱到整數運算式 • 名稱=運算式 • 例: count=500
等號指引(範例) • 例: count=500 mov al,count 組譯後產生 mov al, 500
EQU指引 • EQU指引連結符號名稱、整數常數或是任意文字 • 定義為某運算式值 • 定義為另一個符號 • 定義為某<文字> 名稱 EQU 運算式 名稱 EQU 符號 名稱 EQU <文字…..>
EQU範例 Matrix1 equ 10*10 Matrix2 equ <10*10> .data M1 WORD Matrix1 M2 WORD Matrix2 運算式(數值) 文字<> M1 WORD 100 M2 WORD “10*10”