汇编 lea
场景:lea内嵌汇编有关问题
lea内嵌汇编问题
内嵌汇编语法错误,是不是寄存器溢出了?
------解决方案--------------------
这不是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,他不在乎你写的是+还是-,一律按照+来处理
------解决方案--------------------
------解决方案--------------------
mov ecx,ebx
mul ecx,32
mov ebx,ecx
lea eax,[eax+ebx]
汇编不熟,上面只是示意:即先乘好了在用
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,他不在乎你写的是+还是-,一律按照+来处理
------解决方案--------------------
------解决方案--------------------
mov ecx,ebx
mul ecx,32
mov ebx,ecx
lea eax,[eax+ebx]
汇编不熟,上面只是示意:即先乘好了在用