顯示具有 Assembly 標籤的文章。 顯示所有文章
顯示具有 Assembly 標籤的文章。 顯示所有文章

2007年6月27日 星期三

Assembly Chapter 11 Overview

本章有三個重點,前兩個是32位元視窗環境下,主控台模式及圖形模式應用程式的開發,第三個則是IA-32記憶體管理架構.

從系統程式的角度來看,本章是是往上延伸至視窗程的開發所需的programming技巧,因此會使用到相關的Windows API.在這些函數中,有兩個被使用的字元集合型態:8位元的ANCII/ANSI字元集合以及16位元的wide/Unicode (Windows NT、2000以及XP)字元集合.在Windows API函數中,被使用的標準MS-Windows資料型態必須被轉換成MASM的資料型態,例如:BOOL (Windows 型態)轉換成BYTE (MASM型態)…等.

32位元的主控台模式(32 bits console mode)外觀和行為很類似16位元的MS-DOS程式設計,兩者的程式都要從標準輸入讀取並寫入到標準輸出中,兩者也都支援自訂命令列參數、文字的顏色。然而32位元主控台程式和DOS程式在底層是不同的,前者在保護模式(Protected Mode)下執行,後者卻是在真實模式(Real address mode)下執行,而且他們使用不同的函式庫:Win 32程式呼叫的函式庫跟圖形模式的視窗應用程式所呼叫的是一樣的,DOS程式則使用BIOS和來自IBM-PC的中斷.以下介紹幾個常用的Win32主控台函數:

  • 在主控台視窗中,用來做輸入/輸出的主控台控制碼是32位元的整數.必須透過GetStdHandle函數取得.輸入可呼叫ReadConsole函數,輸出則呼叫WriteConsole函數.當建立或開啟檔案時,則呼叫CreateFile函數;讀取與寫入,則分別呼叫ReadFile及WriteFile函數.除此之外CloseHandle函數可以關閉檔案,若想要移動檔案指標時,可呼叫SetFilePointer函數.
  • 若要操控主控台螢幕緩衝區,則必須呼叫SetConsoleScreenBufferSize;要改變文字顏色,可呼叫SetConsoleTextAttribute.要取得系統時間或設定系統時間,可用GetLocalTime及SetLocalTime,這兩個有關時間的函數都是使用SYSTEMTIME結構.

    圖形模式的視窗應用程式,其程式的主要架構其實是固定不變的,必須宣告一個主視窗類別WNDCLASS,並且填滿其中的資訊,包括:取得目前這個程式的控制碼GetModuleHandle、讀入程式的圖示LoadIcon和滑鼠的游標LoadCursor、登錄程式的主視窗RegisterClass、建立主視窗CreateWindowEx、顯示ShowWindow和更新主視窗UpdateWindow,以及開始一個接受GetMessage和發出訊息DispatchMessage的迴圈.一個應用程式要處理那些訊息則完全由使用自定的副程式(如WinProc)決定,而這個副程式與主視窗類別的鏈結是宣告WINDCLASS第二個參數即設定的.

    最後在記憶體管理的部份主要集中在兩個主要的議題:將邏輯位址轉換成線性位址以及將線性位址轉換成實體位址(分頁paging),課本說明其實不夠詳細,可以在網上查詢一下GDTR和LDTR,會更加清楚.

  • 邏輯位址指向一個區段描述表,負責指向一個在線性位址中的區段.區段描述表包含區段的資訊 (大小和位址型態).描述表有兩種:一個單一的全域描述表(GDT)和一個或多個區域描述表(LDT).
  • 分頁是IA-32處理器一個重要的特徵,它讓電腦可執行比實際記憶體還要大的程式.處理器只會讀一部份程式到記憶體內,其他的部份仍舊留在硬碟內.處理器會使用分頁目錄(page directory)、分頁表(page table)和分頁框架(page frame)來產生實體位址,其中分頁目錄包含了指向分頁表的指標,分頁表則包含指向分頁框架的指標.


    學習目標:

  • 32位元的程式如何處理文字的輸入/輸出、處理顏色、處理時間和日期
  • Console mode Windows application programming
  • Graphical mode Windows application programming
  • IA-32 Memory management
  • 2007年5月22日 星期二

    Assembly Chapter 8 Overview

    本章主要在詳細介紹副程式(procedure)進階相關問題.副程式的設計通常有參數,同時各個副程式中也可以有區域變數.參數分為register parameters跟stack parameters,利用暫存器來傳參數,我們已在第六章介紹過,本章則著重在利用推疊來傳遞參數.參數傳遞有分為call by value(傳值)及call by reference(傳址)兩種,因此呼叫副程式用(CALL或INVOKE)時,有時要加ADDR有時不用.

    更重要的一點則是堆疊因副程式呼叫所產生的變化,也就是所謂的stack frame,當呼叫一個副程式時,parameters, return address, ebp, local variable, used registers會依序放入堆疊,此處ebp暫存器扮演存取參數及區域變數的參考指標,因而所有副程式中使用到的變數及區域變數都會轉成[ebp- 12], [ebp-8], [ebp+4], [ebp+8]等記憶位置.

    學習提要
    1. Stack parameter & stack frame
    Pass by value, pass by reference
    Function of ebp

    2. Difference between
    CALL vs. INVOKE
    OFFSET vs. LEA

    2007年4月13日 星期五

    Assembly Chapter 6 Overview

    本章主要內容為組合程式語言中IF指令和條件處理(Conditional Processing), 首先介紹支援程式設計邏輯運算的二進位制基礎, 然後再說明CPU如何使用CMP指令和狀態旗標(State flag)來比較指令運算元, 最後匯集上述觀念來藉由組合語言, 來完成高階語言邏輯結構.

    按位元指令(bitwise instruction), 包括AND, OR, XOR, NOT及TEST等邏輯運算元, 執行時來源參數中的每個位元與目的參數中相同位置的位元做運算.

    CMP指令將目的運算元和來源運算元作比較, 換句話說, 由目的參數減來源參數而不保留相減的結果, CMP會依這個隱含的減法指令結果來修改CPU狀態的旗標值(flag value). CMP的後面通常緊接著條件跳耀指令(conditional jump instruction), 來將程式控制權移到某個程式碼標籤處, 常見的跳耀指令類型有:
    • 根據特定指標值(Jumps based on Specific flags), 例如: JC(jump carry), JZ(jump zero)..等.
    • 根據是否相等(Jumps based on Equality), 例如: JE(jump equal), JNE(jump not equal)...等.
    • 根據有號整數比較結果(Jumps based on Signed Comparisons), 例如:JL(jump if less), JG(jump if greater)...等.
    • 根據無號整數比較結果(Jumps based on Signed Comparisons), 例如:JA(jump if above), JB(jump if below)...等.
    .IF, .ELSE, ELSEIF以及.ENDIF等組譯器指令, 則是籍由近乎高階語言的寫法, 減化低階組語寫法, 這些指令在組譯後會轉換成相對應的CPU指令. 另外亦可使用.WHILE及.REPEAT指令來建立條件迴圈. 有了這些條件判斷組譯器指令, 寫組合語言相對簡單許多, 但對於資工系的學生而言, 必須要知道組譯器是如何轉換的.

    學習目標:
    1. Boolean and Comparison Instructions
    • CPU Status Flags
    • AND, OR, XOR, NOT and TEST instructions


    2. Conditional jumps

    • Jumps Based on (Specific flags, equality, unsigned comparisons...)

    3. Conditional Structures

    • Block-Structured IF statements
    • Compound Expression with AND
    • Compound Expression with OR
    • WHILE Loops
    • TABLE-Driven Selection

    2007年4月10日 星期二

    Assembly Chapter 5 Overview

    本章首先介紹本書的連結函式庫(link library), 它可以讓你在組合語言的應用程式中, 跳過尚未介紹到I/O來處理輸入及輸出. 連結函式庫中常見的程序(procedure)有Clrscr, Delay, DumpMem, DumpRegs等.

    本章的重點在堆疊(stack)的概念, 執行時期堆疊(runtime stack)是一個特別的記憶體空間, 用來當作一個暫時的存放空間, 儲存位址或資料. 堆疊亦稱為LIFO結構(後進先出), 因為最後存進堆疊中的值會最先被取出. 堆疊的操作元為push及pop. PUSH運算會將一個資料複製到堆疊中. POP運算則會由堆疊之中移除一個資料, 並將它複製到一個暫存器或變數之中, 堆疊經常用來保存程序的回傳位址, 程序參數, 區域變數及在程序內部所使用的暫存器.

    任何大小的程式都應藉由程式說明來小心的設計, 標準的方法是使用功能性分解(由上而下設計)來將程式分解為數個程序, 在確認程序之間的連結關係及順序後, 再填寫程序的細節內容.


    學習目標:

    1. 如何在組合語言的環境中進行輸入輸出的動作.
    2. 學習關於執行時期堆疊(runtime stack), 以及它如何讓我們能夠呼叫函數(function)的運作原理.
    3. 如何透過流程圖(flowcharts)來表示出程式的邏輯結構.

    Assembly Chapter 4 Overview

    本章主要在介紹組合語言中基本的指令(mov, add/sub)及其參數使用的基本限制.另外也介紹組譯器提供的處理陣列變數的directives.最後一部分則是介紹在組合語言下如何用JMP,LOOP來實踐C語言中的for,while迴圈以及條件選擇.

    一般而言,CPU指令的參數可以是直接的值(immediate), 或來自暫存器, 或來自記憶體.immediate值即是直接編在cpu instruction內,通常依照destination的type(即大小)編成適當的大小,每個暫存器則有相對應的代號,最複雜的則是記憶體位址,有多個表逹記憶體位址的方法,我們稱為定址方法(addressing).這章內我們可以看到direct addressing, direct-offset addressing, indirect addressing, indexed addressing等四種.

    了解參數型態之後,我們就可以解釋搬移指令MOV以及加法減法等指令在參數使用上有四個基本限制,原則上兩個參數大小要相同,最多只能有一個memory參數,immediate值不可直接搬移到segment register,以及CS, EIP不可以做為destination等限制.

    關於陣列變數的使用上,組譯器同時也提供OFFSET, TYPE, SIZEOF, LENGTHOF等指令來提領陣列中的屬性值.比較特別的是PTR,相當於高階語言的強制型別轉換,用來告訴組譯器該如何取用(1, 2, or 4 byte)指定的記憶位址.

    本章另一個重點則是carry及overflow 兩個旗標在加法及減法的運算邏輯,用來做為unsigned及signed整數運算結果是否溢位的判斷.


    學習目標

    1.Constraints on the use of operands for MOV instruction.
    2.Three Types of Operands (Immediate, Register, Memory)
    3. Memory Addressing (Direct, Direct-offset, Indirect, Indexed)
    4. Assembly Directives for array variables:
    OFFSET, TYPE, SIZEOF, LENGTHOF, etc.
    5. How ADD & SUB modifies OF and CF?
    6. JMP and LOOP Instructions

    2007年3月15日 星期四

    Assembly Chapter 3 Overview

    Assembly Chapter 3 Overview

    本章主要是組合語言的基礎介紹, 包括常用的整數運算式, 字元字串的定義等基本的寫法. 組合語言也具有一般高階語言的特性保留字清單(reserved words), 只允許在正確的環境下使用, 程式設計師在自訂的識別碼(identifier)時, 並需注意不可是組合語言的保留字.
    組合語言指令(introduction)是在程式被載入記憶體後, 由處理器執行的語法, 主要包括四個部份: Label(選用), Instruction Mnemonic(必要), Operrands(通常需要), 註解(選用), 其中instruction mnemonic是一個簡短的組譯器關鍵字, 對應相對動作的指令; label則是一種作為程式或資料位置標記的識別碼; 每個指令可以有0~3個運算元, 每個運算元可以是 暫存器,記憶體運算元,常數運算式或I/O埠. 組合語言的程式區段可分三個邏輯區段, 分別為程式碼, 資料與堆疊. 程式碼區段有可執行的指令; 堆疊區段堆放著處理程序參數, 區段變數, 及回傳位址; 而資料區段則存有變數. 使用者在自訂變數時,可依不同的型態來做設定; 例如: BYTE (定義八位元變數), WORD(定義十六位元變數), DWORD(定義三十二位元變數)...

    一如大部份高階語言, 組語程式需經過組譯之後, 產生object code (OBJ), 再經由鏈結函式庫後得到執行檔(EXE), 才可以載入記憶體中執行. 一般我們所定義的變數(data labels)及組語指令(instructions)都是run time 時真正存在並會執行, 但是Directive 及Symbolic constants則是Assembly time由組譯器運用執行的指令及符號常數, 是比較重要且需釐清的觀念.
    學習目標:
    1. Basic element of Assembly language
    • Integer expression
    • Reserved Words and Identifiers
    • Character and string constants
    • Mnemonics and Operands


    2. Defining data

    • Intrinsic Data Types
    • Data Definition Statement

    3. Symbolic constants

    • Equal-sign (integer expression)
    • EQU (expression or text)
    • TEXTEQU (text macro)

    2007年3月14日 星期三

    Assembly Chapter 2 Overview

    本章最主要是概括性的介紹微處理機架構, 記憶體管理, 微電腦元件以及輸出入系統. 一個CPU裡包括有控制單元(CU), 運算單元(ALU), clock及暫存器等. 藉由clock來同步微算機裡的各個component. 一機器指令的執行主要可分為: 擷取, 解碼, 參數抓取, 執行,及儲存五個步驟. 為了加快CPU執行的速度, 而有pipeline及superscalar的設計. 本書以IA-32處理器為主, 做為複雜指令集的代表, 有三種基本的運作模式: 保護模式, 實體模式及系統管理模式, 另有一個虛擬8086模式是在保護模式中的特例.

    對於任一處理器的介紹, 通常包含暫存器(16-bit or 32-bit data bus), 可存取的記憶體範圍(i.e. 20-bit or 32-bit address bus), 指令集(CISC or RISC)等基本項目. 這一系列Intel中央處理器, 每個暫存器都有一個名字, 也有其相對的功能, 浮點運算(80-bit floating point data registers), 多媒體運算(64-bit MMX registers)以及單一指令多個資料運算(128-bit XMM registers)也有其特別暫存器.

    Intel系列的處理器還有一個特點, 在早期實體模式中記憶體的管理, 有所謂的區塊位址(segment address)及offset address, 組合成線性位址(linear address). 後來為了要支援多工(multitasking), 才有保護模式的設計.

    學習目標:
    1. General Concepts: understand the following terms:
    --Instruction Execution Cycle
    --Multistage pipeline, Superscaler
    --Multitasking
    2.
    IA-32 Architecture:
    --Modes of operation
    --Registers
    --RISC 和 CISC 的差別
    3. Differentiate the concepts among
    --cache
    --memory
    --virtual memory

    Assembly Chapter 1 overview

    本章主要目的是為了讓初學者對組合語言有初步的認識,介紹了一些計算機架構、機器語言以及低階程式設計的差異以及基本概念,例如高階語言跟組合語言之間的關連性,對於在組合語言下的各種資料標示法也做了詳盡的描述。

    學習目標:
    • 什麼是Assembly language?
    • Data Representation

    整數的2進位, 10進位, 16進位等資料表示法的相互轉換

    signed 整數: 2's complement 轉換以及表示法

    字元儲存: ASCII code.