Windows 匯編程序基礎課件_第1頁
Windows 匯編程序基礎課件_第2頁
Windows 匯編程序基礎課件_第3頁
Windows 匯編程序基礎課件_第4頁
Windows 匯編程序基礎課件_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Windows匯編程序基礎3.1機器語言、匯編語言和高級語言

程序設計程序語言分為三大類:機器語言、匯編語言和高級語言。

高級語言目前使用較多的是高級語言編程用高級語言編寫的程序便于閱讀和修改計算機不能直接執(zhí)行需要由編譯程序或解釋程序將它翻譯成計算機能夠接受的機器語言程序

C,C++,java等都是高級語言。機器語言計算機能夠直接識別的語言機器指令用二進制代碼組成每條機器指令都由CPU執(zhí)行,控制計算機完成一個基本操作機器語言編寫的程序是計算機惟一能夠直接識別并執(zhí)行的程序,而用其他語言編寫的程序必須經(jīng)過翻譯變換成機器語言程序。

匯編語言介于機器語言和高級語言之間充分利用計算機的硬件特性和操作系統(tǒng)底層功能直接利用CPU的指令系統(tǒng)3.2匯編語言程序的上機過程開發(fā)過程的最終目的是產生一個可執(zhí)行文件先要編寫相應的程序源文件(源程序)再進行編譯鏈接3.2.1匯編程序的開發(fā)過程匯編程序的開發(fā)過程分為編輯、編譯、鏈接、運行等幾個步驟3.2.1匯編程序的開發(fā)過程(續(xù))1.匯編程序的后綴為.asm,可以用任何文本編輯程序來編寫,但是必須使用“純文本”格式保存。2.在編輯生成源文件后,下一步操作就是運行匯編程序對源文件進行匯編,如果沒有錯誤就生成obj目標代碼文件。3.目標代碼文件不能直接運行,將.obj文件和用到的庫文件鏈接起來,生成最終的.exe文件。4.在得到可執(zhí)行文件后,再運行可執(zhí)行文件,檢查程序是否可以正確運行。如何找到邏輯錯誤?一般來說,有3種常用的方法來查找錯誤:靜態(tài)分析、中間結果打印、動態(tài)調試。

3.2.2MASM匯編器MASM匯編器的命令行用法為:

ml[/選項]匯編程序源文件[/link鏈接選項]選項功能/c僅進行編譯,不自動進行鏈接

/coff產生的obj文件格式為COFF格式

/Cp源程序中區(qū)分大小寫

/Fofilename指定輸出的obj文件名

/Fl[filename]產生.lst列表文件

/Ipathname指定include文件的路徑

/link指定鏈接時使用的選項

3.2.3LINK鏈接器LINK編譯器的命令行用法為:link[選項][文件列表]選項功

/out:輸出文件名輸出的文件名,擴展名默認為.exe/map:文件名生成MAP文件

/libpath:目錄名指定庫文件的目錄路徑

/implib:文件名指定導入庫文件

/entry:標號指定入口

/comment:字符串在PE文件的文件頭后面加上文本注釋(版權信息)

/stack:數(shù)字設定堆棧的大小

/subsystem:系統(tǒng)名指定程序運行的環(huán)境,可以是以下幾種之一:Native,Windows,Console,Windowsce,Posix以一個源程序文件hello.asm為例,對它進行匯編鏈接,最后運行。用MASM匯編一個程序的方法為ml/c/coffhello.asm用LINK鏈接生成可執(zhí)行文件的方法為:link/subsystem:consolehello.obj可以簡化為:ml/coffhello.asm/link/subsystem:console

3.2.4匯編鏈接步驟

3.3匯編源程序的格式

3.3.1一個顯示字符串的匯編程序舉例hello.asm等同于下面的C程序#include<stdio.h>intmain(){

printf("HelloWorld!\n");return0;}3.3.2程序格式

1.模式定義程序的第一部分是有關模式定義的3條語句:.386.modelflat,stdcalloptioncasemap:none這些語句定義了程序使用的指令集、工作模式。下面講一下指令集和工作模式(1)指令集.386語句是匯編語言的偽指令,說明使用的指令集是哪一種CPU的。如果用匯編語言編寫的是驅動程序或者驅動程序的一個小模塊,而且驅動程序在特權級0上運行,就需要使用.386p,后面帶p的偽指令表示程序中可以使用特權指令。在編程中如果使用了MMX指令,除了定義.586之外,還要加上一句.mmx偽指令:.586.mmx

(2)工作模式.model語句用來定義程序工作的模式,它的格式是:.model內存模式[,調用規(guī)則][,其他模式]內存模式的定義影響最后生成的可執(zhí)行文件在DOS的可執(zhí)行程序中,可用到.com文件和.exe文件。在Windows環(huán)境下,可執(zhí)行程序只有一種內存模式,即Flat(平坦)模式。(2)工作模式(續(xù))在DOS下的匯編語言程序中,常常有這樣的程序片段:MOVAX,DATAMOVDS,AX其作用是給數(shù)據(jù)段寄存器DS賦值。在編程時,必須考慮這些DS,ES,SS等段寄存器是否正確設置。在Windows匯編語言程序中,則不必考慮這些問題。在程序中,不需要也不應該給CS,DS,ES,SS等段寄存器賦值。(3)option語句option語句有許多選項,這里介紹一種:optioncasemap:none這條語句說明程序中的變量和子程序名是否對大小寫敏感。由于WindowsAPI函數(shù)中的函數(shù)名稱是區(qū)分大小寫的,所以應該指定這個選項“casemap:none”3.3.2程序格式2.includelib語句匯編程序中也需要調用一些外部模塊(子程序/函數(shù))來完成部分功能。例如:使用下面語句通知鏈接程序使用msvcrt.libincludelibmsvcrt.lib若要使用使用其他庫文件,只需重復編寫Includelib庫文件名3.3.2程序格式3.函數(shù)聲明語句對于所有要用到的庫函數(shù)或WindowsAPI函數(shù),在程序的開始部分必須預先聲明,包括函數(shù)的名稱、參數(shù)的類型等。格式:函數(shù)名稱

PROTO[調用規(guī)則]:[第一個參數(shù)類型][,:后續(xù)參數(shù)類型]3.3.2程序格式4.include語句include語句的語法是:include文件名例如:includekernel32.incincludeuser32.inc以后程序中用到user32.dll和kernel32.dll中的函數(shù)時,不需要事先聲明就可以直接使用。3.3.2程序格式5.數(shù)據(jù)和代碼部分程序中的數(shù)據(jù)部分和代碼部分是分開定義的,分別以.data和.code開始,以end結束。

end語句一般是整個程序的最后一條語句,end語句后面跟的是起始標號,指出了程序執(zhí)行的第一條指令的位置。3.3.2程序格式6.跨行的語句

當源程序的某一語句過長,不利于書寫和閱讀時,可以用反斜杠(\)作為換行符,將這條語句分為幾行來寫。3.3.3一個Windows界面的匯編程序

下面給出一個使用Windows圖形界面的匯編源程序。hellow2.asm(顯示一個Windows消息框)在編譯鏈接時,必須在subsystem選項中指定“windows”,而不是“console”。命令為:ml/coffhellow.asm/link/subsystem:windows運行結果:

3.4操作數(shù)的尋址方式

尋址方式就是如何表示操作數(shù)的各種方法。以MOV指令為例:格式:MOVDST,SRCDST為目標操作數(shù),SRC為源操作數(shù),即SRC→DSTDST和SRC的數(shù)據(jù)類型應該一致

舉例例如,以下的一些數(shù)據(jù)傳送操作都是用MOV指令完成的MOVAL,127;將AL的內容設置為127,即7FHMOVDX,100;將DX的內容設置為100,即0064HMOVEAX,0;將EAX的內容設置為0MOVEBX,EAX;將EAX的內容復制到EBXMOVX,-1;將X設置為-1,變量X可定義為字 節(jié)、字、雙字類型

3.4.1立即尋址操作數(shù)直接包含在指令中,緊跟在操作碼之后的尋址方式稱為立即尋址方式,該操作數(shù)也被稱為立即數(shù)。舉例:MOVAL,00,190,-1和MOVAX,1900FFFFFFFFH為MOVEAX,-1立即數(shù)。MOVEAX,0FFFFFFFFH操作數(shù)包含在CPU內部的寄存器中舉例:MOVBL,80源操作數(shù)使用的是立即尋址;目標操作數(shù)使用寄存器尋址舉例:MOVEAX,EBXEBX和EAX都是寄存器尋址

3.4.2寄存器尋址

3.4.3直接尋址指令中直接給出了操作數(shù)的地址例如:dVar是定義好的一個雙字型變MOVEAX,dVarMOVdVar,EBX

執(zhí)行指令“MOVEAX,dVar”時,CPU從指令中得知dVar的地址,再從地址取出一個雙字,送給EAX。3.4.4寄存器間接尋址

操作數(shù)的地址放在寄存器中,CPU從寄存器中取得操作數(shù)的地址,例如:MOVESI,00404011HMOVEAX,[ESI]ESI外面加一對方括號,表示把ESI作為地址,從內存中取出一個雙字。

3.4.5寄存器相對尋址操作數(shù)的地址是寄存器和一個立即數(shù)相加后得到的結果

舉例:MOVESI,0040200AHMOVEDI,[ESI+4]ESI加上4后得到的結果,作為一個操作數(shù)的地址。再從這個地址中取出一個雙字送給EDI。

3.4.6基址變址尋址操作數(shù)的地址是兩個寄存器相加后得到的結果,兩個寄存器分別稱為基址寄存器和變址寄存器。舉例:MOVESI,0040200AHMOVEBX,4MOVEDI,[EBX+ESI]

3.4.6基址變址尋址(續(xù))基址寄存器有兩個:BX和BP變址寄存器也有兩個:SI和DI基址變址寄存器只能是4種組合之一:[BX+SI],[BX+DI],[BP+SI]和[BP+DI]。3.4.7基址變址相對尋址

操作數(shù)的地址是兩個寄存器以及一個立即數(shù)相加后得到的結果,即基址寄存器、變址寄存器和相對量。舉例:MOVESI,0040200AHMOVEBX,4MOVEDI,[EBX+ESI+4]

3.4.8基址變址比例相對尋址

操作數(shù)的地址是由基址寄存器、變址寄存器乘以一個比例數(shù)和相對量這3個部分相加得到的結果。比例數(shù)只能有1,2,4,8,這4種取值。

舉例:MOVESI,0040200AHMOVEBX,4MOVEDI,[ESI+EBX*2+4]3.4.9尋址方式總結

有效地址的計算方式

EA的計算中包括基址、變址、比例、相對這4個部分。每個部分都可以從上面的可選項中任選其一。它可以轉換為以下幾種尋址方式:比例數(shù)取1時,就變成基址變址相對尋址方式。比例數(shù)取1且相對量不出現(xiàn)時,就變成基址變址尋址方式。變址寄存器不出現(xiàn)時,就變成寄存器相對尋址方式。變址寄存器和相對量不出現(xiàn)時,就變成寄存器間接方式。基址寄存器和變址寄存器不出現(xiàn)時,就變成直接方式。3.4.10段超越內存操作數(shù)的地址由兩個部分指定:段和有效地址。尋址方式中只確定有效地址段寄存器確定段地址沒有指定段寄存器且尋址方式使用了ESP和EBP寄存器,就使用SS段寄存器。其他情況,使用DS段寄存器。

例如,下面指令中的內存操作數(shù)在SS段中:MOVEAX,[EBP+8]MOVEBX,[ESP-4]下面指令中的內存操作數(shù)在DS段中:MOVEAX,[EBX+8]MOVEBX,[ESI-4]MOVEAX,[0040200AH]

3.5數(shù)據(jù)定義3.5.1常數(shù)的表示3.5.2簡單數(shù)據(jù)類型3.5.3DUP偽操作3.5.4數(shù)據(jù)定義的例子程序

3.5.1常數(shù)的表示二進制數(shù)字后面跟b或B,如00011011b八進制數(shù)字后面跟o或O;如33o十進制數(shù)字后面跟d或D,如27d十六進制數(shù)字后面跟h或H,如1BH數(shù)字后面不跟字母時,被當做十進制數(shù)可用.radix指定默認數(shù)值(一般不用)

3.5.2簡單數(shù)據(jù)類型3.5.2簡單數(shù)據(jù)類型(續(xù))定義數(shù)據(jù)的語句為:[變量名]助記符

表達式[,表達式…]舉例:bVarDB120wVarWORD 200,3003.5.3DUP偽操作

為連續(xù)的存儲單元提供重復數(shù)據(jù)格式:NDUP(表達式)N為重復因子,只能取正整數(shù)DUP還可以嵌套常用來定義數(shù)組,例如:bArrayWORD50DUP(0)表示字型數(shù)組bArray,有50個元素,每個元素初值為0

3.5.4數(shù)據(jù)定義的例子程序說明數(shù)據(jù)變量的定義和使用方法的例子defvar.asm命令:ml/coffdefvar.asm/linksubsystem:console結果:在VC調試程序中查看數(shù)據(jù)區(qū)的內容如圖:3.6操作符3.6.1常用偽操作1.PTR偽操作2.EQU偽操作3.

(等號)偽操作4.$偽操作5.ORG偽操作6.offset操作符7.type操作符8.length操作符9.size操作符

1.PTR偽操作用法:類型PTR地址表達式

類型的取值:BYTE,WORD,DWORD等作用(1)在指令中臨時改變變量的類型(2)確定指令中操作數(shù)的類型

2.EQU偽操作用法為:符號名

EQU表達式舉例:NULL EQU0MB_OK EQU0在程序中就可以使用這些符號來替代這些常量,EQU的作用和C語言中的“#define”相似。

3.

(等號)偽操作用法:符號名

表達式

作用:為常量、表達式及其他各種符號定義一個等價的符號名

舉例:I=100可多次重復定義,以最后一次定義的值為準而EQU定義的符號名則只能定義一次4.$偽操作

$在程序中表示當前地址計數(shù)器的值

舉例:wVarWORD0102h,1000,100*100BYTESOFWVAREQU$-wVar$代表該行所在的地址計數(shù)器,減去wVar的地址,就得到了wVar所占用的字節(jié)數(shù)。5.ORG偽操作

用法為:ORG數(shù)值表達式作用:將程序下一行的地址計數(shù)器的值設置成數(shù)值表達式的值舉例:aVarBYTE01hORG$+10bVarBYTE02h在aVar和bVar兩個變量中插入10字節(jié)的空間

6.offset操作符用法為:offset[變量|標號]作用:取出變量或標號的地址

舉例:下面2條語句等價dVar3DWORDwVar2dVar3DWORDoffsetwVar27.typ

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論