资源预览内容
第1页 / 共60页
第2页 / 共60页
第3页 / 共60页
第4页 / 共60页
第5页 / 共60页
第6页 / 共60页
第7页 / 共60页
第8页 / 共60页
第9页 / 共60页
第10页 / 共60页
亲,该文档总共60页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
,第 5 章:程序,2,本章概述,連結外部函式庫 運用程序的程式設計 堆疊運算 定義和使用程序 運用程序的程式設計,3,本書所用的連結函式庫,連結函市庫概觀 呼叫一個函市庫程序 到一個函市庫連結 函市庫程序概觀 六個例子,4,連結函市庫概觀,一個包含已經進入機器之內被編譯的程序的檔案 從一個或更多的 OBJ 檔案構造 建立一間函式庫 . . . 從一或更多的ASM來源檔案開始 組合每個進入一個 OBJ 檔案 創造一個空的函市庫檔案(延長 LIB) 把 OBJ 檔案 (s)加入函市庫檔案,使用微軟 LIB 實效,藉由在這一個螢幕的底部按下例子快看 Irvine32. asm.,6,到一個函市庫連接,對使用一個被命名的檔案裡連接器指令 Irvine32. lib 你的程式連結make32.bat. 注意二個 LIB 檔案:Irvine32. lib, 和kerne 32.lib 後者是微軟贏 32 軟體發展配套的部份(SDK),7,下一章,連結外部函式庫 本書所用的連結函式庫 堆疊運算 定義而且使用程序 運用程序的程式設計,8,函式庫程序概觀(1 of 4),CloseFile 將先前開啟的磁碟檔案予以關閉 Clrscr 清除主控台視窗,並將游標重新定位於左上角 CreateOutputFile 建立一個能在輸出模式下寫入資料的新磁碟檔案 Crlf 寫入一個行末 (end-of-line) 標記到主控台視窗 Delay -將程式的執行暫停個毫秒的時間間隔 DumpMem -以十六進位的表示方式,將一個區塊的記憶體內容寫入到主控台視窗 DumpRegs 以十六進位的方式顯示EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP、 EFLAGS 及EIP 等暫存器的內容值。同時也顯示最常用到的CPU 狀態旗標 GetCommandtail -複製程式命令列的參數 ( 也稱為command tail) 到一個由位元組所組成的陣列裡 GetMaxXY -取得主控台視窗的緩衝區的行數與列數 GetMseconds -回傳一個從午夜十二點之後所經過的時間值,以毫秒為單位,9,函式庫程序概觀(2 of 4),GetTextColor -回傳現行的主控台視窗的文字顏色和底色 Gotoxy -在主控台視窗中,將游標定位到指定的行與列的位置上 IsDigit -如果AL 暫存器所含有的ASCII 碼是十進位數字(0-9),則設定零值旗標 MsgBox, MsgBoxAsk 顯示一個彈出式訊息視窗,在彈出式視窗中顯示是/ 否的問題 OpenInputFile 開啟一個現存的磁碟檔案用於輸入 ParseDecimal32 將一個無號的十進位整數字串轉換成32 位元二進位整數 ParseInteger32 -將一個有號的十進位整數字串轉換成32 位元二進位整數 Random32 -產生一個32 位元的擬隨機整數,其數值範圍在到FFFFFFFF 之間 Randomize -以一個唯一值,作為隨機數產生器的種數 RandomRange -產生一個位於某個指定範圍內的擬隨機整數 ReadChar -等待一個由鍵盤所輸入的單一字元,並且回傳該字元,10,函式庫程序概觀(3 of 4),ReadFromFile 由輸入的磁碟檔案讀取資料到緩衝區中 ReadDec -由鍵盤讀取一個無號的32 位元十進位整數,並且在接收到Enter 鍵時結束讀取動作 ReadHex -由鍵盤讀取一個32 位元的十六進位整數,並在接收到Enter 鍵時結束讀取動作 ReadInt -由鍵盤讀取一個32 位元的有號十進位整數,並且在接收到Enter 鍵時結束讀取動作 ReadKey 在不等待輸入動作的情形下,由鍵盤的輸入緩衝區讀取一個字元 ReadString -由鍵盤讀取一個字串,並且在接收到Enter 鍵時結束讀取的動作 SetTextColor -設定隨後要輸出到主控台的文字的顏色和底色 StrLength 回傳字串的長度 WaitMsg -顯示一個訊息,並且等待一個鍵被按下 WriteBin -以ASCII 二進位格式,寫入一個無號的32 位元整數到主控台視窗 WriteBinB 以位元組、字組或雙字組的格式,將一個二進位整數寫到主控台視窗 WriteChar -將單一個字元寫入到主控台視窗,11,函式庫程序概觀(4 of 4),WriteDec -以十進位格式寫入一個無號的32 位元整數到主控台視窗 WriteHex -以十六進位格式寫入一個無號的32 位元整數到主控台視窗 WriteHexB 以十六進位格式,將一個位元組、字組或雙字組整數寫到主控台視窗 WriteInt -以十進位格式寫入一個有號的32 位元整數到主控台視窗 WriteString -將一個以空字元作為結尾的字串寫到主控台視窗 WriteToFile -將一個緩衝區寫到輸出檔案 WriteWindowsMsg -將含有由MS-Windows 所產生最近一個訊息的字串顯示出來,12,例子1,.code call Clrscr mov eax,500 call Delay call DumpRegs,清除螢幕,為 500 毫秒延遲計畫,而且傾卸暫存器和旗標.,13,例子 2,.data str1 BYTE Assembly language is easy!,0 .code mov edx,OFFSET str1 call WriteString call Crlf,顯示零結束了列而且移動游標到下一個螢幕線的開始.,14,例子 2a,.data str1 BYTE Assembly language is easy!,0Dh,0Ah,0 .code mov edx,OFFSET str1 call WriteString,顯示零結束了字串而且移動游標到下一個螢幕線的開始(使用植入的 CRLF),15,例子 3,IntVal = 35 .code mov eax,IntVal call WriteBin; display binary call Crlf call WriteDec; display decimal call Crlf call WriteHex; display hexadecimal call Crlf,顯示在二進位,十進位和十六進位的一個未被簽署的整數,每個在一條單獨的列上,16,Example 4,.data fileName BYTE 80 DUP(0) .code mov edx,OFFSET fileName mov ecx,SIZEOF fileName 1 call ReadString,輸入來自使用者的字串。 EDX 指向線和 ECX 記載使用者被允許進入的最大字元的數字。,一個無效力的位元組自動地到字串被附加.,17,例子 5,.code mov ecx,10; loop counter L1:mov eax,100; ceiling value call RandomRange; generate random int call WriteInt; display signed int call Crlf; goto next display line loop L1; repeat loop,產生並且顯示十個假散亂在範圍 0-99 中標示整數.在一條單獨的列上通過每個整數給在 EAX 中的 WriteInt 而且顯示它。,18,例子 6,.data str1 BYTE Color output is easy!,0 .code mov eax,yellow + (blue * 16) call SetTextColor mov edx,OFFSET str1 call WriteString call Crlf,顯示零和在藍色的背景上的黃色的個性結束了字串.,背景顏色在 16 點之前在被加到前景顏色之前被繁殖。,19,下一章,連結外部函式庫 本書所用的連結函式庫 堆疊運算 定義和使用程序 運用程序的程式設計,20,堆疊運算,執行時期堆疊 PUSH 運算 POP 運算 PUSH 和 POP指令 使用 PUSH 和 POP 例子:字串倒轉 相關的指令,21,執行時期堆疊,想像板塊的堆疊. . . 板塊只被加到頂端 板塊只從頂端被移動 LIFO結構,22,執行時期堆疊,藉著中央處理器處理,使用二個暫存器 SS (堆疊片段) ESP (堆疊指針) *,* SP in Real-address mode,23,PUSH 運算(1 of 2),一個 32位元推動行動漸減堆疊指針在 4 之前而且拷貝價值進入被堆疊指針指向的地點。,24,PUSH 運算 (2 of 2),相同的堆疊在推動另外二個整數之後:,在 ESP 下面的區域總是可得的。(除非堆疊已經氾濫),25,POP 運算,副本進入一個暫存器或變數之內在堆疊ESP評價. 把 n 加入 ESP, n 是或 2 或 4. n 的價值靠接受資料的運算元的屬性,26,PUSH 和 POP 指令,PUSH 語法: PUSH r/m16 PUSH r/m32 PUSH imm32 POP 語法: POP r/m16 POP r/m32,27,使用 PUSH 和 POP,push esi; push registers push ecx push ebx mov esi,OFFSET dwordVal ; display some memory mov ecx,LENGTHOF dwordVal mov ebx,TYPE dwordVal call DumpMem pop ebx; restore registers pop ecx pop esi,當他們包含重要的價值時候,解救而且回復暫存器PUSH和POP協議指導在相反的次序中發生 .,28,例子:築巢環路,mov ecx,100; set outer loop count L1:; begin the outer loop push ecx; save outer loop count mov ecx,20; set inner loop count L2:; begin the inner loop ; ; loop L2; repeat the inner loop pop ecx; restore outer loop count loop L1; repeat the outer loop,當創造一個被巢狀環路的時候,在進入內部的環路之前推動外部的環路櫃台:,29,例子:字串倒轉,和編入索引一起使用一個環演說 push在堆疊上的每個字符 從最初的地方開始字串,彈出在反面的次序中的堆疊,進入字串之內把每個字符插入回來 原始碼 Q: 壓入之前,為什麼每個字符必須被提出 EAX?,因為只有字 (16 位元)或 doubleword(32 位元)價值能是急忙前進壓入。,30,你輪到的. . .,以相反規劃的字串作為出發點, #1:修正計畫,如此使用者能輸入在 1 和 50個字符之間包含的字串. #2:修正計畫,如此它輸入來自使用者的一連串的 32 位元整數,然後在反面的次序中顯示整數.,31,相關的指令,PUSHFD 和 POPFD push 和 pop the EFLAGS 暫存器 PUSHAD 推動在堆疊上的 32 位元泛用型的暫存器 命令: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI POPAD 在反面的次序中從堆疊彈出相同的暫存器 PUSHA 和 POPA 為 16 位元暫存器做一樣的,32,你輪到的. . .,寫一個跟隨的計畫: 分配整數價值到 EAX , EBX , ECX , EDX , ESI 和 EDI 使用 PUSHAD 推動在堆疊上的泛用型的暫存器 使用一個環路,你的計畫應該彈出來自堆疊的每個整數而且在螢幕上顯示它,33,下一章,連結外部函式庫 本書所用的連結函式庫 堆疊運算 定義和使用程序 運用程序的程
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号