汇编语言数组遍历

时间:2014-02-05 03:44:17

标签: arrays assembly masm

我是汇编语言的新手,我遇到了一些基本的编程问题,我想知道你们是否能指出我正确的方向。 我正在尝试编写一个遍历数组的函数,并总结其元素的值。给定一个指针int *数组和一些长度x。

到目前为止我能够做的是写入初始数据并放置初始指针,这不是很多,而是它的开始。如何在程序集中使用循环遍历数组?

PUSH EBX
  PUSH ECX
  PUSH EDX
  PUSH ESI
  PUSH EDI

MOV EBX, array
  MOV ECX, x

mov eax, 2;
  mov ebx, array;
  lea edx, [ebx+eax*4];

1 个答案:

答案 0 :(得分:2)

您无需保存所有这些寄存器。如果您的函数使用esiediebxebp,那么您必须将它们保存在序言中并在结尾中恢复它们。 MASM可以使用关键字uses

为您完成此操作
SomeProcedure proc uses esi, edi, ebx Val1:DWORD, Val2:DWORD

    ret
SomeProcedure endp

以下是一种方法:

.686                                     
.model flat, stdcall     
option casemap :none   

include kernel32.inc
includelib kernel32.lib

.data
Array   dd  1, 2, 3, 4, 5, 6, 7, 8, 9
Array_Size  equ ($ - Array) / 4

.code
start:

    push    Array_Size - 1
    push    offset Array
    call    SumArray
    ; eax contains sum of array
    ; print it out here.

    push    0
    call    ExitProcess

SumArray:    
    push    esi             ; need to preserve esi

    mov     esi, [esp + 8]  ; address of array
    mov     ecx, [esp + 12] ; size of array - 1
    xor     eax, eax        ; holds sum
    xor     edx, edx        ; index

AddIt:
    add     eax, [esi + edx * 4]     
    inc     edx
    dec     ecx
    jns     AddIt           ; is ecx ! neg repeat loop

    pop     esi
    ret
end start
相关问题