【问题标题】:Assembly language Array traversal汇编语言数组遍历
【发布时间】:2014-02-05 03:44:17
【问题描述】:

我是汇编语言的新手,遇到了一些基本的编程问题,我想知道你们是否可以为我指明正确的方向。 我正在尝试编写一个遍历数组并总结其元素值的函数。给定一个指针 int *array 和一些长度 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];

【问题讨论】:

  • 您是否考虑过编译一个非常简单的 C 程序并查看编译器是如何完成的? gcc -S mycode.c 将产生 mycode.s...

标签: arrays assembly masm


【解决方案1】:

您不需要保存所有这些寄存器。如果你的函数使用了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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    相关资源
    最近更新 更多