版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第1章Windows匯編語(yǔ)言程序設(shè)計(jì)基礎(chǔ)Windows匯編語(yǔ)言程序分為控制臺(tái)編程和圖形界面編程兩種,控制臺(tái)編程相對(duì)簡(jiǎn)單一些。為了由淺入深,本書(shū)從控制臺(tái)編程開(kāi)始講解。讀者總希望用最快的速度掌握書(shū)中的概貌,為此從一個(gè)最簡(jiǎn)單的程序開(kāi)始。一些匯編語(yǔ)言語(yǔ)法也結(jié)合程序進(jìn)行講解,有些指令和語(yǔ)法用注解的方法說(shuō)明。第一個(gè)完整的Windows匯編語(yǔ)言程序Windows匯編語(yǔ)言程序有自己的編程規(guī)范,它的編程規(guī)范比VisualC要簡(jiǎn)單得多,調(diào)試也很方便。更重要的是系統(tǒng)把重要的東西都呈現(xiàn)給讀者,使讀者更能掌握其中的本質(zhì)。用一條一條的匯編語(yǔ)言指令很難寫(xiě)出大程序,Windows匯編語(yǔ)言程序也是調(diào)用系統(tǒng)提供的API來(lái)寫(xiě)程序。因而,用Windows匯編語(yǔ)言同樣可寫(xiě)出大程序。以下是一個(gè)最簡(jiǎn)單的Windows程序。;程序功能:顯示一個(gè)信息框。;ex1.asm(e:\masm\base) ;程序名;編譯鏈接方法:;ml/c/coffex1.asm;link/subsystem:consoleex1.obj.386 ;指明指令集.modelflat,stdcall;程序工作模式,flat為Windows程序使用的模式(代碼和數(shù)據(jù);使用同一個(gè)4GB段),stdcall為API調(diào)用時(shí)右邊的參數(shù)先入棧optioncasemap:none;指明大小寫(xiě)敏感includewindows.incincludeuser32.incincludelibuser32.libincludekernel32.incincludelibkernel32.lib.data ;數(shù)據(jù)段szCaption db'抬頭串',0szText db'Hello!',0.code;代碼段.codestart:
invokeMessageBox,NULL,offsetszText,offsetszCaption,MB_OK;invokeMessageBox,NULL,offsetszText,offsetszCaption,MB_OK;顯示信息框;父窗口句柄;正文串的地址;抬頭串的地址;按鈕invokeExitProcess,;終止一個(gè)進(jìn)程N(yùn)ULL;退出代碼程序運(yùn)行結(jié)果見(jiàn)圖1-1。言中的偽指令,該指令的使用方法見(jiàn)1.4節(jié)。圖1-1說(shuō)明:程序調(diào)用了兩個(gè)Windows提供的API。invoke是匯編語(yǔ)言中的偽指令,該指令的使用方法見(jiàn)1.4節(jié)。圖1-1編譯、鏈接和運(yùn)行1.2.1創(chuàng)建編譯鏈接環(huán)境(1) 安裝MASM615調(diào)試工具。(2) 建立一個(gè)VAR.BAT文件,內(nèi)容如下。@echooffrem請(qǐng)根據(jù)Masm32軟件包的安裝目錄修改下面的Masm32Dir環(huán)境變量!setMasm32Dir=c:\Masm32setinclude=%Masm32Dir%\Include;c:\ProgramFiles\MicrosoftVisualStudio\VC98\Include;(本行應(yīng)接在上行后)ProgramFiles\MicrosoftVisualStudio\VC98\MFC\Include;(本行應(yīng)接在上行后)%include%(本行應(yīng)接在上行后)setlib=%Masm32Dir%\lib;%lib%setw2k=%Masm32Dir%\Incluse\w2k;%Include\w2k%setpath=%Masm32Dir%\Bin;%Masm32Dir%\Include;%Masm32Dir%\Include\w2k;%Masm32Dir%\lib;%Masm32Dir%;%PATH%(本行應(yīng)接在上行后)setMasm32Dir=echoon編譯鏈接程序前,需要切換到命令提示符方式,并運(yùn)行該文件(設(shè)置好環(huán)境),然后方可進(jìn)行編譯鏈接。1.2.2編譯鏈接和運(yùn)行以下以編譯鏈接ex1.asm為例:1)編譯。ML/Zi/c/Fl/coffex1.asmML參數(shù)說(shuō)明(注意參數(shù)大小寫(xiě))/Zi加符號(hào)調(diào)試信息/c——連接前的編譯/Fl--Fl[file]產(chǎn)生列表文件/coff一產(chǎn)生COFF格式目標(biāo)文件編譯的更多參數(shù)說(shuō)明,可用命令ML/?查閱。(2) 鏈接。LINK/SUBSYSTEM:consoleex1.obj其中console指明是控制臺(tái)編程,如果是Windows窗口編程,則將console改為Windows。(3) 運(yùn)行。在Windows下雙擊ex1.exe或在DOS命令提示符下鍵入ex1回車(chē)。1.2.3建立編譯鏈接批命令文件可以把編譯鏈接過(guò)程寫(xiě)成批命令文件,以減少鍵盤(pán)輸入量。例如:MLEXE.BATML/Zi/c/Fl/coff%1.asmLINK/subsystem:console%1.objdel%1.objdir%1.*如果要編譯鏈接exl.asm,則只需輸入:MLEXEex1回車(chē)將Windows匯編語(yǔ)言程序反匯編后的程序原形將可執(zhí)行程序用IDA反匯編工具反匯編后,程序的代碼部分可直接使用,程序的其他部分稍作修改后,即可再編譯鏈接成可執(zhí)行程序。具體修改部分見(jiàn)程序尾的說(shuō)明。;iex1.asm,本程序?yàn)閑x1.exe反匯編后的程序。;iex1.asm(e:\masm\base);編譯鏈接方法:;ml/c/coffiex1.asm;link/subsystem:Windowsiex1.obj.386.modelflat,stdcalloptioncasemap:none.dataincludewindows.incincludeuser32.incincludelibuser32.libincludekernel32.incincludelibkernel32.libCaption db'抬頭串',0Text db'Hello!',0.codepublicstartstartprocnearpush0;uTypepushoffsetCaption;"抬頭串"pushoffsetText;"Hello!"push0;hWndcallMessageBoxApush0;uExitCodecallExitProcessstartendpendstart說(shuō)明:API調(diào)用時(shí)右邊的參數(shù)先入棧。用反匯編工具IAD反匯編后,保留代碼段不變,將數(shù)據(jù)段中的數(shù)據(jù)搬入代碼段,將其余部分刪除,再加入包含文件和程序中的前4條指令,即可再編譯鏈接成可執(zhí)行程序。將可執(zhí)行文件反匯編成匯編語(yǔ)言程序,經(jīng)過(guò)適當(dāng)修改后,再編譯鏈接成可執(zhí)行文件,這是十分有意義的。invoke偽指令的使用格式、變量及數(shù)據(jù)段data和data?的區(qū)別1.4.1invoke偽指令的使用格式invoke偽指令的使用格式為:invoke函數(shù)名[,參數(shù)1][,參數(shù)2]...參數(shù)的個(gè)數(shù)不定,可以沒(méi)有,也可以有多個(gè)。如果invoke與某個(gè)函數(shù)的參數(shù)個(gè)數(shù)不匹配(少或多),則編譯時(shí)報(bào)錯(cuò)。如果參數(shù)個(gè)數(shù)少,則報(bào)錯(cuò)“rrorA2137:toofewargumentstoINVOKE”;如果參數(shù)個(gè)數(shù)多,則報(bào)錯(cuò)“errorA2137:toomanyargumentstoINVOKE”。
1.4.2變量1.變量的命名規(guī)則變量由大寫(xiě)字母A,B,…,乙小寫(xiě)字母a,b,…,z,數(shù)字0,1,2,…,9,下劃線,符號(hào)@、$和?組成,且變量的第一個(gè)符號(hào)不能是數(shù)字。變量的長(zhǎng)度不能超過(guò)240個(gè)字符,不能使用指令名關(guān)鍵字,在同一個(gè)作用域內(nèi)不能重名。應(yīng)該養(yǎng)成良好的命名習(xí)慣,如表1-1所示。表1-1縮 寫(xiě)含 義縮 寫(xiě)含 義sz表示以0結(jié)尾的字符串(ASCIIZ)lp表示指針longpointh表示句柄handlelpsz表示指向ASCIIZ的指針b表示字節(jié)bytef表示浮點(diǎn)數(shù)floatw表示字wordst表示結(jié)構(gòu)體structdw表示雙字doubleword例如:hWinlpArrayszStringstWndClassbNumberdwNumberwNumber表示窗口句柄表示指向數(shù)組的指針以0結(jié)尾的字符串hWinlpArrayszStringstWndClassbNumberdwNumberwNumberWNDCLASS結(jié)構(gòu)以字節(jié)定義的數(shù)以雙字定義的數(shù)以字定義的數(shù)2.全局變量全局變量的作用域?yàn)檎麄€(gè)程序。在.data和.data?段內(nèi)定義的變量為全局變量。全局變量的定義格式為:變量名類(lèi)型初始值變量名類(lèi)型重復(fù)數(shù)量dup(初始值)例如:countdw0arraydb10dup(0)3.局部變量局部變量的作用域?yàn)橐粋€(gè)程序內(nèi)。局部變量的定義格式為:local變量名1[重復(fù)數(shù)量][:類(lèi)型],變量名2[重復(fù)數(shù)量][:類(lèi)型]...局部變量要放在子程序的開(kāi)始位置,并且沒(méi)有初始值。例如:.modelflat,stdcalloptioncasemap:noneincludeincludewindows.inckernel32.incincludelibkernel32.lib.codeSubProcproc,x:byte,y:bytelocala:byte ;定義局部變量localb:byte ;定義局部變量invokeSubProc,1,2invokeExitProcess,0mainendpinvokeSubProc,1,2invokeExitProcess,0mainendpendmain;調(diào)用子程序(右邊參數(shù)先入棧);退出進(jìn)程moval,xmova,almoval,ymovb,alretSubProcendpmainproc4.局部變量在棧中的位置將以上程序用IDA反匯編后的程序如下sub_401000procnearvar_2=byteptr-2var_1=byteptr-1arg_0=byteptr8arg_4=byteptr0Chpushebpmovebp,espaddesp,0FFFFFFFCh;(-4)的補(bǔ)碼=OFFFFFFFChmoval,[ebp+arg_0];x=1mov[ebp+var_1],almoval,[ebp+arg_4];y=2mov[ebp+var_2],alleaveretn8;將入口參數(shù)(x,y)退棧sub_401000endppublicstartstartprocnearpush 2push 1call sub_401000push 0call $+5jmpds:ExitProcessstartendp說(shuō)明:參數(shù)在棧中的位置見(jiàn)圖1-2-2-1var_2(a)var_1(b)ebp=esp[ebp+4]ebp[ebp+8]arg_O=1(x)[ebp+OC]arg_4=2(y)圖1-2棧區(qū)示意圖1.4.3數(shù)據(jù)段data和data?的區(qū)別程序的一般結(jié)構(gòu)為:.data定義變量并初始化(有初始值).data?定義變量(變量的初始值為'?').const定義常量.code定義在.data?段中的變量的初始值只能是?。定義在.data?段中的變量不占用磁盤(pán)空間,即不增加.exe文件的大小。這是用.data?段的優(yōu)點(diǎn)。例如,在.data?中定義變量:.data?sumdw?array10dbdup(?)在實(shí)際應(yīng)用中,上述變量的初始值為0。匯編語(yǔ)言中的類(lèi)型如表1-2所示。
表1-2縮 寫(xiě)全名寫(xiě)法名稱(chēng)和字節(jié)數(shù)dbbyte字節(jié)(1字節(jié))dwword字(2字節(jié))dddword雙字(4字節(jié))dffword三字(6字節(jié))dqqword四字(8字節(jié))dttbyte10字節(jié)BCD碼sbyte有符號(hào)字節(jié)(1字節(jié))sword有符號(hào)字(2字節(jié))sdword有符號(hào)雙字(4字節(jié))real4單精度實(shí)型數(shù)(4字節(jié))real8雙精度實(shí)型數(shù)(8字節(jié))reallO10字節(jié)實(shí)型數(shù)(10字節(jié))1.4.4高級(jí)語(yǔ)法while-endw的使用while-endw的格式為:.while(條件)偱環(huán)體(條件滿足時(shí)執(zhí)行).endw;ex2.asm(e:\masm\base)高級(jí)語(yǔ)法while-endw的使用示例。;程序功能:用while循環(huán)給字節(jié)數(shù)組賦值并計(jì)算。.386.modelflat,stdcalloptioncasemap:noneincludewindows.incincludekernel32.incincludelibkernel32.libincludeuser32.incincludelibuser32.lib.dataadb10dup(0);定義字節(jié)數(shù)組bufferdb10dup(0)CapMsgdb'輸出',0szFmtdb'結(jié)果是:%d',0idb0sumdb0.code
start:movedi,0.while(i<10)moval,imova[edi],alinciincedi.endwmovi,0movedi,0.while(i<10)moval,a[edi]addsum,alinciincedi.endwxoreax,eax;格式化信息串;格式化信息串;信息串格式化后的存放地;信息串的格式:"結(jié)果是:%d",0;二進(jìn)制數(shù);顯示信息框;父窗口句柄;正文串"結(jié)果是:%d",0;抬頭串"輸出",0;按鈕"確定";結(jié)束進(jìn)程invokewsprintf,addrbuffer,addrszFmt,eaxinvokeMessageBox,NULL,圖1-3offsetbuffer,offsetCapMsg,MB_OK圖1-3INVOKEExitProcess,0endstart運(yùn)行結(jié)果見(jiàn)圖1-3。高級(jí)語(yǔ)法repeat-until的使用repeat-until的格式為:.repeat偱環(huán)體(條件不滿足時(shí)執(zhí)行).until(條件);ex3.asm(e:\masm\base)高級(jí)語(yǔ)法repeat-until的使用。;程序功能:用repeat循環(huán)給雙字?jǐn)?shù)組賦值并計(jì)算。.386moveax,suminvokewsprintf,addrbuffer,addrszFmt,eaxmoveax,suminvokewsprintf,addrbuffer,addrszFmt,eaxinvokeMessageBox,NULL,offsetbuffer,.modelflat,stdcalloptioncasemap:noneincludewindows.incincludekernel32.incincludelibkernel32.libincludeuser32.incincludelibuser32.lib.dataadd10dup(0) ;定義雙字?jǐn)?shù)組bufferdb10dup(0)CapMsgdb'輸出',0szFmtdb'結(jié)果是:%d',0idd0sumdd0.codestart:movedi,0.repeatmoveax,imova[edi],eaxinciaddedi,4.until(i>=10)movi,0movedi,0.repeatmoveax,a[edi]addsum,eaxinciaddedi,4.until(i>=10);格式化信息串;信息串格式化后的存放地;信息串的格式:"結(jié)果是:%d",0;二進(jìn)制數(shù);顯示信息框;父窗口句柄;正文串"結(jié)果是:%d",0
offsetCapMsg,MB_OKoffsetCapMsg,MB_OK;抬頭串"輸出",0;按鈕"確定"INVOKEExitProcess,0 ;結(jié)束進(jìn)程endstart運(yùn)行結(jié)果見(jiàn)圖1-3。高級(jí)語(yǔ)法if-elseif-endif的使用if-elseif-endif的格式為:.if條件1指令(條件1滿足時(shí)執(zhí)行)[.elseif條件2]指令(條件2滿足時(shí)執(zhí)行)[.elseif條件3]指令(條件3滿足時(shí)執(zhí)行)endif;ex4.asm(e:\masm\base)高級(jí)語(yǔ)法if—elseif—endif的使用。;程序功能:輸出"number是正數(shù)"或"number是負(fù)數(shù)"。.386.modelflat,stdcalloptioncasemap:noneincludewindows.incincludekernel32.incincludelibkernel32.libincludeuser32.incincludelibuser32.lib.dataCapMsgdb'輸出',0szFmtdb'number是正數(shù):%d',0szFmt2db'number是負(fù)數(shù):%d',0numberdd—9bufferdb80dup(0).codestart:moveax,numberinvokewsprintf,addrbuffer,addrszFmt,;格式化信息串;信息串格式化后的存放地;'number是正數(shù)',0eaxeax;二進(jìn)制數(shù)moveax,number.ifeax==-9invokewsprintf,addrbuffer,addrszFmt2,eax.endif;格式化信息串;信息串格式化后的存放地;'number是負(fù)數(shù)',0;二進(jìn)制數(shù)INVOKEExitProcess,0;結(jié)束進(jìn)程INVOKEExitProcess,0;結(jié)束進(jìn)程endstartinvokeMessageBox,NULL,offsetbuffer,offsetCapMsg,MB_OK;顯示信息框;父窗口句柄;正文串"結(jié)果是:%d",0;抬頭串"輸出",0;按鈕"確定"圖1-4運(yùn)行結(jié)果見(jiàn)圖1-4圖1-4條件運(yùn)算符匯編語(yǔ)言中的條件運(yùn)算符和高級(jí)語(yǔ)言的條件運(yùn)算符類(lèi)似,這給編寫(xiě)程序帶來(lái)了極大的方便。條件運(yùn)算符如表1-3所示。表1-3條件運(yùn)算符功 能說(shuō) 明==等于變量和操作數(shù)之間的比較!=不等于變量和操作數(shù)之間的比較<小于變量和操作數(shù)之間的比較>大于變量和操作數(shù)之間的比較<=小于等于變量和操作數(shù)之間的比較>=大于等于變量和操作數(shù)之間的比較&&邏輯與兩個(gè)表達(dá)式的結(jié)果||邏輯或兩個(gè)表達(dá)式的結(jié)果&按位與變量和操作數(shù)的結(jié)果!取反變量或表達(dá)式的結(jié)果條件運(yùn)算時(shí),非零為真,零為假。條件運(yùn)算時(shí),要注意表達(dá)式的左邊應(yīng)為寄存器或變量,不能為常數(shù),表達(dá)式兩邊可以同時(shí)為寄存器,但不能同時(shí)為變量。標(biāo)志測(cè)試偽指令:CARRY?表示進(jìn)位標(biāo)志是置位CARRY?表示進(jìn)位標(biāo)志是置位ZERO?SIGN?PARITY?OVERFLOW?表示零標(biāo)志是置位表示符號(hào)標(biāo)志是置位表示奇偶標(biāo)志是置位表示溢出標(biāo)志是置位;ex5.asm(e:\masm\base)條件運(yùn)算符的使用。.386.modelflat,stdcalloptioncasemap:noneincludewindows.incincludekernel32.incincludelibkernel32.libincludeuser32.incincludelibuser32.lib.dataCapMsgdb'輸出',0szFmtdb'eax=%d(eax==1滿足),ebx=%d(置進(jìn)位標(biāo)志),edx=%d(edx為零滿足)',0bufferdb80dup(0).codestart:moveax,1.ifeax==1moveax,2.endifmovebx,10.codestart:moveax,1.ifeax==1moveax,2.endifmovebx,10stc.ifCARRY?movebx,20.endifxoredx,edx.if!ZERO?movedx,8.endifinvokewsprintf,addrbuffer,addrszFmt,;置進(jìn)位標(biāo)志;進(jìn)位標(biāo)志是置位?;使零標(biāo)志置位(為1);零標(biāo)志不是置位?eax,ebx,;格式化信息串;信息串格式化后的存放地;格式化串;數(shù)edxinvokeMessageBox,NULL,offsetbuffer,offsetCapMsg,MB_OK;edxinvokeMessageBox,NULL,offsetbuffer,offsetCapMsg,MB_OK;顯示信息框;父窗口句柄;正文串;抬頭串"輸出",0;按鈕"確定"INVOKEExitProcess,0 ;結(jié)束進(jìn)程endstart運(yùn)行結(jié)果見(jiàn)圖1-5。圖1-51.4.8高級(jí)語(yǔ)法continue的使用continue用在循環(huán)while-endw和repeat-until中,它的功能是結(jié)束本次循環(huán)(continue語(yǔ)句后的語(yǔ)句不執(zhí)行),進(jìn)入下一次循環(huán)。continue的語(yǔ)法為:.continue;ex6.asm(e:\masm\base)高級(jí)語(yǔ)法continue的使用。;程序功能:計(jì)算1+3+5+...+99的和。.386.modelflat,stdcalloptioncasemap:noneincludewindows.incincludekernel32.incincludelibkernel32.libincludeuser32.incincludelibuser32.lib.dataarraydw100dup(0);定義字?jǐn)?shù)組bufferdb80dup(0)CapMsgdb'輸出',0szFmtdb'結(jié)果是:%d',0inciaddedi,2movedx,eaxinciaddedi,2movedx,eaxroredx,1.if!CARRY?.continue.endifaddsum,eax.endwinvokewsprintf,;格式化信息串a(chǎn)ddrbuffer,;信息串格式化后的存放地addrszFmt,;信息串的格式:"結(jié)果是:%d",0sum;二進(jìn)制數(shù)invokeMessageBox,;顯示信息框NULL,;父窗口句柄offsetbuffer,;正文串"結(jié)果是:%d",0offsetCapMsg,;抬頭串"輸出",0MB_OK;按鈕"確定"INVOKEExitProcess,0;結(jié)束進(jìn)程endstarti dw1sum dd0.codestart:movedi,0.while(i<=100)movax,imovarray[edi],ax ;給數(shù)組賦值inci ;計(jì)數(shù)addedi,2 ;指向下一個(gè).endwmovi,1movedi,0.while(i<=100)movzxeax,wordptrarray[edi];計(jì)數(shù);指向下一個(gè);偱環(huán)右移一位;進(jìn)位標(biāo)志沒(méi)有置位?(eax是偶數(shù));結(jié)束本次偱環(huán)(此語(yǔ)句后的語(yǔ)句不執(zhí)行);奇數(shù)求和圖1-6運(yùn)行結(jié)果見(jiàn)圖1-6圖1-61.4.9高級(jí)語(yǔ)法breakif的使用breakif語(yǔ)句用在偱環(huán)while-endw和repeat-until中,其功能是退出偱環(huán)。
breakif語(yǔ)句的語(yǔ)法是:.break.if退出條件;ex7.asm(e:\masm\base)高級(jí)語(yǔ)法breakif的使用。;程序功能:計(jì)算1+2+3+...+50的和。.386.modelflat,stdcalloptioncasemap:noneincludewindows.incincludekernel32.incincludelibkernel32.libincludeuser32.incincludelibuser32.lib.dataarraydw100dup(0);定義字?jǐn)?shù)組bufferdb80dup(0)CapMsgdb'輸出',0szFmtdb'結(jié)果是:%d',0i dw 1sumdd0.codestart:movedi,0.while(i<=100)movax,imovarray[edi],ax;給數(shù)組賦值inci ;計(jì)數(shù)addedi,2 ;指向下一個(gè).endwmovi,1movedi,0.while(i<=100)movzxeax,wordptrarray[edi].break.ifeax==51addsum,eax;求和inci;計(jì)數(shù)addedi,2;指向下一個(gè).endwinvokewsprintf,addrbuffer,addrszFmt,;格式化信息串;信息串格式化后的存放地invokewsprintf,addrbuffer,addrszFmt,;信息串的格式:"結(jié)果是:%d",0
suminvokeMessageBox,NULL,offsetbuffer,suminvokeMessageBox,NULL,offsetbuffer,offsetCapMsg,MB_OK;二進(jìn)制數(shù);顯示信息框;父窗口句柄;正文串'結(jié)果是:%d",0;抬頭串"輸出",0;按鈕"確定"INVOKEExitProcess,0;結(jié)束進(jìn)程endstart圖1-7運(yùn)行結(jié)果見(jiàn)圖1-7圖1-71.4.10結(jié)構(gòu)體匯編語(yǔ)言中的結(jié)構(gòu)體和共用體與C語(yǔ)言中的基本類(lèi)似。結(jié)構(gòu)體的定義格式如下:名字struct成員列表名字ends例如(windows?inc文件中包含以下結(jié)構(gòu)):COORDSTRUCTxWORDyWORDCOORDENDSSYSTEMTIMESTRUCTWYearWORD?;年(4位)WMonthWORD?;月(1~12)WDayOfWeekWORD?;星期(0~6)0=星期天,1=星期一...wDayWORD?;日(1~31)wHourWORD?;時(shí)(0~23)wMinuteWORD?;分(0~59)wSecondWORD?;秒(0~59)wMillisecondsWORD?;毫秒(0~999)SYSTEMTIMEENDS;ex8.asm(e:\masm\base)結(jié)構(gòu)體應(yīng)用示例。.386.modelflat,stdcalloptioncasemap:noneincludewindows.incincludekernel32.incincludelibincludeincludelibkernel32.libuser32.incuser32.lib;windows.inc文件中有定義.data;COORDSTRUCT;xWORD;;windows.inc文件中有定義bufferdb80dup(0)CapMsgdb'輸出',0szFmtdb'stPos.x的和=%d,stPos.y的和=%d',0stPos1stPos2stPos3stPos4stPos1stPos2stPos3stPos4COORDCOORDCOORDCOORD<4,8><>{2,4}{,40};定義結(jié)構(gòu)體變量并初始化;定義結(jié)構(gòu)體變量(取結(jié)構(gòu)體原初始值);定義結(jié)構(gòu)體變量并初始化;定義結(jié)構(gòu)體變量并初始化;;定義結(jié)構(gòu)體數(shù)組stPosCOORD10dup(<0,0>).codestart:movstPos2.x,10 ;域的使用movstPos2.y,20movecx,10movedi,offsetstPos ;edi指向結(jié)構(gòu)體變量moveax,1movebx,11@@:mov(COORDptr[edi]).x,axmov(COORDptr[edi]).y,bxaddedi,typeCOORD ;結(jié)構(gòu)體的大小incaxincbxloopshort@Bxoreax,eaxxorebx,ebxmovecx,10movedi,offsetstPos ;edi指向結(jié)構(gòu)體變量@@:addax,(COORDptr[edi]).xaddbx,(COORDptr[edi]).y;;結(jié)構(gòu)體的大小addedi,typeCOORDloopshort@Binvokewsprintf,addrbuffer,addrszFmt,;格式化信息串;信息串格式化后的存放地;信息串的格式eax,ebxinvokeMessageBox,;顯示信息框invokeMessageBox,;顯示信息框NULL,;父窗口句柄offsetbuffer,;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版星巴克加盟店設(shè)備維護(hù)合同
- 個(gè)人影視作品版權(quán)轉(zhuǎn)讓合同(2024版)3篇
- 2024示范文本:二手車(chē)買(mǎi)賣(mài)合同車(chē)輛安全檢測(cè)規(guī)范2篇
- 2024試乘試駕活動(dòng)電子合同范本12篇
- 2025年度二手吊車(chē)評(píng)估與交易中介合同3篇
- 項(xiàng)目建議書(shū)(含設(shè)計(jì)任務(wù)書(shū))及可行性研究報(bào)告編制技術(shù)咨詢(xún)合同模板
- 2025年度碼頭船舶??颗c貨物倉(cāng)儲(chǔ)一體化租賃合同4篇
- 2025年度臨時(shí)醫(yī)療護(hù)理人員派遣服務(wù)合同4篇
- 2025年稅務(wù)顧問(wèn)服務(wù)合同協(xié)議書(shū)適用于企業(yè)集團(tuán)6篇
- 眾維重工2025年度鋼結(jié)構(gòu)建筑工程智能化控制系統(tǒng)采購(gòu)合同2篇
- 《穿越迷宮》課件
- 《C語(yǔ)言從入門(mén)到精通》培訓(xùn)教程課件
- 2023年中國(guó)半導(dǎo)體行業(yè)薪酬及股權(quán)激勵(lì)白皮書(shū)
- 2024年Minitab全面培訓(xùn)教程
- 社區(qū)電動(dòng)車(chē)棚新(擴(kuò))建及修建充電車(chē)棚施工方案(純方案-)
- 項(xiàng)目推進(jìn)與成果交付情況總結(jié)與評(píng)估
- 鐵路項(xiàng)目征地拆遷工作體會(huì)課件
- 醫(yī)院死亡報(bào)告年終分析報(bào)告
- 建設(shè)用地報(bào)批服務(wù)投標(biāo)方案(技術(shù)方案)
- 工會(huì)工作人年度考核個(gè)人總結(jié)
- 上海民辦楊浦實(shí)驗(yàn)學(xué)校初一新生分班(摸底)語(yǔ)文考試模擬試卷(10套試卷帶答案解析)
評(píng)論
0/150
提交評(píng)論