ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

汇编语言-006(数组操作 、字符串应用、PUSHFD_POPFD 、PUSHAD_POPAD 、 子程序 函数、 USES 、 INC_DEC )

2020-12-25 13:05:56  阅读:336  来源: 互联网

标签:POPFD DEC mov ExitProcess DWORD main 子程序 esi ecx


1:
计算斐波那契数列前7个数值之和

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data

.code
main PROC
    mov esi,1
	mov edi,1
	mov eax,2
	mov ecx,5
L1: 
	mov ebx,esi
	add ebx,edi
	mov esi,edi
	mov edi,ebx
	add eax,ebx
	loop L1
	INVOKE ExitProcess,0
main ENDP
END main

2:
数组反向,使用TYPE,LENGTHOF运行符和 TEXTEQU伪指令来应对往后程序的数值大小和类型可能变化的情况

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

tempReg TEXTEQU <eax>
.data
List DWORD 1,2,3,4,5

.code
main PROC
    mov ecx,LENGTHOF List /2
	mov esi,0
	mov edi,LENGTHOF List - 1
L1:
	mov tempReg,List[esi * TYPE List]
	xchg tempReg,List[edi * TYPE List]
	mov List[esi * TYPE List],tempReg
	inc esi
	dec edi
	loop L1
	INVOKE ExitProcess,0
main ENDP
END main

3:
将字符串复制相反顺序到另一个字符串

.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 PROC
   mov target[SIZEOF target -1],0
   mov esi,SIZEOF target - 2
   mov edi,0
   mov ecx,SIZEOF target - 1
L1:   
   mov al,source[esi]
   mov target[edi],al
   dec esi
   inc edi
   loop L1
   INVOKE ExitProcess,0
main ENDP
END main

4:
数组元素移位,数组[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 PROC
   mov esi,LENGTHOF dwordList - 1
   mov ecx,esi
   mov ebx,dwordList[esi * TYPE dwordList]
   dec esi
L1:
   mov edi,dwordList[esi * TYPE dwordList]
   inc esi
   mov dwordList[esi * TYPE dwordList],edi
   sub esi,2
   loop L1
   mov dwordList,ebx
   INVOKE ExitProcess,0
main ENDP
END main

5:
PUSHFD_POPFD : 将标识寄存器入栈出栈

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
saveFlags DWORD ?

.code
main PROC
    pushfd          ;标识寄存器内容入栈
	pop saveFlags   ;复制给一个变量
	push saveFlags  ;被保存的标识入栈
	popfd           ;复制给标识寄存器
    INVOKE ExitProcess,0
main ENDP
END main
    

6:
PUSHAD_POPAD : 将通用寄存器入栈和反顺序出栈,顺序:eax,ecx,edx,ebx,esp,ebp,esi,edi

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.code
main PROC
    pushad   ;保存通用寄存器的内容 eax,ecx,edx,ebx,esp,ebp,esi,edi顺序

	;mov eax,0 ;如果有返回值在eax中后面就要注意用popad了

	popad ;反顺序出栈
	INVOKE ExitProcess,0
main ENDP
END main

7:
运用栈将字符串反转

.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
aName BYTE "Abraham Lincoln",0
nameSize = ($ - aName) - 1

.code
main PROC
     ;将名字压入栈
	 mov ecx,nameSize
	 mov esi,0
L1:
    movzx eax,aName[esi] ;获取字符
	push eax              ;压入栈
	inc esi
	loop L1
	;将名字按逆序弹出栈
	;并存入aName数组
	mov ecx,nameSize
	mov esi,0
L2:
    pop eax          ;获取字符
	mov aName[esi],al;存入字符串
	inc esi
	loop L2

	INVOKE ExitProcess,0
main ENDP
END main

8:
创建过程(子程序,函数)进行数组求和

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwEixtCode:DWORD

.data
array DWORD 10000h,20000h,30000h,40000h,50000h
theSum DWORD ?

.code
main PROC
    mov 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
       push esi
	   push ecx   ;保存esi和ecx
	   mov eax,0 
L1:
       add eax,[esi] ;将每个整数与和数相加
	   add esi,TYPE DWORD ;指向下一个整数
	   loop L1          ;按照数组大小重复
	   pop ecx      ;恢复ecx和esi
	   pop esi
	   ret     ;返回调用片
ArraySum ENDP
END main


9:
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 PROC
    mov 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和ecx

	   mov eax,0 
L1:
       add eax,[esi] ;将每个整数与和数相加
	   add esi,TYPE DWORD ;指向下一个整数
	   loop L1          ;按照数组大小重复

	   ;汇编器会生成将这两个寄存器出栈的指令
	  ;pop ecx      ;恢复ecx和esi
	  ;pop esi
	   ret     ;返回调用片
ArraySum ENDP
END main

10:
INC_DEC : INC 伪指令自增,DEC伪指令自减

.386
.model flat,stdcall

.stack 4096
ExitProcess PROTO,dwExitCode:DWORD

.data
myWord WORD 1000h

.code
main PROC
    inc myWord
	mov bx,myWord
	dec bx
	INVOKE ExitProcess,0
main ENDP
END main

标签:POPFD,DEC,mov,ExitProcess,DWORD,main,子程序,esi,ecx
来源: https://blog.csdn.net/m0_37599645/article/details/111671868

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有