assembly 使用通过参数传递的偏移量计算过程内部数组的长度,汇编语言x8086

svgewumm  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(115)

所以我试图用参数中的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

'

7gcisfzg

7gcisfzg1#

大多数汇编器允许你在编译时进行“标签算术”(我喜欢这样称呼它),你可以从一个标签中减去另一个标签,从而得到它们之间的距离(以字节为单位)。语法可能会因汇编器而异,但通常看起来像这样:

array dword 1,2,3,4,5,6,7,8,9,10
arrayEnd label byte  ;this exists just to mark the end

mov ecx, offset (arrayEnd-array)  ;should equal 40 since each entry is 4 bytes.
mov eax,ecx
call writedec

如果你使用这种技术,距离总是以 * 字节来度量。* 与C不同,汇编不会根据你所使用的数据类型的大小自动缩放指针运算。在索引数组时要记住这一点,否则你会加载错误的值。
然而,这个方法也有局限性。首先,它不适用于malloc或任何类似的运行时内存分配。这个方法纯粹是一个编译时常量,它相当于你自己(在头脑中)计算它们,然后在代码中将该常量写为“幻数”。
此外,它无法区分数组中的“空插槽”。例如:

array dword 1,2,3,4,5,0,0,0,0,0
arrayEnd label byte

假设您打算将最后五个零作为“可用空间”,用于存储更多数据,而当您测量大小时,您只想计算非“可用空间”的数据,arrayEnd-array方法对此没有帮助。

相关问题