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

广告位

程序员在 C++ 或 Java 中编写过的非常常见的循环类型是计算整数数组之和。这在汇编语言中很容易实现,它可…

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

现在创建一个过程 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

关于作者: 汇编语言

为您推荐

广告位

发表评论