原因是你的mulitply proc
不起作用的是lengthof
严格来说是一个编译时常量。下面的代码完全没问题:
INCLUDE Irvine32.inc
multiply proto,arr:ptr dword
.data
array dword 1,2,3,4,5,6,7,8,9,10
num dword 3
.code
main PROC
mov ecx,lengthof array ;assembler replaces this with 40 (byte count of your array)
mov eax, ecx
call writedec
exit
main ENDP
END main
但是,如果您有一个函数尝试像您所做的那样使用变量,则这不起作用。无法告诉 MASM 在此函数中您的输入是双字数组而不仅仅是单个双字。这是因为 CPU 在运行时没有这些信息。指针实际上并不携带有关它所指向的数组长度的任何信息,就像在 C 中一样void foo(int *arr)
。它是一个指针,而不是真正的数组。
multiply proc,arr:ptr dword
mov ecx,lengthof arr ;this just returns a constant value regardless of input.
mov eax, ecx
call writedec
ret
multiply endp
为了执行您想要的操作,您需要将数组的长度作为额外参数传递。我并不完全熟悉 MASM 语法proc
但我想你能弄清楚。如果你这样做:
invoke multiply, addr array, lengthof array
并写下你的proc
因此,你应该得到想要的结果。