回答这个问题的最佳方法是使用 C 示例。在 C 中,有两种方法可以跟踪数组的长度:
- 您存储一个变量,告诉您创建数组的时间。
- 您可以执行字符串所做的操作,并将最后一个元素设置为 0。然后,您可以实现一个“字符串”长度函数,该函数循环遍历数组,直到找到零。
对于第一个示例,根据您使用的汇编器,您可能可以使用一些技巧。例如,在 nasm 中你可以这样做:
SECTION .data
msg: db "Hello World",10,0 ; the 0-terminated string.
len: equ $-msg ; "$" means current address.
正如你所看到的,我们使用equ
运算符让 nasm 计算当前地址与起始地址之间的差msg
它应该等于它的长度。或者,您可以将长度写为数字。
对于第二种情况,您可以轻松编写一个小函数来完成它。粗略地说,如果您:
SECTION .text
global _mystrlen
_mystrlen:
push ebp ; conform to C calling conventions.
mov ebp, esp
xor eax, eax
lea ecx, [esp+8] ; load the start of the array into ecx
jecxz end ; jump if [ecx] is zero.
loop:
add eax, 1 ; could use inc eax as well.
add ecx, 4 ; always increment by (sizeof(int)). Change as appropriate
mov edx, [ecx] ; load ecx
cmp edx, 0 ; compare with zerp
je end ; if ecx is zero, we're done.
jmp loop ; if ecx isn't zero, loop until it is.
end:
leave ; restore stack frame
ret ; return. eax is retval
请注意,我还没有测试过。这只是为了给你一个想法。
Edit我已经测试过x86_64
Linux 上的版本,使用rdi
作为param1,传入int arr[10] = {1,2,3,4,5,6,7,8,9,0};
。退货9
正如预期的那样。请注意,在 Linux 上,前面的下划线mystrlen
是不必要的。