이것을 응답하는 제일 방법은 C보기를 사용하기위한 것이다. C에서는 배열의 길이를 추적하는 두 가지 방법이 있습니다.
- 배열을 저장 한 기간을 나타내는 변수를 저장합니다.
- 문자열이 수행하는 작업을 수행하고 마지막 요소를 0으로 설정합니다.그런 다음 0을 찾을 때까지 배열을 반복하는 "문자열"길이 함수를 구현할 수 있습니다.
첫 번째 예제에서는 사용중인 어셈블러에 따라 몇 가지 트릭을 사용할 수 있습니다. 예를 들어, NASM에서이 작업을 수행 할 수 있습니다 : 당신이 볼 수 있듯이
SECTION .data
msg: db "Hello World",10,0 ; the 0-terminated string.
len: equ $-msg ; "$" means current address.
, 우리는 현재의 주소와 길이를 동일해야 msg
의 시작 사이의 차이를 계산하기 위해 NASM을 얻기 위해 equ
연산자를 사용합니다. 또는 길이를 숫자로 쓸 수 있습니다.
두 번째 경우에는 작은 함수를 쉽게 작성할 수 있습니다. 대충 말하면, 당신이 :
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
나는 그것을 테스트하지 않았다. 단지 당신에게 아이디어를주는 것입니다.
편집 나는 int arr[10] = {1,2,3,4,5,6,7,8,9,0};
를 전달 PARAM1으로 rdi
를 사용하여, 리눅스에 x86_64
버전을 테스트했습니다. 예상대로 9
을 반환합니다. Linux에서 mystrlen
앞에 오는 밑줄은 필요하지 않습니다.
있습니다 많은 어셈블리 언어를하는 당신이 지적한 것이 있습니까? –
배열의 고유 한 길이 같은 것은 없습니다. 배열은 당신이 물건을 넣는 기억의 덩어리 일뿐입니다. 당신은 어떤 크기인지 알 길이 없습니다. 당신은 자신을 추적해야합니다. –
OP가 요구하는 아키텍처에 대해 아무도 언급하지 않았습니다. –