汇编语言示例:整数数组求和
程序员在 C++ 或 Java 中编写过的非常常见的循环类型是计算整数数组之和。这在汇编语言中很容易实现,它可以被编码为按照尽可能快的方式来运行。比如,在循环内可以使用寄存器而非变量。
现在创建一个过程 ArraySum,从一个调用程序接收两个参数:一个指向 32 位整数数组的指针,以及一个数组元素个数的计数器。该过程计算和数,并用 EAX 返回数组之和:
现在创建一个过程 ArraySum,从一个调用程序接收两个参数:一个指向 32 位整数数组的指针,以及一个数组元素个数的计数器。该过程计算和数,并用 EAX 返回数组之和:
;------------------------------------ ;ArraySum ;计算32位整数数组元素之和 ;接收:ESI = 数组偏移量 ; ECX = 数组元素的个数 ;返回:EAX = 数组元素之和 ;------------------------------------- ArraySum PROC push esi ;保存ESI和ECX push ecx mov eax,0 ;设置和数为0 L1: add eax,[esi] ;将每个整数与和数相加 add esi,TYPE DWORD ;指向下一个整数 loop L1 ;按照数组大小重复 pop ecx ;恢复ECX和ESI pop esi ret ;和数在EAX中 ArraySum ENDP这个过程没有特别指定数组名称和大小,它可以用于任何需要计算32位整数数组之和的程序。只要有可能,编程者也应该编写具有灵活性和适应性的程序。
测试 ArraySum 过程
下面的程序通过传递一个 32 位整数数组的偏移量和长度来测试 ArraySum 过程。调用 ArraySum 之后,程序将过程的返回值保存在变量 theSum 中。;测试ArraySum过程 .386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD .data array DWORD 10000h,20000h,30000h,40000h,50000h theSum DWORD ? .code main PROC mov esi,OFFSET array ;ESI指向数组 mov ecx,LENGTHOF array ;ECX = 数组计算器 call ArraySum ;计算和数 mov theSum,eax ;用EAX返回和数 INVOKE ExitProcess,0 main ENDP ;------------------------------------ ;ArraySum ;计算32位整数数组元素之和 ;接收:ESI = 数组偏移量 ; ECX = 数组元素的个数 ;返回:EAX = 数组元素之和 ;------------------------------------- ArraySum PROC push esi ;保存ESI和ECX push ecx mov eax,0 ;设置和数为0 L1: add eax,[esi] ;将每个整数与和数相加 add esi,TYPE DWORD ;指向下一个整数 loop L1 ;按照数组大小重复 pop ecx ;恢复ECX和ESI pop esi ret ;和数在EAX中 ArraySum ENDP END main
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频