汇编语言-006(数组操作 、字符串应用、PUSHFD_POPFD 、PUSHAD_POPAD 、 子程序 函数、 USES 、 INC_DEC )
生活随笔
收集整理的這篇文章主要介紹了
汇编语言-006(数组操作 、字符串应用、PUSHFD_POPFD 、PUSHAD_POPAD 、 子程序 函数、 USES 、 INC_DEC )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1: 計算斐波那契數列前7個數值之和
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data.code main PROCmov esi,1mov edi,1mov eax,2mov ecx,5 L1: mov ebx,esiadd ebx,edimov esi,edimov edi,ebxadd eax,ebxloop L1INVOKE ExitProcess,0 main ENDP END main2: 數組反向,使用TYPE,LENGTHOF運行符和 TEXTEQU偽指令來應對往后程序的數值大小和類型可能變化的情況
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORDtempReg TEXTEQU <eax> .data List DWORD 1,2,3,4,5.code main PROCmov ecx,LENGTHOF List /2mov esi,0mov edi,LENGTHOF List - 1 L1:mov tempReg,List[esi * TYPE List]xchg tempReg,List[edi * TYPE List]mov List[esi * TYPE List],tempReginc esidec ediloop L1INVOKE ExitProcess,0 main ENDP END main3: 將字符串復制相反順序到另一個字符串
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data source BYTE "This is the source string",0 target BYTE SIZEOF source DUP('#').code main PROCmov target[SIZEOF target -1],0mov esi,SIZEOF target - 2mov edi,0mov ecx,SIZEOF target - 1 L1: mov al,source[esi]mov target[edi],aldec esiinc ediloop L1INVOKE ExitProcess,0 main ENDP END main4: 數組元素移位,數組[10,20,30,40]移位后為[40,10,20,30]
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data dwordList DWORD 10,20,30,40.code main PROCmov esi,LENGTHOF dwordList - 1mov ecx,esimov ebx,dwordList[esi * TYPE dwordList]dec esi L1:mov edi,dwordList[esi * TYPE dwordList]inc esimov dwordList[esi * TYPE dwordList],edisub esi,2loop L1mov dwordList,ebxINVOKE ExitProcess,0 main ENDP END main5: PUSHFD_POPFD : 將標識寄存器入棧出棧
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data saveFlags DWORD ?.code main PROCpushfd ;標識寄存器內容入棧pop saveFlags ;復制給一個變量push saveFlags ;被保存的標識入棧popfd ;復制給標識寄存器INVOKE ExitProcess,0 main ENDP END main6: PUSHAD_POPAD : 將通用寄存器入棧和反順序出棧,順序:eax,ecx,edx,ebx,esp,ebp,esi,edi
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.code main PROCpushad ;保存通用寄存器的內容 eax,ecx,edx,ebx,esp,ebp,esi,edi順序;mov eax,0 ;如果有返回值在eax中后面就要注意用popad了popad ;反順序出棧INVOKE ExitProcess,0 main ENDP END main7: 運用棧將字符串反轉
.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data aName BYTE "Abraham Lincoln",0 nameSize = ($ - aName) - 1.code main PROC;將名字壓入棧mov ecx,nameSizemov esi,0 L1:movzx eax,aName[esi] ;獲取字符push eax ;壓入棧inc esiloop L1;將名字按逆序彈出棧;并存入aName數組mov ecx,nameSizemov esi,0 L2:pop eax ;獲取字符mov aName[esi],al;存入字符串inc esiloop L2INVOKE ExitProcess,0 main ENDP END main8: 創建過程(子程序,函數)進行數組求和
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwEixtCode:DWORD.data array DWORD 10000h,20000h,30000h,40000h,50000h theSum DWORD ?.code main PROCmov esi,OFFSET array ;esi指向數組mov ecx,LENGTHOF array ;數組計數器call ArraySum ;計算和數mov theSum,eax ;取返回的和數INVOKE ExitProcess,0 main ENDP;ArraySum ;計算32位整數數組之和 ;接收:ESI = 數組偏移量 ; ECX = 數組元素的個數 ;返回 EAX = 數組元素之和ArraySum PROCpush esipush ecx ;保存esi和ecxmov eax,0 L1:add eax,[esi] ;將每個整數與和數相加add esi,TYPE DWORD ;指向下一個整數loop L1 ;按照數組大小重復pop ecx ;恢復ecx和esipop esiret ;返回調用片 ArraySum ENDP END main9: USES : USES偽指令告訴匯編器,在過程開始時生成PUSH寄存器指令,在結束時生成POP寄存器指令(可以查看反匯編窗口)
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwEixtCode:DWORD.data array DWORD 10000h,20000h,30000h,40000h,50000h theSum DWORD ?.code main PROCmov esi,OFFSET array ;esi指向數組mov ecx,LENGTHOF array ;數組計數器call ArraySum ;計算和數mov theSum,eax ;取返回的和數INVOKE ExitProcess,0 main ENDP;ArraySum ;計算32位整數數組之和 ;接收:ESI = 數組偏移量 ; ECX = 數組元素的個數 ;返回 EAX = 數組元素之和ArraySum PROC USES esi ecx;匯編器會生成將這兩個寄存器入棧的指令; push esi; push ecx ;保存esi和ecxmov eax,0 L1:add eax,[esi] ;將每個整數與和數相加add esi,TYPE DWORD ;指向下一個整數loop L1 ;按照數組大小重復;匯編器會生成將這兩個寄存器出棧的指令;pop ecx ;恢復ecx和esi;pop esiret ;返回調用片 ArraySum ENDP END main10: INC_DEC : INC 偽指令自增,DEC偽指令自減
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data myWord WORD 1000h.code main PROCinc myWordmov bx,myWorddec bxINVOKE ExitProcess,0 main ENDP END main總結
以上是生活随笔為你收集整理的汇编语言-006(数组操作 、字符串应用、PUSHFD_POPFD 、PUSHAD_POPAD 、 子程序 函数、 USES 、 INC_DEC )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rtmp流\http流测试地址
- 下一篇: 汇编语言-007(ADD_SUB_NEG