如何使用带括号的LEA?

时间:2014-01-18 18:21:06

标签: visual-c++ pointers assembly x86

我有这个ASM功能,需要4个参数。前两个参数按值传递,后两个参数通过引用传递。所以我正在使用它:

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

(请注意,我使用VC的__asm语句在C ++中使用此代码。)

但是在搜索使用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)。

提前致谢。

2 个答案:

答案 0 :(得分:1)

尝试

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

答案 1 :(得分:1)

lea有一种类型的操作,因此使用使编译器感到高兴的语法(例如,fasm总是需要括号,而masm要求它不在标签参数周围)。

请注意:

  • Windows通话约定要求您在通话期间保留ebx;
  • 我怀疑第三和第四个论点的地址是你的意图;
  • 您可以使用push dword [ebp+xxx]指令。