首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

lea内嵌汇编有关问题

2012-09-11 
lea内嵌汇编问题Delphi(Pascal) codeprocedure TForm1.Button1Click(Sender: TObject)vartmp:DWORDbegin

lea内嵌汇编问题

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

Delphi(Pascal) code
procedure TForm1.Button1Click(Sender: TObject);var  tmp:DWORD;beginasm  pushad  mov eax,$10000  mov ebx,$1  lea eax,[eax+ebx*32]//这里显示错误 Inline assembler syntax error  mov eax,[eax]  mov tmp,eax  popadend;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]
汇编不熟,上面只是示意:即先乘好了在用

热点排行