2014-01-18 58 views
0

我有這個ASM函數,需要4個參數。前兩個參數是通過值傳遞的,後兩個參數是通過引用傳遞的。所以我用這個:如何使用括號括起來的LEA?

PUSH EBP 
MOV EBP, ESP 
SUB ESP, 20 
MOV EAX, [EBP+8] 
MOV EBX, [EBP+12] 
LEA ECX, [EBP+16] 
LEA EDX, [EBP+20] 
PUSH EDX 
PUSH ECX 
PUSH EBX 
PUSH EAX 
CALL Function 
LEAVE 
RETN 20 

(請注意,我用C內該代碼+ +中使用VC的__asm語句)。

不過,雖然搜索有關使用LEA來傳遞參數作爲指針(又名參考)我發現:

 
[...] Note there are NO brackets in this line. Putting the square brackets around 
something means "get the contents of", so you were effectively defeating the 
LEA op. [...] 

我想引用在EBP+16EBP+20通過這兩個參數,但我該怎麼辦如果不能使用括號?如果我不放它們,那麼編譯器會拋出一個錯誤(C2424)。

在此先感謝。

回答

1

嘗試

MOV ECX, EBP+16 
MOV EDX, EBP+20 
+0

感謝您的回答,但我表示編譯器在執行此操作時會拋出錯誤。 – cdonts

+0

@cdonts你可以'MOV ECX,EBP'然後'ADD ECX,16'。 –

+0

這很合理,但不適用於'LEA'。編譯器拋出'C2415:不正確的操作數類型'任何想法? – cdonts

1

lea有一個類型的操作,因此使用,讓你的編譯器高興的語法(例如,fasm需要括號始終,而masm要求其周圍根本沒有標籤參數)。

注意,即:

  • 的Windows調用約定要求您在通話過程中保持ebx;
  • 我懷疑採取第三和第四個論點的地址是真的你的意圖;
  • 您可以使用push dword [ebp+xxx]指令。
+0

感謝您的回答。我正在使用VC++編譯器的'__asm'語句。我想通過引用傳遞第三和第四個參數,爲什麼你懷疑? – cdonts

+0

@cdonts他們是不是已經在你的外部函數中引用? – qwm

+0

我這麼認爲,但是使用'MOV'只能用於第一個和第二個參數(它們是通過值傳遞的)。我想通過引用傳遞的最後兩個值不起作用。 – cdonts

相關問題