2013-10-13 116 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所以裝置:貯存在0x00000000地址ebp-8(這是其中本地變量i駐留)。方括號類似於取消引用C中的指針。您需要說明符DWORD PTR,因爲您也可能只需存儲單個字節,即0x00,在這種情況下,您將使用BYTE PTR

mov ecx, DWORD PTR _arr$[ebp]移動在ebp+8ecx DWORD值(你可以從列表的頂部看到,_arr對應8)。根據您的C程序,ebp+8包含&arr[0]。美元符號是您使用的特定編譯器彙編語法的一項功能。編寫該語句的更常見的方法是mov ecx, DWORD PTR [ebp+8],但是您擁有的語法具有直接告訴您它對應哪個局部變量的優點。

關於循環結構,您應該明確您的問題到底在哪裏。

+0

因此mov ecx,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