Cách tốt nhất để trả lời câu hỏi này là sử dụng các ví dụ C. Trong C, có hai cách theo dõi độ dài của một mảng:
- Bạn lưu trữ biến cho biết bạn đã tạo mảng bao lâu.
- Bạn thực hiện những chuỗi nào và có phần tử cuối cùng là 0.Sau đó, bạn có thể thực hiện một hàm chuỗi "chuỗi" lặp lại trên mảng cho đến khi nó tìm thấy số không.
Ví dụ đầu tiên, tùy thuộc vào bộ lắp ráp bạn đang sử dụng, bạn có thể sử dụng một số thủ thuật. Ví dụ, trong NASM bạn có thể làm điều này:
SECTION .data
msg: db "Hello World",10,0 ; the 0-terminated string.
len: equ $-msg ; "$" means current address.
Như bạn có thể thấy, chúng ta sử dụng toán tử equ
để có được NASM để tính toán sự khác biệt giữa địa chỉ hiện tại và bắt đầu msg
mà phải bằng chiều dài của nó. Ngoài ra, bạn chỉ có thể viết chiều dài trong đó dưới dạng chữ số.
Đối với trường hợp thứ hai, bạn có thể dễ dàng viết một hàm nhỏ để thực hiện. Nói thật, nếu bạn:
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
Lưu ý rằng tôi chưa thử nghiệm điều đó. Nó chỉ là để cho bạn một ý tưởng.
Sửa Tôi đã thử nghiệm phiên bản x86_64
trên Linux, sử dụng rdi
như param1, đi qua trong int arr[10] = {1,2,3,4,5,6,7,8,9,0};
. Trả về 9
như mong đợi. Lưu ý rằng trên Linux, dấu gạch dưới trước mystrlen
là không cần thiết.
Có rất nhiều ngôn ngữ lắp ráp, mà một trong những bạn đang chỉ ra? –
Không có thứ gì như độ dài cố định của mảng. Mảng chỉ là một đoạn bộ nhớ mà bạn đặt mọi thứ vào. Bạn không có bất kỳ cách nào để biết kích thước của nó là gì; bạn sẽ cần tự mình theo dõi điều này. –
Không ai từng chỉ ra kiến trúc mà OP đang hỏi. –