chapt_05

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Irvine32.lib links to
can link to
kernel32.lib executes kernel32.dll
6
下一章
• • • • • 連結外部函式庫 本書所用的連結函式庫 堆疊運算 定義而且使用程序 運用程序的程式設計
7
函式庫程序-概觀(1 of 4)
CloseFile -將先前開啟的磁碟檔案予以關閉 Clrscr -清除主控台視窗,並將游標重新定位於左上角 CreateOutputFile -建立一個能在輸出模式下寫入資料的新磁碟檔案 Crlf -寫入一個行末 (end-of-line) 標記到主控台視窗 Delay -將程式的執行暫停n個毫秒的時間間隔

Random32 -產生一個32 位元的擬隨機整數,其數值範圍在0到
FFFFFFFF 之間
Randomize -以一個唯一值,作為隨機數產生器的種數 RandomRange -產生一個位於某個指定範圍內的擬隨機整數 ReadChar -等待一個由鍵盤所輸入的單一字元,並且回傳該字元
9
函式庫程序-概觀(3 of 4)
GetMaxXY -取得主控台視窗的緩衝區的行數與列數
GetMseconds -回傳一個從午夜十二點之後所經過的時間值,以毫秒為
單位
8
函式庫程序-概觀(2 of 4)
GetTextColor -回傳現行的主控台視窗的文字顏色和底色 Gotoxy -在主控台視窗中,將游標定位到指定的行與列的位置上 IsDigit -如果AL 暫存器所含有的ASCII 碼是十進位數字(0-9),則設定零
. push esi
push ecx push ebx
; push registers
mov mov mov call pop pop pop
esi,OFFSET dwordVal ecx,LENGTHOF dwordVal ebx,TYPE dwordVal DumpMem ebx ecx esi
第 5 章:程序
本章概述
• • • • • 連結外部函式庫 運用程序的程式設計 堆疊運算 定義和使用程序 運用程序的程式設計
2
本書所用的連結函式庫
• • • • • 連結函市庫概觀 呼叫一個函市庫程序 到一個函市庫連結 函市庫程序-概觀 六個例子
3
連結函市庫概觀
• 一個包含已經進入機器之內被編譯的程序的檔案
DumpMem -以十六進位的表示方式,將一個區塊的記憶體內容寫入到
主控台視窗
DumpRegs –以十六進位的方式顯示EAX、EBX、ECX、EDX、ESI、
EDI、EBP、ESP、 EFLAGS 及EIP 等暫存器的內容值。同時也顯示最常用到的CPU 狀態 旗標 GetCommandtail -複製程式命令列的參數 ( 也稱為command tail) 到一 個由位元組所組成的陣列裡
22
PUSH 運算(1 of 2)
• 一個 32位元推動行動漸減堆疊指針在 4 之前而且拷貝 價值進入被堆疊指針指向的地點。
23
PUSH 運算 (2 of 2)
• 相同的堆疊在推動另外二個整數之後:
在 ESP 下面的區域總是可得的。(除非堆疊已經氾濫)
24
POP 運算
• 副本進入一個暫存器或變數之內在堆疊〔ESP〕評價. • 把 n 加入 ESP, n 是或 2 或 4.
mov ecx,20
L2: ; ; loop L2 pop ecx loop L1
; set inner loop count ; begin the inner loop
; repeat the inner loop ; restore outer loop count ; repeat the outer loop
主控台視窗
WriteInt -以十進位格式寫入一個有號的32 位元整數到主控台視窗 WriteString -將一個以空字元作為結尾的字串寫到主控台視窗 WriteToFile -將一個緩衝區寫到輸出檔案 WriteWindowsMsg -將含有由MS-Windows 所產生最近一個訊息的字串
顯示出來
11
例子1
清除螢幕,為 500 毫秒延遲計畫,而且傾卸暫存器和旗標.
.code call mov call call
Clrscr eax,500 Delay DumpRegs
樣本輸出:
EAX=00000613 EBX=00000000 ECX=000000FF EDX=00000000 ESI=00000000 EDI=00000100 EBP=0000091E ESP=000000F6 EIP=00401026 EFL=00000286 CF=0 SF=1 ZF=0 OF=0
20
執行時期堆疊
• 想像板塊的堆疊. . .
• 板塊只被加到頂端 • 板塊只從頂端被移動 • LIFO結構
10 9 8 7 6 5 4 3 2 1
top
bottom
21
執行時期堆疊
• 藉著中央處理器處理,使用二個暫存器
• SS (堆疊片段) • ESP (堆疊指針) *
* SP in Real-address mode
.data str1 BYTE "Assembly language is easy!",0Dh,0Ah,0
.code mov edx,OFFSET str1 call WriteString
14
例子 3
顯示在二進位,十進位和十六進位的一個未被簽署的整數,每個在 一條單獨的列上
IntVal = 35 .code mov eax,IntVal call WriteBin call Crlf call WriteDec call Crlf call WriteHex call Crlf
• 從一個或更多的 OBJ 檔案構造
• 建立一間函式庫 . . .
• • • • 從一或更多的ASM來源檔案開始 組合每個進入一個 OBJ 檔案 創造一個空的函市庫檔案(延長 LIB) 把 OBJ 檔案 (s)加入函市庫檔案,使用微軟 LIB 實效
藉由在這一個螢幕的底部按下例子快看 Irvine32. asm.
28
例子:字串倒轉
• 和編入索引一起使用一個環演說 • push在堆疊上的每個字符 • 從最初的地方開始字串,彈出在反面的次序中的堆疊,進入字串 之內把每個字符插入回來 • 原始碼 • Q: 壓入之前,為什麼每個字符必須被提出 EAX?
12
例子 2
顯示零-結束了列而且移動游標到下一個螢幕線的開始.
.data str1 BYTE "Assembly language is easy!",0 .code mov edx,OFFSET str1 call WriteString call Crlf
13
例子 2a
顯示零-結束了字串而且移動游標到下一個螢幕線的開始 (使用植入的 CR/LF)
17
例子 6
顯示零-和在藍色的背景上的黃色的個性結束了字串.
.data str1 BYTE "Color output is easy!",0 .code mov call mov call call
eax,yellow + (blue * 16) SetTextColor edx,OFFSET str1 WriteString Crlf
背景顏色在 16 點之前在被加到前景顏色之前被繁殖。
18
下一章
• • • • • 連結外部函式庫 本書所用的連結函式庫 堆疊運算 定義和使用程序 運用程序的程式設計
19
堆疊運算
• • • • • • • 執行時期堆疊 PUSH 運算 POP 運算 PUSH 和 POP指令 使用 PUSH 和 POP 例子:字串倒轉 相關的指令
5
到一個函市庫連接
• 對使用一個被命名的檔案裡連接器指令 Irvine32. lib 你的程式連 結make32.bat. • 注意二個 LIB 檔案:Irvine32. lib, 和kerne 32.lib
• 後者是微軟贏 32 軟體發展配套的部份(SDK)
Your program
links to
; display some memory
; restore registers
27
例子:築巢環路
當創造一個被巢狀環路的時候,在進入內部的環路之前推動外部 的環路櫃台:
mov ecx,100 L1: push ecx ; set outer loop count ; begin the outer loop ; save outer loop count
• n 的價值靠接受資料的運算元的屬性
25
PUSH 和 POP 指令
• PUSH 語法:
• PUSH r/m16 • PUSH r/m32 • PUSH imm32
• POP 語法:
• POP r/m16 • POP r/m32
26
使用 PUSH 和 POP
當他們包含重要的價值時候,解救而且回復暫存器〃PUSH和 POP協議指導在相反的次序中發生
值旗標
MsgBox, MsgBoxAsk –顯示一個彈出式訊息視窗,在彈出式視窗中顯示
是/ 否的問題
OpenInputFile –開啟一個現存的磁碟檔案用於輸入 ParseDecimal32 –將一個無號的十進位整數字串轉換成32 位元二進位
整數
ParseInteger32 -將一個有號的十進位整數字串轉換成32 位元二進位整
4
呼叫一個函市庫程序
• 呼叫使用指令的一個函市庫程序.一些程序需要輸入引數.那在 程序原型中包括指令的副本(公告).
• 下列的例子在控制檯上顯示 "1234" :
INCLUDE Irvine32.inc .code mov eax,1234h call WriteH源自文库x call Crlf
; input argument ; show hex number ; end of line
ReadKey –在不等待輸入動作的情形下,由鍵盤的輸入緩衝區讀取一個
字元
ReadString -由鍵盤讀取一個字串,並且在接收到Enter 鍵時結束讀取
的動作
SetTextColor -設定隨後要輸出到主控台的文字的顏色和底色
StrLength –回傳字串的長度 WaitMsg -顯示一個訊息,並且等待一個鍵被按下 WriteBin -以ASCII 二進位格式,寫入一個無號的32 位元整數到主控台
; display binary
; display decimal
; display hexadecimal
Sample output :
0000 0000 0000 0000 0000 0000 0010 0011 35 23
15
Example 4
輸入來自使用者的字串。 EDX 指向線和 ECX 記載使用者被允 許進入的最大字元的數字。
ReadFromFile –由輸入的磁碟檔案讀取資料到緩衝區中 ReadDec -由鍵盤讀取一個無號的32 位元十進位整數,並且在接收到
Enter 鍵時結束讀取動作 ReadHex -由鍵盤讀取一個32 位元的十六進位整數,並在接收到[Enter] 鍵時結束讀取動作 ReadInt -由鍵盤讀取一個32 位元的有號十進位整數,並且在接收到 [Enter ] 鍵時結束讀取動作
視窗
WriteBinB –以位元組、字組或雙字組的格式,將一個二進位整數寫到
主控台視窗
WriteChar -將單一個字元寫入到主控台視窗
10
函式庫程序-概觀(4 of 4)
WriteDec -以十進位格式寫入一個無號的32 位元整數到主控台視窗 WriteHex -以十六進位格式寫入一個無號的32 位元整數到主控台視窗 WriteHexB –以十六進位格式,將一個位元組、字組或雙字組整數寫到
.data fileName BYTE 80 DUP(0) .code mov edx,OFFSET fileName mov ecx,SIZEOF fileName – 1 call ReadString
一個無效力的位元組自動地到字串被附加.
16
例子 5
產生並且顯示十個假散亂在範圍 0-99 中標示整數.在一條單獨的 列上通過每個整數給在 EAX 中的 WriteInt 而且顯示它。
.code mov ecx,10
; loop counter
L1: mov call call call loop
eax,100 RandomRange WriteInt Crlf L1
; ; ; ; ;
ceiling value generate random int display signed int goto next display line repeat loop
相关文档
最新文档