2013-10-13 2 views
0

안녕하세요. 인덱스로 배열을 지우고 어셈블리 코드를 생성하는 함수를 작성했습니다.이 어셈블리 코드에 대한 설명이 필요합니다.

_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]에있는 레지스터에 관한 것입니다. 레지스터가 대괄호 안에있는 경우 해당 레지스터의 주소를 나타 냅니까 ?? 감사.

답변

1

레지스터에는 주소 자체가 없지만 메모리 위치에 대한 주소 (포인터)를 보유 할 수 있습니다.

컴파일러에서 사용하는 형식은 ebp에 저장된 주소와 관련된 매개 변수와 로컬 변수 및 오프셋의 목록 (맨 위)을 포함하는 것으로 보입니다.

그래서 mov DWORD PTR _i$[ebp], 0은 로컬 변수가있는 주소 ebp-80x00000000을 저장한다는 것을 의미합니다. 대괄호는 C에서 포인터를 역 참조하는 것과 유사합니다. DWORD PTR이라는 단일 바이트를 저장할 수도 있기 때문에 DWORD PTR 지정자가 필요합니다. 즉 0x00을 입력하면 BYTE PTR을 사용하게됩니다. (사용자가 상단의 목록에서 보듯이 _arr8에 대응)

mov ecx, DWORD PTR _arr$[ebp]ecx-ebp+8에서 DWORD 값을 이동시킨다. C 프로그램의 측면에서 ebp+8&arr[0]입니다. 달러 기호는 사용하는 특정 컴파일러 어셈블리 구문의 기능입니다. 그 문을 쓰는 가장 일반적인 방법은 mov ecx, DWORD PTR [ebp+8]이지만, 당신이 가지고있는 문법은 그 문법이 어느 지역 변수에 해당하는지 직접 알려주는 이점이 있습니다.

루프 구성 정보에 대해 정확히 무엇이 문제인지 명확하게 설명해야합니다.

+0

mov movx, DWORD PTR _arr $ [ebp]는 DWORD PTR _arr $ [ebp]의 값을 레지스터 ecx에 옮기는 것을 의미합니까 ?? 그리고 달러 기호가 무엇을 의미하는지 설명 할 수 있습니까 ?? 전의. DWORD PTR _i $ [ebp] 감사합니다 – eChung00

+0

@ eChung00 이에 대한 단락으로 내 대답을 업데이트했습니다. – us2012

+0

이제 분명 해지고 있습니다 ... 계속 귀찮게해서 미안하지만 질문이 하나 더 있습니다. 왜 8입니까? 배열 타입은 int입니다 .. 각각 4 바이트라는 것을 알고 있습니다. 그리고 ebp + 8은 주소 & arr [0]을 저장하고 ebp + 16은 주소 & arr [1]을 보유하고 있습니다. 그것 8 ?? 덕분에 – eChung00

관련 문제