汇编语言-014(编写过程的应用、伪指令LEA、ENTER、LEAVE、LOCAL、递归函数、INVOKE、ADDR、PROC伪指令声明过程)
生活随笔
收集整理的這篇文章主要介紹了
汇编语言-014(编写过程的应用、伪指令LEA、ENTER、LEAVE、LOCAL、递归函数、INVOKE、ADDR、PROC伪指令声明过程)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1:編寫過程,僅用移位和加法,實現任意32位符號數與EAX相乘
include Irvine32.inc.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROC mov eax,80mov ebx,53call BitwiseMultiplycall WriteDecINVOKE ExitProcess,0 main ENDP;EAX=被乘數,EBX=乘數 BitwiseMultiply PROCmov edx,0mov ecx,32 L0:shl ebx,1jnc L1push ecxdec ecxpush eaxshl eax,cladd edx,eaxpop eaxpop ecx L1:loop L0mov eax,edxret BitwiseMultiply ENDPEND main2:編寫過程,實現任意兩個大小(但兩個數字節要一樣長)的壓縮十進制數加法
include Irvine32.inc.stack 4096 ExitProcess PROTO,dwExitCode:DWORDbyteSize = 4 .data packed_1 BYTE 36h,45h,87h,99h packed_2 BYTE 72h,07h,23h,45h sum BYTE byteSize+1 DUP(0).code main PROCmov esi,OFFSET packed_1mov edi,OFFSET packed_2mov edx,OFFSET summov ecx,byteSizecall AddPackedINVOKE ExitProcess,0 main ENDP;ESI 第一個數的指針 ;EDI 第二個數的指針 ;EDX 和數指針 ;ECX 相加的字節數 AddPacked PROCclc L0:mov al,BYTE PTR[esi]adc al,BYTE PTR[edi]daamov BYTE PTR[edx],alinc esiinc ediinc edxloop L0mov al,0adc al,0mov BYTE PTR[edx],alret AddPacked ENDP END main3:LEA : 偽指令LEA使用
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCINVOKE ExitProcess,0 main ENDP;void makeArray() ;{ ; char myString[30]; ; for(int i =0;i<30;i++) ; myString[i]='*'; ;} makeArray PROCpush ebpmov ebp,espsub esp,32 ;myString位于EBP-30的位置,因為會向4字節對齊lea esi,[ebp-30] ;加載myString的地址;mov esi,OFFSET[ebp -30] 報錯,OFFSET只適用編譯時已知地址mov ecx,30 ;循環計數器 L1:mov BYTE PTR[esi],'*' ;填充inc esi ;下一個元素loop L1 add esp,32 ;刪除數組(恢復ESP)pop ebpret makeArray ENDP END main4:ENTER_LEAVE : ENTER創建一個過程的堆棧幀,LEAVE結束一個過程的堆棧幀
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCINVOKE ExitProcess,0 main ENDPMySub PROCenter 8,0 ;保留8個字節局部變量;等于;push ebp;mov ebp,esp;sub esp,8 leave;等于;mov esp,ebp;pop ebpret MySub ENDP END main5:LOCAL : 為ENTER和LEAVE的高級版,可以定義局部變量類型與名字,跟在PROC后使用 LOCAL label:type ,…
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCcall Example1INVOKE ExitProcess,0 main ENDPExample1 PROCLOCAL temp:DWORDmov eax,tempret Example1 ENDP;生成匯編是下面這樣,可以查看反匯編 ;push ebp ;mov ebp,esp ;add esp,0FFFFFFFCh ;ESP加-4 ;mov eax,[ebp-4] ;leave ;ret END main6:遞歸函數,整數求和
include Irvine32.inc.code main PROCmov ecx,5 ;計數值=5mov eax,0 ;存放和數call CalcSum;計算和數call WriteDeccall Crlfexit main ENDPCalcSum PROCcmp ecx,0 ;檢查計數值jz L2 ;若為零則退出add eax,ecx ;否則與和數相加dec ecx ;計數值遞減call CalcSum;遞歸調用 L2: ret CalcSum ENDP END main7:遞歸函數,階乘
include Irvine32.inc.code main PROCpush 5 ;計算5!call Factorial ;計算階乘(EAX)call WriteDeccall Crlfexit main ENDP;計算階乘 ;接收:[ebp+8]=n 需計算的數 ;返回:eax =n 階乘 Factorial PROCpush ebpmov ebp,espmov eax,[ebp+8] ;獲取Ncmp eax,0ja L1mov eax,1jmp L2L1:dec eaxpush eaxcall Factorial ;每次遞歸調用返回時,都要執行下面的指令 ReturnFact:mov ebx,[ebp+8]mul ebx ;EDX:EAX = EAX*EBX L2:pop ebp ;返回EAXret 4 ;清除堆棧 Factorial ENDP END main8:INVOKE_ADDR : 調用指令INVOKE 與 地址指令ADDR
.386 .model flat,stdcall.stack ExitProcess PROTO,dwExitCode:DWORD.data Array DWORD 20 DUP(?).code main PROC;INVOKE Swap,ADDR Array,ADDR [Array+4] ;ADDR只能與INVOKE使用,也能是匯編常數;如果是使用stdcall,匯編器生成下面代碼;push OFFSET Array+4;push OFFSET Array;call SwapINVOKE ExitProcess,0 main ENDPSwap PROCret Swap ENDP END main9:PROC偽指令聲明過程時,聲明要接收的參數方式
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCpush 9push 10call AddTwoINVOKE ExitProcess,0 main ENDPAddTwo PROC,val1:DWORD,val2:DWORDmov eax,val1add eax,val2ret AddTwo ENDP ;匯編器生成代碼。因為是stdcall ret加上8 ,可以查看反匯編 ;push ebp ;mov ebp,esp ;mov eax,dword ptr[ebp+8] ;add eax,dword ptr[ebp+0ch] ;leave ;ret 8END main10:PROC偽指令聲明過程時,聲明要接收的參數方式和局部變量
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCINVOKE ExitProcess,0 main ENDPRead_File PROC USES eax ebx,pBuffer:PTR BYTELOCAL fileHandle:DWORDmov esi,pBuffermov fileHandle,eaxret Read_File ENDP ;匯編器生成代碼 ;push ebp ;mov ebp,esp ;add esp,0FFFFFFFCh ;創建fileHandle ;push eax ;保存eax ;push ebx ;mov esi,dword ptr[ebp+8] ;pBuffer ;mov dword ptr[ebp-4],eax ;fileHandle ;pop ebx ;pop eax ;leave ;ret 4 有一個參數4字節 END main總結
以上是生活随笔為你收集整理的汇编语言-014(编写过程的应用、伪指令LEA、ENTER、LEAVE、LOCAL、递归函数、INVOKE、ADDR、PROC伪指令声明过程)的全部內容,希望文章能夠幫你解決所遇到的問題。