안녕하세요. 인덱스로 배열을 지우고 어셈블리 코드를 생성하는 함수를 작성했습니다.이 어셈블리 코드에 대한 설명이 필요합니다.
_TEXT SEGMENT
_i$ = -8 ; size = 4
_arr$ = 8 ; size = 4
_size$ = 12 ; size = 4
[email protected]@[email protected] PROC ; clear_arr, COMDAT
; 3 : void clear_arr(int arr[], int size){
push ebp
mov ebp, esp
sub esp, 204 ; 000000ccH
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-204]
mov ecx, 51 ; 00000033H
mov eax, -858993460 ; ccccccccH
rep stosd
; 4 : int i;
; 5 : for(i = 0; i < size; i++){
mov DWORD PTR _i$[ebp], 0
jmp SHORT [email protected]_arr
[email protected]_arr:
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
[email protected]_arr:
mov eax, DWORD PTR _i$[ebp]
cmp eax, DWORD PTR _size$[ebp]
jge SHORT [email protected]_arr
; 6 : arr[i]=0;
mov eax, DWORD PTR _i$[ebp]
mov ecx, DWORD PTR _arr$[ebp]
mov DWORD PTR [ecx+eax*4], 0
; 7 : }
jmp SHORT [email protected]_arr
[email protected]_arr:
; 8 : }
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret 0
[email protected]@[email protected] ENDP ; clear_arr
_TEXT ENDS
END
루프 부분에 대한 설명이 필요합니다. 내가 알고 싶은 또 다른 점은 DWORD PTR과 대괄호 [ebp]에있는 레지스터에 관한 것입니다. 레지스터가 대괄호 안에있는 경우 해당 레지스터의 주소를 나타 냅니까 ?? 감사.
mov movx, DWORD PTR _arr $ [ebp]는 DWORD PTR _arr $ [ebp]의 값을 레지스터 ecx에 옮기는 것을 의미합니까 ?? 그리고 달러 기호가 무엇을 의미하는지 설명 할 수 있습니까 ?? 전의. DWORD PTR _i $ [ebp] 감사합니다 – eChung00
@ eChung00 이에 대한 단락으로 내 대답을 업데이트했습니다. – us2012
이제 분명 해지고 있습니다 ... 계속 귀찮게해서 미안하지만 질문이 하나 더 있습니다. 왜 8입니까? 배열 타입은 int입니다 .. 각각 4 바이트라는 것을 알고 있습니다. 그리고 ebp + 8은 주소 & arr [0]을 저장하고 ebp + 16은 주소 & arr [1]을 보유하고 있습니다. 그것 8 ?? 덕분에 – eChung00