Assembly 輸入輸出和調(diào)試

2018-10-26 10:39 更新

輸入和輸出

輸入和輸出是真正系統(tǒng)依賴的活力。它牽涉到系統(tǒng)硬件的接口問題。高級語言,像C,提供了標準的,簡單的,統(tǒng)一的程序I/O接口的程序庫。匯編語言不提供標準庫。它們必須要么直接訪問硬件(在保護模式下為特權(quán)級操作)或使用任何操作系統(tǒng)提供的底層的程序。

匯編程序與C交互使用是非常普遍的。這樣做的一個優(yōu)點是匯編代碼可以使用標準C I/O程序庫。但是,你必須清楚C使用的程序之間傳遞信息的規(guī)則。這些規(guī)則放在這會非常麻煩。(它們將在以后提到!)為了簡單化I/O,作者已經(jīng)開發(fā)出了隱藏在復雜C規(guī)則里的自己的程序,而且提供了一個更簡單的接口。

匯編的I/O程序

表1.4描述了提供的程序。所有這些程序保留了所有寄存器的值,除了讀的程序外。這些程序確實修改了EAX 的值。為了使用這些程序,你必須包含一個匯編程序需要用到的信息的文件。為了在NASM
中包含一個文件,你可以使用%include預處理指示符。下面幾行包含了有作者的I/O程序的文件:

%include "asm_io.inc"

為了使用一個打印程序,你必須加載正確的值到EAX 中,然后用CALL指令調(diào)用它。CALL指令等價于在高級語言里的函數(shù)call。它跳轉(zhuǎn)到代碼的另一段去執(zhí)行,然后等程序執(zhí)行完成后又回到原始的方。下面的程序例子展示了調(diào)用這些I/O程序的幾個樣例。

Assembly

調(diào)試

作者的庫同樣包含一些有用的調(diào)試程序。這些調(diào)試程序顯示關(guān)于系統(tǒng)狀態(tài)的信息但不改變它們。這些程序是一些保存CPU的當前狀態(tài)后執(zhí)行一個子程序調(diào)用的宏。這些宏定義在上面提到的asm io.inc文件中。宏可以像普通的指令一樣使用。宏的操作數(shù)由逗號隔開。

這兒有四個調(diào)試程序稱為dump regs,dump mem,dump stack和dump math;
它們分別顯示寄存器,內(nèi)存,堆棧和數(shù)字協(xié)處理器的值。

dump regs 這個宏顯示系統(tǒng)的寄存器里的值(十六進制)到stdout(也就是: 顯示器)。它同時顯示在FLAGS9寄存器里的位。例如,如果零標志位是1,ZF是顯示的。如果是0,它就不被顯示。它攜帶一個整形參數(shù),這個參數(shù)同樣被顯示出來。這就可以用來區(qū)別不同dump regs命令的輸出。

dump mem 這個宏同樣以ASCII字符的形式顯示內(nèi)存區(qū)域的值(十六進制)。它帶有三個用逗號分開的參數(shù)。第一個參數(shù)是一個用來標示輸出的整形變量(就像dump regs參數(shù)一樣)。第二個參數(shù)需要顯示的內(nèi)存的地址。(它可以是個標號。)最后一個參數(shù)是在此地址后需要顯示的16字節(jié)的節(jié)數(shù)。內(nèi)存顯示將從要求的地址之前的第一節(jié)的邊界開始。

dump stack 這個宏顯示CPU堆棧的值。(這個堆棧將在第4章中提到。)這個堆棧由雙字組成,所以這個程序也以這種格式顯示它們。它帶有三個用逗號隔開的參數(shù)。第一個參數(shù)是一個整形變量(像dump regs一樣)第二個參數(shù)是在EBP寄存器里的地址下面需要顯示的雙字的數(shù)目而第三個參數(shù)是在EBP寄存器里的地址上面需要顯示的的數(shù)目。

dump math 這個宏顯示數(shù)字協(xié)處理器寄存器里的值。它只帶有一個整形參數(shù),這個參數(shù)用來標示輸出就像參數(shù)dump regs做的一樣。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號