汇编语言示例:整数数组求和

< 上一页过程调用嵌套 USES运算符下一页 >
程序员在 C++Java 中编写过的非常常见的循环类型是计算整数数组之和。这在汇编语言中很容易实现,它可以被编码为按照尽可能快的方式来运行。比如,在循环内可以使用寄存器而非变量。

现在创建一个过程 ArraySum,从一个调用程序接收两个参数:一个指向 32 位整数数组的指针,以及一个数组元素个数的计数器。该过程计算和数,并用 EAX 返回数组之和:
  1. ;------------------------------------
  2. ;ArraySum
  3. ;计算32位整数数组元素之和
  4. ;接收:ESI = 数组偏移量
  5. ; ECX = 数组元素的个数
  6. ;返回:EAX = 数组元素之和
  7. ;-------------------------------------
  8. ArraySum PROC
  9. push esi ;保存ESI和ECX
  10. push ecx
  11. mov eax,0 ;设置和数为0
  12.  
  13. L1: add eax,[esi] ;将每个整数与和数相加
  14. add esi,TYPE DWORD ;指向下一个整数
  15.  
  16. loop L1 ;按照数组大小重复
  17. pop ecx ;恢复ECX和ESI
  18. pop esi
  19. ret ;和数在EAX中
  20. ArraySum ENDP
这个过程没有特别指定数组名称和大小,它可以用于任何需要计算32位整数数组之和的程序。只要有可能,编程者也应该编写具有灵活性和适应性的程序。

测试 ArraySum 过程

下面的程序通过传递一个 32 位整数数组的偏移量和长度来测试 ArraySum 过程。调用 ArraySum 之后,程序将过程的返回值保存在变量 theSum 中。
  1. ;测试ArraySum过程
  2. .386
  3. .model flat,stdcall
  4. .stack 4096
  5. ExitProcess PROTO,dwExitCode:DWORD
  6.  
  7. .data
  8. array DWORD 10000h,20000h,30000h,40000h,50000h
  9. theSum DWORD ?
  10.  
  11. .code
  12. main PROC
  13. mov esi,OFFSET array ;ESI指向数组
  14. mov ecx,LENGTHOF array ;ECX = 数组计算器
  15. call ArraySum ;计算和数
  16. mov theSum,eax ;用EAX返回和数
  17.  
  18. INVOKE ExitProcess,0
  19. main ENDP
  20. ;------------------------------------
  21. ;ArraySum
  22. ;计算32位整数数组元素之和
  23. ;接收:ESI = 数组偏移量
  24. ; ECX = 数组元素的个数
  25. ;返回:EAX = 数组元素之和
  26. ;-------------------------------------
  27. ArraySum PROC
  28. push esi ;保存ESI和ECX
  29. push ecx
  30. mov eax,0 ;设置和数为0
  31.  
  32. L1: add eax,[esi] ;将每个整数与和数相加
  33. add esi,TYPE DWORD ;指向下一个整数
  34.  
  35. loop L1 ;按照数组大小重复
  36. pop ecx ;恢复ECX和ESI
  37. pop esi
  38. ret ;和数在EAX中
  39. ArraySum ENDP
  40. END main
< 上一页过程调用嵌套 USES运算符下一页 >