版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
15.1Windows基礎(chǔ)
1.Windows的內(nèi)存管理Windows操作系統(tǒng)為每一個應(yīng)用程序建立一個4GB的線性空間。線性空間中只包含該應(yīng)用程序的數(shù)據(jù)段和代碼段,操作系統(tǒng)使用的代碼和數(shù)據(jù)(如全局描述符表GDT,局部描述符表LDT與頁表等)以及一些共享代碼和數(shù)據(jù)等。2.Win32匯編的內(nèi)存尋址與實模式的匯編相比,Win32匯編對內(nèi)存數(shù)據(jù)的訪問更加方便。(2)Windows操作系統(tǒng)不僅已經(jīng)預(yù)先為要運行的用戶應(yīng)用程序的代碼段、數(shù)據(jù)段和堆棧段設(shè)置好描述符,規(guī)定這些段的的段基址都為0,段界限都為FFFFFFFFH。而且程序開始執(zhí)行時,CS,DS,ES,SS里存放的選擇子已經(jīng)指向正確的描述符,程序員不需要給這些段寄存器賦值。在整個程序運行期間,程序員也不應(yīng)該修改這些段寄存器的值。(1)在Windows系統(tǒng)中,每個應(yīng)用程序的整個4GB線性地址空間都作為一個段。代碼段和數(shù)據(jù)段/堆棧段的空間統(tǒng)一的,都是00000000H~FFFFFFFFH。在這個4GB的地址空間中,一部分用來存放程序,一部分作為數(shù)據(jù)區(qū),一部分作為堆棧,另外還有一部分被系統(tǒng)使用。這些部分的地址區(qū)域是不重合的。3.Windows下的中斷和異常(1)為了系統(tǒng)的安全,運行在特權(quán)級3的應(yīng)用程序是不能像工作在實模式下一樣,自己來編寫中斷服務(wù)子程序,也不能通過修改中斷描述符表來調(diào)用系統(tǒng)提供的中斷服務(wù)子程序。(2)在Windows操作系統(tǒng)中,使用Windows提供的應(yīng)用程序編程接口(API)來代替中斷服務(wù)子程序提供的系統(tǒng)功能4.Windows系統(tǒng)下的I/O保護(hù)應(yīng)用程序執(zhí)行時,對端口是不能直接進(jìn)行訪問的,也不能使用STI,CLI中斷允許和禁止指令。15.2Win32匯編源程序的格式15.2.1
源程序結(jié)構(gòu).586
.MODELFLAT,STDCALL.OPTIONCASEMAP:NONE
.DATA
<定義有初始化值的變量>
.DATA?
<定義未初始化值的變量>
.CONST
<定義常量>
.CODE
<標(biāo)號>
<代碼>
.....
END<標(biāo)號>1.方式選擇偽指令.586是一個匯編語言偽指令,含義和DOS匯編相同.2.內(nèi)存模式選擇偽指令.MODEL是用來指定內(nèi)存模式的偽指令。.MODELFLAT匯編程序自動為各種段寄存器做如下段約定:ASSUMECS:FLAT,DS:FLAT,SS:FLAT,ES:FLATSTDCALL告訴匯編程序參數(shù)的傳遞約定。Win32匯編語言采用STDCALL格式。STDCALL格式參數(shù)傳遞順序是從右到左,即最右邊的參數(shù)最先壓棧,由被調(diào)用者(子程序)恢復(fù)堆棧指針。
3.OPTION語句OPTIONCASEMAP:TYPE說明程序中的變量和子程序名是否對大小寫敏感,即區(qū)分大小寫。由于WindowsAPI函數(shù)是區(qū)分大小寫,選項應(yīng)設(shè)置為“OPTIONCASEMAP:NONE”。4.段定義偽指令WIN32中只包含代碼段和數(shù)據(jù)段:DATA和CODE其中數(shù)據(jù)段又分為三種.DATA.DATA?.CONST.DATA定義已初始化的變量。這些變量的值在程序的執(zhí)行中可以被更改。.DATA?定義未初始化的變量。.CONST定義常量,這些常量在程序運行過程中是不能更改的.CODE定義代碼段。
格式:END標(biāo)號功能:通知匯編程序,源程序到此結(jié)束,標(biāo)號所對應(yīng)的指令是程序的啟動指令。5.匯編結(jié)束語句Win32匯編語言經(jīng)典源程序例子.586.MODELFLAT,STDCALLOPTIONCASEMAP:NONEINCLUDEWINDOWS.INCINCLUDEKERNEL32.INCINCLUDELIBKERNEL32.LIBINCLUDEUSER32.INCINCLUDELIBUSER32.LIB.DATAMsgBoxCaptionDB'Exampleofwin32',0;消息框標(biāo)題顯示字符串MsgBoxTextDB'Hello,你好!',0;消息框內(nèi)顯示字符串.CODESTART:INVOKEMessageBox,NULL,addrMsgBoxText,addrMsgBoxCaption,MB_OKINVOKEExitProcess,NULLENDSTART15.3Win32匯編可執(zhí)行文件的生成匯編源程序*.asm資源腳本文件*.rc匯編程序資源編譯程序目標(biāo)程序*.obj資源文件*.res鏈接程序Win32可執(zhí)行文件*.exeWin32匯編軟件的開發(fā)可分源程序開發(fā)和資源開發(fā)兩部分匯編鏈接步驟(以教材例15.1為例)(1)
匯編源程序hello.asm
ml/c/coffhello.asm(2)鏈接目標(biāo)程序hello.obj
link/subsystem:windowshello.obj(3)運行可執(zhí)行程序hello.exehello.exe注意:如果該程序有資源文件hello.res,則應(yīng)該用link將hello.obj和hello.res鏈接成hello.exe。15.4Win32匯編基本語法15.4.1標(biāo)號和變量
Win32匯編使用的高版本匯編中,標(biāo)號的作用域是當(dāng)前的子程序。在同一個子程序中的標(biāo)號不能同名,但在不同的子程序中可以有相同名稱的標(biāo)號。1.標(biāo)號Win32匯編中變量的類型很多,根據(jù)變量的作用域可分為全局變量和局部變量。(1)全局變量用數(shù)據(jù)定義偽指令在.DATA或.DATA?段定義全局變量。全局變量的作用域是整個程序。2.變量(2)局部變量例:LOCALVAR1:WORDLOCALVAR2LOCALVAR3[10]:BYTE注意:LOCAL偽指令必須緊跟在子程序定偽指令PROC之后,其它指令之前。局部變量不能和全局變量同名。局部變量的作用域是當(dāng)前的子程序。定義格式:
LOCAL變量1[重復(fù)數(shù)量1][:類型],變量2[重復(fù)數(shù)量2][:類型]……
3.獲取變量地址獲取全局變量地址使用OFFSET運算符。例:MOV BX,OFFSET變量名注意:ADDR偽操作符只能在INVOKE的參數(shù)中使用。對于局部變量,MASM對此有一個專用的偽操作符ADDR。格式:ADDR 局部變量名和全局變量名例:INVOKEMessageBox,NULL,ADDRMsgBoxText,ADDRMsgBoxCaption,MB_OK15.4.2結(jié)構(gòu)1.結(jié)構(gòu)的定義格式:結(jié)構(gòu)名STRUCT
字段1 類型 ?
字段2 類型 ?
……
結(jié)構(gòu)名 ENDS例:定義一個名為STUDENT的結(jié)構(gòu),該結(jié)構(gòu)有3個字段。
STUDENTSTRUCTNUMBYTE?SEXBYTE?RECORDWORD?
STUDENTENDS2.結(jié)構(gòu)變量的定義結(jié)構(gòu)變量的定義格式如下:變量名結(jié)構(gòu)名<>格式一或變量名結(jié)構(gòu)名<VAR1,VAR2,……>格式二例:定義結(jié)構(gòu)變量STU1STUDENT<>STU2STUDENT<10,0,100>
3.結(jié)構(gòu)變量的訪問在匯編中,結(jié)構(gòu)變量的訪問的兩種較簡單的方法:(1)MOVAX,STU2.RECORD
表示把RECORD字段的值放入AX中去。(2)MOVESI,OFFSETSTU2
使用指針存取數(shù)據(jù)結(jié)構(gòu)15.4.3子程序格式:子程序名PROC[語言類型][可視區(qū)域][USES寄存器列表][,參數(shù):類型]...[VARARG] LOCAL局部變量列表
……RET子程序名 ENDP(1)語言類型表示參數(shù)的使用方式和堆棧平衡的方式,Win32約定的類型是STDCALL。參數(shù)傳遞順序是從右到左,由子程序恢復(fù)堆棧指針。
(2)可視區(qū)域PRIVATE表示子程序只對本模塊可見;PUBLIC表示對所有的模塊可見;EXPORT表示是導(dǎo)出的函數(shù)。默認(rèn)的設(shè)置是PUBLIC。(3)USES寄存器列表表示CPU在進(jìn)入子程序后自動執(zhí)行PUSH這些寄存器的指令,在RET子程序返回前自動執(zhí)行POP指令,用于保護(hù)現(xiàn)場。(4)參數(shù)和類型參數(shù)指參數(shù)的名稱,在定義參數(shù)名的時候不能跟全局變量和子程序中的局部變量重名。對于類型,由于Win32中的參數(shù)類型只有32位(DWORD)一種類型,所以可以省略。(5)VARARG表示在已確定的參數(shù)后還可以跟多個數(shù)量不確定的參數(shù)。完成了子程序定義之后,可以用CALL指令或更方便的INVOKE偽指令來調(diào)用子程序。例:利用子程序完成三數(shù)相加N1+N2+N3,假設(shè)N1=1122H,N2=3344H,N3=5566H.586.MODELFLAT,STDCALLOPTIONCASEMAP:NONEINCLUDEKERNEL32.INCINCLUDELIBKERNEL32.LIBINCLUDEWINDOWS.INCCOMPUTEPROTOPARA1:DWORD;計算子程序聲明.DATAN1DW1122HN2DW3344HN3DW5566H.DATA?SUMDW?;計算結(jié)果
.CODESTART:;調(diào)用計算子程序,將數(shù)據(jù)存放的起始地址作為傳遞的參數(shù)
INVOKECOMPUTE,ADDRN1MOVSUM,AX;保存計算結(jié)果
INVOKEExitProcess,NULL;結(jié)束執(zhí)行程序
COMPUTEPROCUSESEAXEBX,PARA1:DWORDMOVEBX,PARA1MOVEAX,0;求和寄存器清0MOVAX,WORDPTR[EBX];AX=N1ADDAX,WORDPTR[EBX+2];AX=N1+N2ADDAX,WORDPTR[EBX+4];AX=N1+N2+N3RETCOMPUTEENDPENDSTART15.4.4高級語法
Win32的高版本MASM中新引入了一系列的偽指令,涉及條件測試、分支和循環(huán)語句。利用它們,匯編語言有了和高級語言一樣的結(jié)構(gòu),配合局部變量和調(diào)用參數(shù),為使用Win32匯編編寫大規(guī)模的Windows應(yīng)用程序奠定了基礎(chǔ)。1.條件測試表達(dá)式在所有的分支和循環(huán)語句首先要進(jìn)行條件測試。條件測試表達(dá)式:寄存器或變量 操作符操作數(shù)
兩個以上的表達(dá)式可以用邏輯運算符連接
CPU標(biāo)志寄存器一些標(biāo)志位的狀態(tài),相當(dāng)于一個表達(dá)式。
允許的操作符、邏輯運算符和標(biāo)志位狀態(tài)見教材表15.4。例:X==10 ;X等于10為真EAX!=0 ;EAX不等于0為真SBYTEPTRAL>=8;AL大于等于8時為真,AL為有符號數(shù)(X>=100)&&ECX ;X大于等于100且ECX為非零時為真(EAX==EBX)&&ZERO?;EAX等于EBX且Z標(biāo)志=1為真分支語句的語法如下:.IF 條件表達(dá)式1
表達(dá)式1為“真”時執(zhí)行的指令[.ELSEIF條件表達(dá)式2]
表達(dá)式2為“真”時執(zhí)行的指令[.ELSEIF條件表達(dá)式3]
表達(dá)式3為“真”時執(zhí)行的指令…[.ELSE]
所有表達(dá)式為“否”時執(zhí)行的指令.ENDIF2.分支語句注意:關(guān)鍵字IF/ELSEIF/ELSE/ENDIF的前面有個小數(shù)點。例:設(shè)NUMBER單元的數(shù)X以及數(shù)值N1,N2均為單字節(jié)無符號數(shù),請判斷X的大小,并根據(jù)判斷結(jié)果分別顯示:N1<=X<=N2,或X<N1,或X>N2【例15.4.2】.586.MODELFLAT,STDCALLOPTIONCASEMAP:NONEINCLUDEKERNEL32.INCINCLUDEWINDOWS.INCINCLUDELIBKERNEL32.LIBINCLUDEUSER32.INCINCLUDELIBUSER32.LIB.DATAN1DB22N2DB88MESG1DB'N1<=X<=N2',0MESG2DB'X<N1',0MESG3DB'X>N2',0MsgBoxCaptionDB"EXAMPLEOFWIN32",0.DATA?NUMBERDB?.CODESTART:MOVAL,NUMBER.IF(AL>=N1&&AL<=N2);N1<=X<=N2MOVEBX,OFFSETMESG1.ELSEIF(AL<N1);X<N1MOVEBX,OFFSETMESG2.ELSE;X>N2MOVEBX,OFFSETMESG3.ENDIFINVOKEMessageBox,NULL,EBX,ADDRMsgBoxCaption,MB_OKINVOKEExitProcess,NULLENDSTART
3.循環(huán)語句(1)循環(huán)結(jié)構(gòu)語法一
.WHILE 條件測試表達(dá)式 指令
[.BREAK[.IF退出條件]][.CONTINUE].ENDW(2)循環(huán)結(jié)構(gòu)語法二
.REPEAT
指令
[.BREAK[.IF退出條件]] [.CONTINUE].UNTIL 條件測試表達(dá)式(或.UNTILCXZ[條件測試表達(dá)式])例:假設(shè)從BUF單元開始為一個ASCII碼字符串,找出其中的最大數(shù)送屏幕顯示?!纠?5.4.3】.586.MODELFLAT,STDCALLOPTIONCASEMAP:NONEINCLUDEKERNEL32.INCINCLUDEWINDOWS.INCINCLUDELIBKERNEL32.LIBINCLUDEUSER32.INCINCLUDELIBUSER32.LIB.DATABUFDB'QWERYTUIOP123'COUNTEQU$-BUFMAXDB'Max=',?,0MsgBoxCaptionDB"Exampleofwin32",0
.CODESTART:
MOVECX,0MOVEBX,OFFSETBUF;字符串首址偏移->EBXMOVAL,0;最小數(shù)->AL.WHILEECX<COUNT;循環(huán)
MOVDL,[EBX].IF(DL>AL);比較
MOVAL,DL;大數(shù)->AL
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江宇翔職業(yè)技術(shù)學(xué)院《公路工程定額原理與計價》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江工業(yè)職業(yè)技術(shù)學(xué)院《采購過程演練》2023-2024學(xué)年第一學(xué)期期末試卷
- 反諧振阻抗比較小的原因
- 中國傳媒大學(xué)《計算機(jī)電子電路基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 長治醫(yī)學(xué)院《劇場品牌管理》2023-2024學(xué)年第一學(xué)期期末試卷
- 云南司法警官職業(yè)學(xué)院《體育-臺球》2023-2024學(xué)年第一學(xué)期期末試卷
- 企業(yè)內(nèi)部知識分享平臺構(gòu)建方案
- 保險行業(yè)數(shù)字營銷模板
- 拿破侖歷史名人人物介紹
- 中考誓師大會學(xué)生發(fā)言稿
- 2025年浙江省金華市統(tǒng)計局招聘2人歷年高頻重點提升(共500題)附帶答案詳解
- 員工職業(yè)素養(yǎng)與團(tuán)隊意識培訓(xùn)課件2
- 部編版三年級下冊語文全冊教案及全套導(dǎo)學(xué)案
- 2024年國家級森林公園資源承包經(jīng)營合同范本3篇
- 對口升學(xué)《計算機(jī)應(yīng)用基礎(chǔ)》復(fù)習(xí)資料總匯(含答案)
- 迪士尼樂園總體規(guī)劃
- 2024年江蘇省蘇州市中考數(shù)學(xué)試卷含答案
- 2024年世界職業(yè)院校技能大賽高職組“市政管線(道)數(shù)字化施工組”賽項考試題庫
- 介紹蝴蝶蘭課件
- 大學(xué)計算機(jī)基礎(chǔ)(第2版) 課件 第1章 計算機(jī)概述
- 數(shù)字化年終述職報告
評論
0/150
提交評論