5.4Irvine32庫
技術標籤:組合語言
一、建立這個庫的原因
目前為止還沒有微軟官方支援的組合語言程式設計庫。當程式設計師在1980年代開始在x86處理器上編寫組合語言時,MS-DOS是最常用的作業系統。當時的16位的程式能夠呼叫MS-DOS方程(被稱為INT 21h服務)來進行簡單的輸入和輸入。但是在當時,如果我們想要在控制檯輸出一個整數,那麼我們需要寫一個相當長的程式,這個程式需要將我們的整數轉化為ASCⅡ字元,我們把這個程式稱為WriteInt,程式的實現邏輯如下:
初始化:
let n equal the binary value
let buffer be an array of char[size]
演算法:
i = size -1 ; last position of buffer
repeat
r = n mod 10 ; remainder
n = n / 10 ; integer division
digit = r OR 30h ; conver r to ASCII digit
buffer[i--] = digit ; store in buffer
until n = 0
if n is negative
buffer[i] = "-" ; insert a negative sign
while i > 0
print buffer[i]
i++
一些專業的程式設計師都喜歡建立自己的庫。在windows下的32位模式中,輸入輸出庫必須直接呼叫作業系統。這對於初學者有些困難,因此,Irvine32庫被設計用來提供簡單的輸入輸出介面供初學者呼叫。
下表包含了Irvine32庫檔案的函式:
/待補充191
二、總覽
控制檯視窗(console window)是一個由MS-Windows創造的只顯示文字的命令列提示符(command prompt)。開啟控制檯視窗的最簡單的方式就是cmd。
一個檔案控制代碼(file handle)是一個Windows作業系統使用的用來指示開啟的檔案的一個32位整數。當我們的程式呼叫一個Windows服務來開啟或建立一個檔案時,作業系統就會建立一個新的檔案控制代碼併為提供給我們的程式這個控制代碼。每次我們呼叫作業系統服務來讀取或寫入這個檔案,我們都必須傳遞這個檔案控制代碼來作為一個引數。
Note: If your program calls procedures in the Irvine32 library, you must always push 32-bit values onto the runtime stack; if you do not, the Win32 Console functions called by the library will not work correctly.
三、對於特定函式的說明
DumpMem
DumpMem函式向控制檯視窗寫入一些十六進位制整數。我們需要利用ESI向這個函式傳入起始地址,利用ECX傳遞元素數量,利用EBX傳遞元素長度(1代表byte,2代表word,4代表雙字)。下面的示例呼叫展示了一個包含11個元素的雙字陣列:
.data
array DWORD 1,2,3,4,5,6,7,8,9,0Ah,0Bh
.code
main PROC
mov esi,OFFSET array ;開始時的偏移地址
mov ecx,LENGTHOF array ;元素數量
mov ebx,TYPE array ;單個元素的長度
call DumpMem
程式會輸出如下的內容: