Лучший способ ответить на этот вопрос - использовать примеры на языке C.В C есть два способа отслеживать длину массива:
- Вы храните переменную, сообщающую вам, как долго вы создали массив.
- Вы делаете то, что делают строкии последний элемент равен 0. Затем вы можете реализовать функцию длины «string», которая перебирает массив, пока не найдет ноль.
Для первого примера, в зависимости от того, каким ассемблером вы являетесьиспользуя, вы можете использовать некоторые приемы.Например, в 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
, не требуется.