我讀了一本書,在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]
,我們得到了不道德的指示。
我在哪裏錯了?
你怎麼理解,P是標籤嗎?這是寫'int * p;/*指向整數* /'的指針。你能延長你的回答嗎?謝謝 – 2012-03-23 15:41:06
@Adam:'P'是一個標籤,因爲彙編語言沒有真正的「變量」。有寄存器,還有內存;任何一個都可以持有價值。但是,如果您使用內存,則需要知道將值存儲在何處。這意味着,您需要從堆棧指針(對於局部變量),標籤(對於靜態/全局變量)或絕對地址(如果感覺到青蛙)的偏移量。 – cHao 2012-03-23 16:09:22
如果我沒有記錯的話,masm會將'mov ebx,p'翻譯爲'mov ebx,[p]' - 如果你想要'p'的地址,你必須寫'mov ebx,offset p' – 2012-03-24 16:36:32