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
  • 沒有留言: