2012-03-23 252 views
1

我讀了一本書,在C寫入下一個程序,convet這個功能來彙編代碼調用:彙編&C - 翻譯C'S代碼彙編

int *p; /* pointer to integer */ 
int foo (int n, int *q) {} 
/* function get int and pointer to int, returns int */ 
/* Now, let's call the function: */  
*p = foo (*p, p); 

它轉換爲:

MOV EBX, [P] 
PUSH EBX 
PUSH DWORD [EBX] 
CALL foo 
MOV EBX, [P] 
MOV [EBX], EAX 
ADD ESP, 8 

我不明白爲什麼它是正確的,我的理解它的代碼應該是這樣的:

MOV EBX, P ;; **CHANGE** 
PUSH EBX 
PUSH DWORD [EBX] 
CALL foo 
MOV EBX, P ;; **CHANGE** 
MOV [EBX], EAX 
ADD ESP, 8 

而且因爲P是一個指針。如果我們做MOV EBX, [P],正如本書所示,我們得到了整數(不是地址),然後如果我們做了PUSH DWORD [EBX],我們得到了不道德的指示。

我在哪裏錯了?

回答

3

P是一個標籤,它等於變量的地址(你的指針變量)。 [P]將是該地址處的值,它是指針。

請注意,儘管如此,一些彙編程序有點不同。 NASM及其衍生工具對括號等非常嚴格。 MASM,不是那麼多;有時候它會讓你對待標籤,就像它本身就是一個變量一樣。

+0

你怎麼理解,P是標籤嗎?這是寫'int * p;/*指向整數* /'的指針。你能延長你的回答嗎?謝謝 – 2012-03-23 15:41:06

+1

@Adam:'P'是一個標籤,因爲彙編語言沒有真正的「變量」。有寄存器,還有內存;任何一個都可以持有價值。但是,如果您使用內存,則需要知道將值存儲在何處。這意味着,您需要從堆棧指針(對於局部變量),標籤(對於靜態/全局變量)或絕對地址(如果感覺到青蛙)的偏移量。 – cHao 2012-03-23 16:09:22

+1

如果我沒有記錯的話,masm會將'mov ebx,p'翻譯爲'mov ebx,[p]' - 如果你想要'p'的地址,你必須寫'mov ebx,offset p' – 2012-03-24 16:36:32

1

P被假定爲這樣的函數的內部:

void foo(){ 
    int *p; /* pointer to integer */ 
    int foo (int n, int *q) {} 
    /* function get int and pointer to int, returns int */ 

    *p = foo (*p, p); 
} 

在這種情況下,P將是或以彙編術語「標記」,「可變的位置」。由於P將通常堆棧INT他的情況進行分配,這意味着,當你做*p=10;你實際上是在做這樣的事情:

mov EBX,[p] ;; get the value of the p variable (a pointer) 
mov [EBX],10 ;; dereference the value of p and assign it to 10