汇编语言-006(数组操作 、字符串应用、PUSHFD_POPFD 、PUSHAD_POPAD 、 子程序 函数、 USES 、 INC_DEC )
生活随笔
收集整理的這篇文章主要介紹了
汇编语言-006(数组操作 、字符串应用、PUSHFD_POPFD 、PUSHAD_POPAD 、 子程序 函数、 USES 、 INC_DEC )
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1: 計算斐波那契數(shù)列前7個數(shù)值之和
.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: 數(shù)組反向,使用TYPE,LENGTHOF運(yùn)行符和 TEXTEQU偽指令來應(yīng)對往后程序的數(shù)值大小和類型可能變化的情況
.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: 將字符串復(fù)制相反順序到另一個字符串
.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: 數(shù)組元素移位,數(shù)組[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 : 將標(biāo)識寄存器入棧出棧
.386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data saveFlags DWORD ?.code main PROCpushfd ;標(biāo)識寄存器內(nèi)容入棧pop saveFlags ;復(fù)制給一個變量push saveFlags ;被保存的標(biāo)識入棧popfd ;復(fù)制給標(biāo)識寄存器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 ;保存通用寄存器的內(nèi)容 eax,ecx,edx,ebx,esp,ebp,esi,edi順序;mov eax,0 ;如果有返回值在eax中后面就要注意用popad了popad ;反順序出棧INVOKE ExitProcess,0 main ENDP END main7: 運(yùn)用棧將字符串反轉(zhuǎn)
.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數(shù)組mov ecx,nameSizemov esi,0 L2:pop eax ;獲取字符mov aName[esi],al;存入字符串inc esiloop L2INVOKE ExitProcess,0 main ENDP END main8: 創(chuàng)建過程(子程序,函數(shù))進(jìn)行數(shù)組求和
.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指向數(shù)組mov ecx,LENGTHOF array ;數(shù)組計數(shù)器call ArraySum ;計算和數(shù)mov theSum,eax ;取返回的和數(shù)INVOKE ExitProcess,0 main ENDP;ArraySum ;計算32位整數(shù)數(shù)組之和 ;接收:ESI = 數(shù)組偏移量 ; ECX = 數(shù)組元素的個數(shù) ;返回 EAX = 數(shù)組元素之和ArraySum PROCpush esipush ecx ;保存esi和ecxmov eax,0 L1:add eax,[esi] ;將每個整數(shù)與和數(shù)相加add esi,TYPE DWORD ;指向下一個整數(shù)loop L1 ;按照數(shù)組大小重復(fù)pop ecx ;恢復(fù)ecx和esipop esiret ;返回調(diào)用片 ArraySum ENDP END main9: USES : USES偽指令告訴匯編器,在過程開始時生成PUSH寄存器指令,在結(jié)束時生成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指向數(shù)組mov ecx,LENGTHOF array ;數(shù)組計數(shù)器call ArraySum ;計算和數(shù)mov theSum,eax ;取返回的和數(shù)INVOKE ExitProcess,0 main ENDP;ArraySum ;計算32位整數(shù)數(shù)組之和 ;接收:ESI = 數(shù)組偏移量 ; ECX = 數(shù)組元素的個數(shù) ;返回 EAX = 數(shù)組元素之和ArraySum PROC USES esi ecx;匯編器會生成將這兩個寄存器入棧的指令; push esi; push ecx ;保存esi和ecxmov eax,0 L1:add eax,[esi] ;將每個整數(shù)與和數(shù)相加add esi,TYPE DWORD ;指向下一個整數(shù)loop L1 ;按照數(shù)組大小重復(fù);匯編器會生成將這兩個寄存器出棧的指令;pop ecx ;恢復(fù)ecx和esi;pop esiret ;返回調(diào)用片 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總結(jié)
以上是生活随笔為你收集整理的汇编语言-006(数组操作 、字符串应用、PUSHFD_POPFD 、PUSHAD_POPAD 、 子程序 函数、 USES 、 INC_DEC )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rtmp流\http流测试地址
- 下一篇: 灵芝孢子粉多少钱一斤啊?