Delphi内嵌汇编(push eax 怎么来的?
本帖最后由 冥界3大法王 于 2020-2-27 11:38 编辑https://www.cnblogs.com/JiangHuakey/archive/2010/10/07/1845054.html
https://pic002.cnblogs.com/images/2010/147787/2010100712263169.png
请给我解释下:为啥要从push eax开始? 没学过内嵌汇编,实在是不明白啊。
不是该从00450590取么?从入门指导丛书,谢谢。{:301_1006:}
{:301_973:}
begin
ASM
PUSH EAX;
PUSH EBX;
LEA EAX,codeEnd; {获取codeEnd函数的地址}
LEA EBX,code; {获取code函数的地址}
SUB EAX,EBX; {用codeEnd函数的地址减code函数的地址则可得出code函数的}
{大小,因为codeEnd函数刚好位于codeEnd函数的下面。}
MOV codeSize,EAX;{把code函数的大小保存在变量codeSize中}
POP EBX;
POP EAX;
END; 本帖最后由 冥界3大法王 于 2020-2-27 11:36 编辑
B8 0A000000
0只输出了一位啊。
此楼作废{:301_1006:}
问题1解决,此层也作废,请回答新问题2
本帖最后由 冥界3大法王 于 2020-2-27 11:37 编辑懂了,加个判断就行了。{:301_1008:}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
pFunction = function(): Integer;
var
Form1: TForm1;
function code(): Integer;
function codeEnd(): Integer;
implementation
{$R *.dfm}
function code(): Integer;
var
i, j, k: Integer;
begin
i := 10;
j := 50;
k := i + j;
result := k;
end;
function codeEnd(): Integer;
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
var
func1, func2, func3: pFunction;
myCode: array of char;
codeSize: Integer;
i: Integer;
begin
asm
PUSH EAX;
PUSH EBX;
LEA EAX, codeEnd; {获取codeEnd函数的地址}
LEA EBX, code; {获取code函数的地址}
SUB EAX, EBX; {用codeEnd函数的地址减code函数的地址则可得出code函数的}
{大小,因为codeEnd函数刚好位于codeEnd函数的下面。}
MOV codeSize, EAX; {把code函数的大小保存在变量codeSize中}
POP EBX;
POP EAX;
end;
SetLength(myCode, codeSize);
{下面这段如看不明白请参考我的另一篇文章}
{http://www.cnblogs.com/JiangHuak ... /09/25/1834378.html}
asm
PUSH ESI;
PUSH EDI;
CLD;
LEA ESI, byte ptr;
MOV EDI, myCode;
MOV ECX, codeSize;
REP MOVSB;
POP EDI;
POP ESI;
end;
for i := 0 to HIGH(myCode) - 1 do
begin
// Memo1.Text := Memo1.Text + Format('$%x', )]);
if Length(Memo1.Text + Format('%x', )])) > 0 then
begin
// ShowMessage(Memo1.Text + Format('%x', )]));
if Length(Format('%x', )])) = 2 then
begin
Memo1.SelLength := 0;
Memo1.SelText := Format('%x ', )]);
end;
if Length(Format('%x', )])) = 1 then
begin
Memo1.SelLength := 0;
Memo1.SelText := Format('0%x ', )]);
end;
end;
end;
func3 := pFunction(myCode);
i := func3;
Edit1.Text := IntToStr(i);
end;
end.
以下是我猜的,因为你要把codeEnd 和 code 移动到 寄存器进行一系列操作 ,所以你可以选用eax ebx ecx等,但是你又不能破环原来的寄存器值 ,所以要push 存起来,用完再 pop 还回去 。说白了就是再原有线程中插入一段汇编,你借它寄存器 用完 你得把寄存器的值复原,让线程按原来进行下去。
嘿嘿嘿,说错别怪我,大佬好 谢谢分享
页:
[1]