我是汇编语言的新手,我遇到了一些基本的编程问题,我想知道你们是否能指出我正确的方向。 我正在尝试编写一个遍历数组的函数,并总结其元素的值。给定一个指针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];
答案 0 :(得分:2)
您无需保存所有这些寄存器。如果您的函数使用esi
,edi
,ebx
,ebp
,那么您必须将它们保存在序言中并在结尾中恢复它们。 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