汇编 lea

场景:lea内嵌汇编有关问题

lea内嵌汇编问题
Delphi(Pascal) code

procedure TForm1.Button1Click(Sender: TObject);
var
  tmp:DWORD;
begin
asm
  pushad
  mov eax,$10000
  mov ebx,$1
  lea eax,[eax+ebx*4]//这样可以编译通过
  mov eax,[eax]
  mov tmp,eax
  popad
end;
ShowMessage(IntToStr(tmp));
end;


Delphi(Pascal) code

procedure TForm1.Button1Click(Sender: TObject);
var
  tmp:DWORD;
begin
asm
  pushad
  mov eax,$10000
  mov ebx,$1
  lea eax,[eax+ebx*32]//这里显示错误 Inline assembler syntax error
  mov eax,[eax]
  mov tmp,eax
  popad
end;
ShowMessage(IntToStr(tmp));
end;


内嵌汇编语法错误,是不是寄存器溢出了?

------解决方案--------------------
这不是LEA指令的问题,所有内存格式都是这样的,如 MOV指令

以下格式实际上是编译不过的,但是编译器可能会优化,而让指令变成X86能识别的格式

MOV EAX , [ECX*3 + 5] 这个本来X86是不支持的
编译器会优化成
MOV EAX , [ECX + ECX*2 + 5] 这个就支持了

内存表示格式以下是要注意的:
[Reg - Reg * n] 这是不支持的,只能用 + Reg*n ,如果你写成 -Reg*n,如-EAX*4
在Delphi中还是能编译通过,那是Delphi的Bug,他不在乎你写的是+还是-,一律按照+来处理





------解决方案--------------------
探讨
这不是LEA指令的问题,所有内存格式都是这样的,如 MOV指令

以下格式实际上是编译不过的,但是编译器可能会优化,而让指令变成X86能识别的格式

MOV EAX , [ECX*3 + 5] 这个本来X86是不支持的
编译器会优化成
MOV EAX , [ECX + ECX*2 + 5] 这个就支持了

内存表示格式以下是要注意的:
[Reg - Reg * n] 这是不支持……

------解决方案--------------------
mov ecx,ebx
mul ecx,32
mov ebx,ecx
lea eax,[eax+ebx]
汇编不熟,上面只是示意:即先乘好了在用