版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Windows匯編程序基礎(chǔ)3.1機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言
程序設(shè)計(jì)程序語(yǔ)言分為三大類:機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言。
高級(jí)語(yǔ)言目前使用較多的是高級(jí)語(yǔ)言編程用高級(jí)語(yǔ)言編寫的程序便于閱讀和修改計(jì)算機(jī)不能直接執(zhí)行需要由編譯程序或解釋程序?qū)⑺g成計(jì)算機(jī)能夠接受的機(jī)器語(yǔ)言程序
C,C++,java等都是高級(jí)語(yǔ)言。機(jī)器語(yǔ)言計(jì)算機(jī)能夠直接識(shí)別的語(yǔ)言機(jī)器指令用二進(jìn)制代碼組成每條機(jī)器指令都由CPU執(zhí)行,控制計(jì)算機(jī)完成一個(gè)基本操作機(jī)器語(yǔ)言編寫的程序是計(jì)算機(jī)惟一能夠直接識(shí)別并執(zhí)行的程序,而用其他語(yǔ)言編寫的程序必須經(jīng)過(guò)翻譯變換成機(jī)器語(yǔ)言程序。
匯編語(yǔ)言介于機(jī)器語(yǔ)言和高級(jí)語(yǔ)言之間充分利用計(jì)算機(jī)的硬件特性和操作系統(tǒng)底層功能直接利用CPU的指令系統(tǒng)3.2匯編語(yǔ)言程序的上機(jī)過(guò)程開發(fā)過(guò)程的最終目的是產(chǎn)生一個(gè)可執(zhí)行文件先要編寫相應(yīng)的程序源文件(源程序)再進(jìn)行編譯鏈接3.2.1匯編程序的開發(fā)過(guò)程匯編程序的開發(fā)過(guò)程分為編輯、編譯、鏈接、運(yùn)行等幾個(gè)步驟3.2.1匯編程序的開發(fā)過(guò)程(續(xù))1.匯編程序的后綴為.asm,可以用任何文本編輯程序來(lái)編寫,但是必須使用“純文本”格式保存。2.在編輯生成源文件后,下一步操作就是運(yùn)行匯編程序?qū)υ次募M(jìn)行匯編,如果沒(méi)有錯(cuò)誤就生成obj目標(biāo)代碼文件。3.目標(biāo)代碼文件不能直接運(yùn)行,將.obj文件和用到的庫(kù)文件鏈接起來(lái),生成最終的.exe文件。4.在得到可執(zhí)行文件后,再運(yùn)行可執(zhí)行文件,檢查程序是否可以正確運(yùn)行。如何找到邏輯錯(cuò)誤?一般來(lái)說(shuō),有3種常用的方法來(lái)查找錯(cuò)誤:靜態(tài)分析、中間結(jié)果打印、動(dòng)態(tài)調(diào)試。
3.2.2MASM匯編器MASM匯編器的命令行用法為:
ml[/選項(xiàng)]匯編程序源文件[/link鏈接選項(xiàng)]選項(xiàng)功能/c僅進(jìn)行編譯,不自動(dòng)進(jìn)行鏈接
/coff產(chǎn)生的obj文件格式為COFF格式
/Cp源程序中區(qū)分大小寫
/Fofilename指定輸出的obj文件名
/Fl[filename]產(chǎn)生.lst列表文件
/Ipathname指定include文件的路徑
/link指定鏈接時(shí)使用的選項(xiàng)
3.2.3LINK鏈接器LINK編譯器的命令行用法為:link[選項(xiàng)][文件列表]選項(xiàng)功
能
/out:輸出文件名輸出的文件名,擴(kuò)展名默認(rèn)為.exe/map:文件名生成MAP文件
/libpath:目錄名指定庫(kù)文件的目錄路徑
/implib:文件名指定導(dǎo)入庫(kù)文件
/entry:標(biāo)號(hào)指定入口
/comment:字符串在PE文件的文件頭后面加上文本注釋(版權(quán)信息)
/stack:數(shù)字設(shè)定堆棧的大小
/subsystem:系統(tǒng)名指定程序運(yùn)行的環(huán)境,可以是以下幾種之一:Native,Windows,Console,Windowsce,Posix以一個(gè)源程序文件hello.asm為例,對(duì)它進(jìn)行匯編鏈接,最后運(yùn)行。用MASM匯編一個(gè)程序的方法為ml/c/coffhello.asm用LINK鏈接生成可執(zhí)行文件的方法為:link/subsystem:consolehello.obj可以簡(jiǎn)化為:ml/coffhello.asm/link/subsystem:console
3.2.4匯編鏈接步驟
3.3匯編源程序的格式
3.3.1一個(gè)顯示字符串的匯編程序舉例hello.asm等同于下面的C程序#include<stdio.h>intmain(){
printf("HelloWorld!\n");return0;}3.3.2程序格式
1.模式定義程序的第一部分是有關(guān)模式定義的3條語(yǔ)句:.386.modelflat,stdcalloptioncasemap:none這些語(yǔ)句定義了程序使用的指令集、工作模式。下面講一下指令集和工作模式(1)指令集.386語(yǔ)句是匯編語(yǔ)言的偽指令,說(shuō)明使用的指令集是哪一種CPU的。如果用匯編語(yǔ)言編寫的是驅(qū)動(dòng)程序或者驅(qū)動(dòng)程序的一個(gè)小模塊,而且驅(qū)動(dòng)程序在特權(quán)級(jí)0上運(yùn)行,就需要使用.386p,后面帶p的偽指令表示程序中可以使用特權(quán)指令。在編程中如果使用了MMX指令,除了定義.586之外,還要加上一句.mmx偽指令:.586.mmx
(2)工作模式.model語(yǔ)句用來(lái)定義程序工作的模式,它的格式是:.model內(nèi)存模式[,調(diào)用規(guī)則][,其他模式]內(nèi)存模式的定義影響最后生成的可執(zhí)行文件在DOS的可執(zhí)行程序中,可用到.com文件和.exe文件。在Windows環(huán)境下,可執(zhí)行程序只有一種內(nèi)存模式,即Flat(平坦)模式。(2)工作模式(續(xù))在DOS下的匯編語(yǔ)言程序中,常常有這樣的程序片段:MOVAX,DATAMOVDS,AX其作用是給數(shù)據(jù)段寄存器DS賦值。在編程時(shí),必須考慮這些DS,ES,SS等段寄存器是否正確設(shè)置。在Windows匯編語(yǔ)言程序中,則不必考慮這些問(wèn)題。在程序中,不需要也不應(yīng)該給CS,DS,ES,SS等段寄存器賦值。(3)option語(yǔ)句option語(yǔ)句有許多選項(xiàng),這里介紹一種:optioncasemap:none這條語(yǔ)句說(shuō)明程序中的變量和子程序名是否對(duì)大小寫敏感。由于WindowsAPI函數(shù)中的函數(shù)名稱是區(qū)分大小寫的,所以應(yīng)該指定這個(gè)選項(xiàng)“casemap:none”3.3.2程序格式2.includelib語(yǔ)句匯編程序中也需要調(diào)用一些外部模塊(子程序/函數(shù))來(lái)完成部分功能。例如:使用下面語(yǔ)句通知鏈接程序使用msvcrt.libincludelibmsvcrt.lib若要使用使用其他庫(kù)文件,只需重復(fù)編寫Includelib庫(kù)文件名3.3.2程序格式3.函數(shù)聲明語(yǔ)句對(duì)于所有要用到的庫(kù)函數(shù)或WindowsAPI函數(shù),在程序的開始部分必須預(yù)先聲明,包括函數(shù)的名稱、參數(shù)的類型等。格式:函數(shù)名稱
PROTO[調(diào)用規(guī)則]:[第一個(gè)參數(shù)類型][,:后續(xù)參數(shù)類型]3.3.2程序格式4.include語(yǔ)句include語(yǔ)句的語(yǔ)法是:include文件名例如:includekernel32.incincludeuser32.inc以后程序中用到user32.dll和kernel32.dll中的函數(shù)時(shí),不需要事先聲明就可以直接使用。3.3.2程序格式5.?dāng)?shù)據(jù)和代碼部分程序中的數(shù)據(jù)部分和代碼部分是分開定義的,分別以.data和.code開始,以end結(jié)束。
end語(yǔ)句一般是整個(gè)程序的最后一條語(yǔ)句,end語(yǔ)句后面跟的是起始標(biāo)號(hào),指出了程序執(zhí)行的第一條指令的位置。3.3.2程序格式6.跨行的語(yǔ)句
當(dāng)源程序的某一語(yǔ)句過(guò)長(zhǎng),不利于書寫和閱讀時(shí),可以用反斜杠(\)作為換行符,將這條語(yǔ)句分為幾行來(lái)寫。3.3.3一個(gè)Windows界面的匯編程序
下面給出一個(gè)使用Windows圖形界面的匯編源程序。hellow2.asm(顯示一個(gè)Windows消息框)在編譯鏈接時(shí),必須在subsystem選項(xiàng)中指定“windows”,而不是“console”。命令為:ml/coffhellow.asm/link/subsystem:windows運(yùn)行結(jié)果:
3.4操作數(shù)的尋址方式
尋址方式就是如何表示操作數(shù)的各種方法。以MOV指令為例:格式:MOVDST,SRCDST為目標(biāo)操作數(shù),SRC為源操作數(shù),即SRC→DSTDST和SRC的數(shù)據(jù)類型應(yīng)該一致
舉例例如,以下的一些數(shù)據(jù)傳送操作都是用MOV指令完成的MOVAL,127;將AL的內(nèi)容設(shè)置為127,即7FHMOVDX,100;將DX的內(nèi)容設(shè)置為100,即0064HMOVEAX,0;將EAX的內(nèi)容設(shè)置為0MOVEBX,EAX;將EAX的內(nèi)容復(fù)制到EBXMOVX,-1;將X設(shè)置為-1,變量X可定義為字 節(jié)、字、雙字類型
3.4.1立即尋址操作數(shù)直接包含在指令中,緊跟在操作碼之后的尋址方式稱為立即尋址方式,該操作數(shù)也被稱為立即數(shù)。舉例:MOVAL,00,190,-1和MOVAX,1900FFFFFFFFH為MOVEAX,-1立即數(shù)。MOVEAX,0FFFFFFFFH操作數(shù)包含在CPU內(nèi)部的寄存器中舉例:MOVBL,80源操作數(shù)使用的是立即尋址;目標(biāo)操作數(shù)使用寄存器尋址舉例:MOVEAX,EBXEBX和EAX都是寄存器尋址
3.4.2寄存器尋址
3.4.3直接尋址指令中直接給出了操作數(shù)的地址例如:dVar是定義好的一個(gè)雙字型變MOVEAX,dVarMOVdVar,EBX
執(zhí)行指令“MOVEAX,dVar”時(shí),CPU從指令中得知dVar的地址,再?gòu)牡刂啡〕鲆粋€(gè)雙字,送給EAX。3.4.4寄存器間接尋址
操作數(shù)的地址放在寄存器中,CPU從寄存器中取得操作數(shù)的地址,例如:MOVESI,00404011HMOVEAX,[ESI]ESI外面加一對(duì)方括號(hào),表示把ESI作為地址,從內(nèi)存中取出一個(gè)雙字。
3.4.5寄存器相對(duì)尋址操作數(shù)的地址是寄存器和一個(gè)立即數(shù)相加后得到的結(jié)果
舉例:MOVESI,0040200AHMOVEDI,[ESI+4]ESI加上4后得到的結(jié)果,作為一個(gè)操作數(shù)的地址。再?gòu)倪@個(gè)地址中取出一個(gè)雙字送給EDI。
3.4.6基址變址尋址操作數(shù)的地址是兩個(gè)寄存器相加后得到的結(jié)果,兩個(gè)寄存器分別稱為基址寄存器和變址寄存器。舉例:MOVESI,0040200AHMOVEBX,4MOVEDI,[EBX+ESI]
3.4.6基址變址尋址(續(xù))基址寄存器有兩個(gè):BX和BP變址寄存器也有兩個(gè):SI和DI基址變址寄存器只能是4種組合之一:[BX+SI],[BX+DI],[BP+SI]和[BP+DI]。3.4.7基址變址相對(duì)尋址
操作數(shù)的地址是兩個(gè)寄存器以及一個(gè)立即數(shù)相加后得到的結(jié)果,即基址寄存器、變址寄存器和相對(duì)量。舉例:MOVESI,0040200AHMOVEBX,4MOVEDI,[EBX+ESI+4]
3.4.8基址變址比例相對(duì)尋址
操作數(shù)的地址是由基址寄存器、變址寄存器乘以一個(gè)比例數(shù)和相對(duì)量這3個(gè)部分相加得到的結(jié)果。比例數(shù)只能有1,2,4,8,這4種取值。
舉例:MOVESI,0040200AHMOVEBX,4MOVEDI,[ESI+EBX*2+4]3.4.9尋址方式總結(jié)
有效地址的計(jì)算方式
EA的計(jì)算中包括基址、變址、比例、相對(duì)這4個(gè)部分。每個(gè)部分都可以從上面的可選項(xiàng)中任選其一。它可以轉(zhuǎn)換為以下幾種尋址方式:比例數(shù)取1時(shí),就變成基址變址相對(duì)尋址方式。比例數(shù)取1且相對(duì)量不出現(xiàn)時(shí),就變成基址變址尋址方式。變址寄存器不出現(xiàn)時(shí),就變成寄存器相對(duì)尋址方式。變址寄存器和相對(duì)量不出現(xiàn)時(shí),就變成寄存器間接方式?;芳拇嫫骱妥冎芳拇嫫鞑怀霈F(xiàn)時(shí),就變成直接方式。3.4.10段超越內(nèi)存操作數(shù)的地址由兩個(gè)部分指定:段和有效地址。尋址方式中只確定有效地址段寄存器確定段地址沒(méi)有指定段寄存器且尋址方式使用了ESP和EBP寄存器,就使用SS段寄存器。其他情況,使用DS段寄存器。
例如,下面指令中的內(nèi)存操作數(shù)在SS段中:MOVEAX,[EBP+8]MOVEBX,[ESP-4]下面指令中的內(nèi)存操作數(shù)在DS段中:MOVEAX,[EBX+8]MOVEBX,[ESI-4]MOVEAX,[0040200AH]
3.5數(shù)據(jù)定義3.5.1常數(shù)的表示3.5.2簡(jiǎn)單數(shù)據(jù)類型3.5.3DUP偽操作3.5.4數(shù)據(jù)定義的例子程序
3.5.1常數(shù)的表示二進(jìn)制數(shù)字后面跟b或B,如00011011b八進(jìn)制數(shù)字后面跟o或O;如33o十進(jìn)制數(shù)字后面跟d或D,如27d十六進(jìn)制數(shù)字后面跟h或H,如1BH數(shù)字后面不跟字母時(shí),被當(dāng)做十進(jìn)制數(shù)可用.radix指定默認(rèn)數(shù)值(一般不用)
3.5.2簡(jiǎn)單數(shù)據(jù)類型3.5.2簡(jiǎn)單數(shù)據(jù)類型(續(xù))定義數(shù)據(jù)的語(yǔ)句為:[變量名]助記符
表達(dá)式[,表達(dá)式…]舉例:bVarDB120wVarWORD 200,3003.5.3DUP偽操作
為連續(xù)的存儲(chǔ)單元提供重復(fù)數(shù)據(jù)格式:NDUP(表達(dá)式)N為重復(fù)因子,只能取正整數(shù)DUP還可以嵌套常用來(lái)定義數(shù)組,例如:bArrayWORD50DUP(0)表示字型數(shù)組bArray,有50個(gè)元素,每個(gè)元素初值為0
3.5.4數(shù)據(jù)定義的例子程序說(shuō)明數(shù)據(jù)變量的定義和使用方法的例子defvar.asm命令:ml/coffdefvar.asm/linksubsystem:console結(jié)果:在VC調(diào)試程序中查看數(shù)據(jù)區(qū)的內(nèi)容如圖:3.6操作符3.6.1常用偽操作1.PTR偽操作2.EQU偽操作3.
(等號(hào))偽操作4.$偽操作5.ORG偽操作6.offset操作符7.type操作符8.length操作符9.size操作符
1.PTR偽操作用法:類型PTR地址表達(dá)式
類型的取值:BYTE,WORD,DWORD等作用(1)在指令中臨時(shí)改變變量的類型(2)確定指令中操作數(shù)的類型
2.EQU偽操作用法為:符號(hào)名
EQU表達(dá)式舉例:NULL EQU0MB_OK EQU0在程序中就可以使用這些符號(hào)來(lái)替代這些常量,EQU的作用和C語(yǔ)言中的“#define”相似。
3.
(等號(hào))偽操作用法:符號(hào)名
表達(dá)式
作用:為常量、表達(dá)式及其他各種符號(hào)定義一個(gè)等價(jià)的符號(hào)名
舉例:I=100可多次重復(fù)定義,以最后一次定義的值為準(zhǔn)而EQU定義的符號(hào)名則只能定義一次4.$偽操作
$在程序中表示當(dāng)前地址計(jì)數(shù)器的值
舉例:wVarWORD0102h,1000,100*100BYTESOFWVAREQU$-wVar$代表該行所在的地址計(jì)數(shù)器,減去wVar的地址,就得到了wVar所占用的字節(jié)數(shù)。5.ORG偽操作
用法為:ORG數(shù)值表達(dá)式作用:將程序下一行的地址計(jì)數(shù)器的值設(shè)置成數(shù)值表達(dá)式的值舉例:aVarBYTE01hORG$+10bVarBYTE02h在aVar和bVar兩個(gè)變量中插入10字節(jié)的空間
6.offset操作符用法為:offset[變量|標(biāo)號(hào)]作用:取出變量或標(biāo)號(hào)的地址
舉例:下面2條語(yǔ)句等價(jià)dVar3DWORDwVar2dVar3DWORDoffsetwVar27.typ
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東石油化工學(xué)院《Andoid基礎(chǔ)編程》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東汕頭幼兒師范高等??茖W(xué)校《第一外國(guó)語(yǔ)英》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東農(nóng)工商職業(yè)技術(shù)學(xué)院《生物制藥學(xué)科前沿進(jìn)展》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東茂名幼兒師范??茖W(xué)?!洞黉N策略》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東茂名健康職業(yè)學(xué)院《英國(guó)文學(xué)下》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東理工職業(yè)學(xué)院《美國(guó)社會(huì)與文化》2023-2024學(xué)年第一學(xué)期期末試卷
- 一年級(jí)數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)集錦
- 大腦的奧秘:神經(jīng)科學(xué)導(dǎo)論(復(fù)旦大學(xué))學(xué)習(xí)通測(cè)試及答案
- 【2022屆走向高考】高三數(shù)學(xué)一輪(北師大版)基礎(chǔ)鞏固:第8章-第1節(jié)-簡(jiǎn)單幾何體及其三視圖和直觀圖
- 2022韶山市高考英語(yǔ)閱讀理解及書面表達(dá)精煉(8)及答案
- 《XL集團(tuán)破產(chǎn)重整方案設(shè)計(jì)》
- 智慧金融合同施工承諾書
- 術(shù)后甲狀旁腺功能減退癥管理專家共識(shí)
- 【7道期末】安徽省安慶市區(qū)2023-2024學(xué)年七年級(jí)上學(xué)期期末道德與法治試題(含解析)
- 2024年01月22094法理學(xué)期末試題答案
- 2024年1月國(guó)家開放大學(xué)法律事務(wù)??啤睹穹▽W(xué)(1)》期末紙質(zhì)考試試題及答案
- 學(xué)校2024-2025學(xué)年教研工作計(jì)劃
- 安徽省蕪湖市2023-2024學(xué)年高一上學(xué)期期末考試 歷史 含解析
- 煙草執(zhí)法課件教學(xué)課件
- 2024年安全文化建設(shè)實(shí)施方案
- 康復(fù)治療技術(shù)歷年真題單選題100道及答案
評(píng)論
0/150
提交評(píng)論