汇编语言-015(PROC伪指令定义参数方式、EXTERNDEF、INCLUDE 、EXTERN 、INVOKE、PROC、PROTO 、MOVSB 、MOVSD 、CMPSD )
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                汇编语言-015(PROC伪指令定义参数方式、EXTERNDEF、INCLUDE 、EXTERN 、INVOKE、PROC、PROTO 、MOVSB 、MOVSD 、CMPSD )
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                1:使用PROC偽指令定義參數(shù)方式不通過寄存器傳參,計(jì)算數(shù)組之和
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array DWORD 10000h,20000h,30000h,40000h,50000h theSum DWORD ?.code ArraySum PROC USES esi ecx,ptrArray:PTR DWORD,szArray:DWORDmov esi,ptrArraymov ecx,szArraymov eax,0cmp ecx,0je L2 L1:add eax,[esi]add esi,4loop L1 L2:ret ArraySum ENDPmain PROCINVOKE ArraySum,ADDR array, ;數(shù)組地址LENGTHOF array;元素個數(shù)mov theSum,eax;保存和數(shù)INVOKE ExitProcess,0 main ENDP END main2:使用PROC偽指令定義參數(shù)方式不通過寄存器傳參,交換兩個值
include Irvine32.incSwap PROTO,pValx:PTR DWORD ,pValy:PTR DWORD .data Array DWORD 10000h,20000h.code main PROC;顯示交換前的數(shù)組mov esi,OFFSET Arraymov ecx ,2mov ebx,TYPE Arraycall DumpMemINVOKE Swap,ADDR Array,ADDR[Array + 4]call DumpMemexit main ENDPSwap PROC USES eax esi edi,pValx:PTR DWORD,pValy:PTR DWORDmov esi,pValxmov edi,pValymov eax,[esi]xchg eax,[edi]mov [esi],eaxret Swap ENDP END main3:EXTERNDEF_INCLUDE : EXTERNDEF和INCLUDE偽指令,跨模塊使用變量和標(biāo)號
vars.inc
EXTERNDEF count:DWORD , SYM1:ABSsub1.asm
.386 .model flat,stdcall include vars.incSYM1 = 10 .data count DWORD 0 ENDmain.asm
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORDinclude vars.inc .code main PROCmov count,2000hmov eax,SYM1INVOKE ExitProcess,0 main ENDP END main4:EXTERN : 用EXTERN偽指令,多模塊編寫過程調(diào)用,傳統(tǒng)的使用
ArraySum.asm
;ArraySum過程 include Irvine32.inc.code ;計(jì)算32位整數(shù)數(shù)組之和 ;接收: ; ptrArray ;數(shù)組指針 ; arraySize;數(shù)組大小(DWORD) ;返回:EAX = 和數(shù) ArraySum PROCptrArray EQU [ebp+8]arraySize EQU [ebp+12]enter 0,0push ecx push esimov eax,0mov esi,ptrArraymov ecx,arraySizecmp ecx,0jle L2 L1:add eax,[esi]add esi,4loop L1 L2:pop esipop ecxleaveret 8 ArraySum ENDP ENDDisplaySum.asm
;DisplaySum include Irvine32.inc.code ;在控制臺顯示和數(shù) ;接收: ; ptrPrompt ;提示字符串的偏移量 ; theSum ;數(shù)組和數(shù)(DWORD) ;返回:無 DisplaySum PROCtheSum EQU [ebp+12]ptrPrompt EQU [ebp+8]enter 0,0push eaxpush edxmov edx,ptrPromptcall WriteStringmov eax,theSumcall WriteIntcall Crlfpop edxpop eaxleaveret 8 DisplaySum ENDP ENDPromptForIntegers.asm
;提示整數(shù)輸入 include Irvine32.inc.code ;提示用戶為數(shù)組輸入整數(shù),并用用戶輸入填充數(shù)組 ;接收: ; ptrPrompt:PTR BYTE ;提示信息字符串 ; ptrArray:PTR DWORD ;數(shù)組指針 ; arraySize:DWORD ;數(shù)組大小 ;返回:無 PromptForIntegers PROCarraySize EQU [ebp+16]ptrArray EQU [ebp+12]ptrPrompt EQU [ebp+8]enter 0,0pushad mov ecx,arraySizecmp ecx,0jle L2mov edx,ptrPromptmov esi,ptrArray L1:call WriteStringcall ReadIntcall Crlfmov [esi],eaxadd esi,4loop L1 L2:popadleaveret 12 PromptForIntegers ENDP ENDStartup.asm
;整數(shù)求和過程 ;多模塊示例 ;本程序由用戶輸入多個整數(shù) ;將它們存入數(shù)組,計(jì)算數(shù)組之和 ;并顯示和數(shù) include Irvine32.incEXTERN PromptForIntegers@0:PROC EXTERN ArraySum@0:PROC , DisplaySum@0:PROC;為了方便,重新定義外部符號 ArraySum EQU ArraySum@0 PromptForIntegers EQU PromptForIntegers@0 DisplaySum EQU DisplaySum@0 ;修改Count來改變數(shù)組大小 Count = 3.data prompt1 BYTE "Enter a signed integers: ",0 prompt2 BYTE "The sum of the integers is: ",0 array DWORD Count DUP(?) sum DWORD ?.code main PROCcall Clrscr;PromptForIntegers(addr prompt1,addr array,Count)push Countpush OFFSET arraypush OFFSET prompt1call PromptForIntegers;sum = ArraySum(addr array,Count)push Countpush OFFSET arraycall ArraySummov sum,eax;DisplaySum(addr prompt2,sum)push sumpush OFFSET prompt2call DisplaySumcall Crlfexit main ENDP END main5:INVOKE_PROC_PROTO : 使用INVOKE和PROC和PROTO更高級的來進(jìn)行多模塊編程,相比EXTERN簡化很多細(xì)節(jié)
arraySum.am
;ArraySum 過程 include sum.inc.code ArraySum PROC,ptrArray:PTR DWORD, ;數(shù)組指針arraySize:DWORD ;數(shù)組大小 ;計(jì)算32位整數(shù)數(shù)組之和 ;返回:EAX = 和數(shù)push ecx push esimov eax,0mov esi,ptrArraymov ecx,arraySizecmp ecx,0jle L2 L1:add eax,[esi]add esi,4loop L1 L2:pop esipop ecxret ArraySum ENDP ENDdisplay.asm
;Display過程 include sum.inc.code DisplaySum PROC,ptrPrompt:PTR BYTE, ;提示字符串theSum:DWORD ;數(shù)組之和 ; ;在控制臺顯示和數(shù) ;返回:無push eaxpush edxmov edx,ptrPrompt call WriteStringmov eax,theSumcall WriteIntcall Crlfpop edxpop eaxret DisplaySum ENDP ENDprompt.asm
;提示整數(shù)輸入請求 include sum.inc ;獲取過程.code PromptForIntegers PROC,ptrPrompt:PTR BYTE, ;提示字符串ptrArray:PTR DWORD, ;數(shù)組指針arraySize:DWORD ;數(shù)組大小;提示用戶輸入數(shù)組幸免于難,并用用戶輸入填充數(shù)組;返回:無pushad mov ecx,arraySizecmp ecx,0jle L2mov edx,ptrPromptmov esi,ptrArray L1:call WriteStringcall ReadIntcall Crlfmov [esi],eaxadd esi,4loop L1 L2:popadret PromptForIntegers ENDP ENDsum.inc
include Irvine32.incPromptForIntegers PROTO,ptrPrompt:PTR BYTE , ;提示字符串ptrArray:PTR DWORD, ;數(shù)組指針arraySize:DWORD ;數(shù)組大小ArraySum PROTO,ptrArray:PTR DWORD, ;數(shù)組指針arraySize:DWORD ;數(shù)組大小DisplaySum PROTO,ptrPrompt:PTR BYTE, ;提示字符串theSum:DWORD ;數(shù)組之和sum_main.asm
;整數(shù)求和 include sum.inc Count = 3 .data prompt1 BYTE "Enter a signed integers: ",0 prompt2 BYTE "The sum of the integers is: ",0 array DWORD Count DUP(?) sum DWORD ?.code main PROCcall ClrscrINVOKE PromptForIntegers,ADDR prompt1,ADDR array,CountINVOKE ArraySum,ADDR array,Countmov sum,eaxINVOKE DisplaySum,ADDR prompt2,sumcall Crlfexit main ENDP END main6:使用LOCAL 定義一系列局部變量
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCcall Proc_1INVOKE ExitProcess,0 main ENDPProc_1 PROCLOCAL pArray:PTR DWORD,buffer[20]:BYTE,pwArray:WORD,myByte:SBYTE,myArray[20]:DWORDret Proc_1 ENDPEND main7:編寫過程ShowParams,顯示過程參數(shù)。顯示被調(diào)用過程運(yùn)行時堆棧中32位參數(shù)的地址和十六進(jìn)制數(shù)值 過程接收一個參數(shù),表示顯示參數(shù)的個數(shù)
include Irvine32.inc.stack 4096 ExitProcess PROTO,dwExitCode:DWORD MySample PROTO ,first:DWORD,second:DWORD,third:DWORD.data outAddr BYTE "Address ",0 outEqule BYTE " = ",0 .code main PROCINVOKE MySample,1234h,5000h,6543hINVOKE ExitProcess,0 main ENDPMySample PROC ,first:DWORD,second:DWORD,third:DWORDparamCount = 3push paramCount ;顯示MySample中的三個參數(shù)call ShowParamsret MySample ENDPShowParams PROC arg1 EQU [ebp+8]enter 0,0push ecxpush esipush edxmov ecx,arg1mov esi,[ebp]add esi,8 L1:mov edx,OFFSET outAddrcall WriteStringmov eax,esicall WriteHexmov edx,OFFSET outEqulecall WriteStringmov eax,[esi]call WriteHexcall Crlfadd esi,4loop L1pop edxpop esipop ecxleaveret 4 ShowParams ENDP END main8:MOVSB : (字節(jié))從ESI的尋址的內(nèi)存數(shù)據(jù)復(fù)制到EDI尋址的內(nèi)存位置,加上rep 重復(fù)操作
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data string1 BYTE "ABCDEFGHIJKLMN",0 string2 BYTE "abcdefghijklmn",0.code main PROCcld ;清除方向標(biāo)志位mov esi,OFFSET string1 ;esi 指向源mov edi,OFFSET string2 ;edi 指向目的mov ecx,10 ;計(jì)數(shù)器為10rep movsb ;傳送10個字節(jié)INVOKE ExitProcess,0 main ENDP END main9:MOVSD : (雙字)從ESI的尋址的內(nèi)存數(shù)據(jù)復(fù)制到EDI尋址的內(nèi)存位置,加上rep 重復(fù)操作
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data source DWORD 20 DUP(0FFFFFFFFh) target DWORD 20 DUP(?).code main PROCcld ;清除方向標(biāo)志位mov esi,OFFSET source ;esi 指向源mov edi,OFFSET target ;edi 指向目的mov ecx,LENGTHOF source ;計(jì)數(shù)器為10rep movsd ;傳送10個字節(jié)INVOKE ExitProcess,0 main ENDP END main10:CMPSD : (雙字)比較ESI指向的內(nèi)存操作數(shù)與EDI指向的內(nèi)存操作數(shù)
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwEixtCode:DWORD.data source DWORD 1234h target DWORD 5678h.code main PROCmov esi, OFFSET sourcemov edi,OFFSET targetcldcmpsd ;比較雙字ja L1 ;若source>target則跳轉(zhuǎn) L1:mov esi ,OFFSET sourcemov edi,OFFSET targetcldmov ecx , LENGTHOF source ;設(shè)置重復(fù)計(jì)數(shù)器repe cmpsd ;相等則重復(fù)INVOKE ExitProcess,0 main ENDP END main總結(jié)
以上是生活随笔為你收集整理的汇编语言-015(PROC伪指令定义参数方式、EXTERNDEF、INCLUDE 、EXTERN 、INVOKE、PROC、PROTO 、MOVSB 、MOVSD 、CMPSD )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 车牌要多少钱啊?
- 下一篇: c1报名费多少钱啊?
