所以我试图用参数中的offset来得到数组的长度,但是它只返回了lenthof offset,有什么方法可以做到吗?'
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
invoke multiply,addr array
exit
main ENDP
multiply proc,arr:ptr dword
mov ecx,lengthof arr
mov eax, ecx
call writedec
ret
multiply endp
END main
'
1条答案
按热度按时间7gcisfzg1#
大多数汇编器允许你在编译时进行“标签算术”(我喜欢这样称呼它),你可以从一个标签中减去另一个标签,从而得到它们之间的距离(以字节为单位)。语法可能会因汇编器而异,但通常看起来像这样:
如果你使用这种技术,距离总是以 * 字节来度量。* 与C不同,汇编不会根据你所使用的数据类型的大小自动缩放指针运算。在索引数组时要记住这一点,否则你会加载错误的值。
然而,这个方法也有局限性。首先,它不适用于
malloc
或任何类似的运行时内存分配。这个方法纯粹是一个编译时常量,它相当于你自己(在头脑中)计算它们,然后在代码中将该常量写为“幻数”。此外,它无法区分数组中的“空插槽”。例如:
假设您打算将最后五个零作为“可用空间”,用于存储更多数据,而当您测量大小时,您只想计算非“可用空间”的数据,
arrayEnd-array
方法对此没有帮助。