Delphi+汇编例子2

Delphi中使用汇编例子 **
**

-----也是大二的,接着上一个例子。呵呵,程序当时写的有点乱,请原谅:)。

Delphi中使用汇编进行混合编程,是异乎寻常的方便。如此,当你希望得到效率的时候,你可选择汇编,然而大部分工作,你仍是享受着可视化、面向对象编程的方便。delphi的语言,通过使用asm...end程序段写汇编代码部分,在汇编代码段中可以调用高级语言的变量;你需要注意的是,保护某些寄存器变量,然后呢,某些细节和dos下的汇编不同。大家看这个例子。
先大体说说一些小知识:
一,Delphi调用汇编,有两种方式。
一如---
procedure TForm1.DrawRain;
var
x1,y1,x2,y2,d,i:integer;
begin//delphi程序开始
for i:=0 to 100 do
begin
x1:=random(537);
y1:=random(280);
d:=random(7);
asm//内嵌汇编开始
push eax
mov eax,x1
sub eax,d
mov x2,eax
mov eax,y1
add eax,d
mov y2,eax
pop eax
end;;//内嵌汇编结束
times:=times+1;
drawLine2(x1,y1,x2,y2,clmedGray);
wait();
if (i div 2)=0 then drawLine2(x1,y1,x2,y2,clwindow);
end;
end;//delphi程序结束

还有一种,把外层的begin...end去掉,通过asm...end直接进入汇编。

procedure TForm1.Wait();
asm//内嵌汇编开始
push eax
mov eax,0
@loop:
add eax,1
cmp eax,1000000
jnz @loop
pop eax
end;//内嵌汇编结束

二,在汇编中使用delphi的变量

大家看第一段代码的例子,很容易明白:
asm//内嵌汇编开始
push eax
mov eax,x1 //x1是delphi局部变量,此处用作值
sub eax,d
mov x2,eax //x2是delphi局部变量,又用作内存地址
mov eax,y1
add eax,d
mov y2,eax
pop eax
end;;//内嵌汇编结束

三,汇编的不同细节

例子不帖了,大家自己比较了,如
@loop:
//...
jnz @loop
另外,大部分int中断可能不能用,我没有试通,也没见什么资料上介绍过。谁知道,给我发个消息好吗?谢谢了先。

下面是一个比较大的例子,是一个动画效果。因为以前刚开始学这方面的知识,做的很粗糙。是一个小树林里,不停的下着雨的场景---很多问题,表现突出的是,首先浮点指令没有会用(我在后面会附上有待继续尝试的浮点数指令的测试例子),一些算法当时还不会,结果画面比较单调,其次,对景物间的协调不够好,比如树没有有效保护,后来就被雨“花”了:)。
可还是做例子了,大家别笑我,一来没时间写这方面的例子了,二来,学Delphi中的汇编使用,它还是可以说明某些问题的。而且,一般的资料上,是回避这个应用的,个别的高级编程中,偶尔提及,可大家要想掌握,大都得要自己多实践,这个例子可以个给你许多教训:)。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Menus, ExtDlgs, FileCtrl, StdCtrls, ComCtrls, ImgList;

type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Exit1: TMenuItem;
N1: TMenuItem;
Help1: TMenuItem;
About1: TMenuItem;
g1: TMenuItem;
Spring1: TMenuItem;
Summer1: TMenuItem;
Autumn1: TMenuItem;
Winter1: TMenuItem;
StatusBar1: TStatusBar;
ext1: TMenuItem;
Timer1: TTimer;
procedure Exit1Click(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure Spring1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Summer1Click(Sender: TObject);
procedure Autumn1Click(Sender: TObject);
procedure Winter1Click(Sender: TObject);
procedure ext1Click(Sender: TObject);
private
procedure DrawLine1(x1,y1,x2,y2:integer;icolor:TColor);// x2>x1 and y2>y1
procedure DrawLine2(x1,y1,x2,y2:integer;icolor:TColor);// x2

  1<x1 and="" y2="">y1   
  2procedure DrawLine3(x1,y1,x2,y2:integer;iColor:TColor);// x1=x2 or y1=y2   
  3procedure DrawRain;   
  4procedure DrawTree(x,y,height:integer);   
  5procedure Timer1Timer(sender:TObject);   
  6procedure drawClear;   
  7procedure Wait();   
  8{ Private declarations }   
  9public   
 10{ Public declarations }   
 11end; 
 12
 13var   
 14Form1: TForm1;   
 15times:single;   
 16implementation   
 17uses Unit3,Unit5;   
 18{$R *.dfm} 
 19
 20procedure TForm1.Wait();   
 21asm   
 22push eax   
 23mov eax,0   
 24@loop:   
 25add eax,1   
 26cmp eax,1000000   
 27jnz @loop   
 28pop eax   
 29end; 
 30
 31procedure TForm1.DrawLine1(x1,y1,x2,y2:integer;iColor:TColor);   
 32const i:integer=1;   
 33var j,k1,k2,d:integer;   
 34begin   
 35if((x2-x1)&lt;=0)or((y2-y1)&lt;=0) then exit;   
 36for j:=0 to (x2-x1) do   
 37begin   
 38form1.Canvas.Pen.Color:=icolor;   
 39form1.Canvas.Ellipse(x1,y1,x1+2,y1+2);   
 40form1.Canvas.Ellipse(x1-1,y1-1,x1+1,y1+1);   
 41if ((x2-x1)=0)or((y2-y1)=0) then exit;   
 42asm   
 43push eax   
 44push ebx   
 45push ecx   
 46push edx   
 47mov ecx,0   
 48mov eax,x2   
 49sub eax,x1   
 50mov ebx,y2   
 51sub ebx,y1   
 52mov d,ebx   
 53mov edx,0   
 54div d   
 55mov k2,eax 
 56
 57mov eax,y2   
 58sub eax,y1   
 59mov ebx,x2   
 60sub ebx,x1   
 61mov d,ebx   
 62mov edx,0   
 63div d   
 64mov k1,eax 
 65
 66mov eax,x1   
 67@loop2:   
 68add eax,i   
 69inc ecx   
 70cmp ecx,k2   
 71jb @loop2   
 72mov x1,eax 
 73
 74mov eax,y1   
 75@loop1:   
 76add eax,i   
 77inc ecx   
 78cmp ecx,k1   
 79jb @loop1   
 80mov y1,eax 
 81
 82pop edx   
 83pop ecx   
 84pop ebx   
 85pop eax   
 86end;   
 87end;// end for   
 88end;   
 89procedure TForm1.DrawLine2(x1,y1,x2,y2:integer;icolor:TColor);   
 90const i:integer=1;   
 91var j,k1,k2,d:integer;   
 92begin   
 93if((x1-x2)&lt;=0)or((y2-y1)&lt;=0) then exit;   
 94for j:=0 to (x1-x2) do   
 95begin   
 96form1.Canvas.Pen.Color:=icolor;   
 97form1.Canvas.Ellipse(x1,y1,x1+2,y1+2);   
 98form1.Canvas.Ellipse(x1-1,y1-1,x1+1,y1+1);   
 99if ((x1-x2)=0)or((y2-y1)=0) then exit;   
100asm   
101push eax   
102push ebx   
103push ecx   
104push edx 
105
106mov ecx,0 
107
108mov eax,x1   
109sub eax,x2   
110mov ebx,y2   
111sub ebx,y1   
112mov d,ebx   
113mov edx,0   
114div d   
115mov k2,eax 
116
117mov eax,y2   
118sub eax,y1   
119mov ebx,x1   
120sub ebx,x2   
121mov d,ebx   
122mov edx,0   
123div d   
124mov k1,eax 
125
126mov eax,x1   
127@loop2:   
128sub eax,i   
129inc ecx   
130cmp ecx,k2   
131jb @loop2   
132mov x1,eax 
133
134mov eax,y1   
135@loop1:   
136add eax,i   
137inc ecx   
138cmp ecx,k1   
139jb @loop1   
140mov y1,eax 
141
142pop edx   
143pop ecx   
144pop ebx   
145pop eax   
146end;   
147end;// end for   
148end;   
149procedure TForm1.DrawLine3(x1,y1,x2,y2:integer;icolor:TColor);   
150var j:integer;   
151begin   
152if((x2-x1)&lt;&gt;0)and((y2-y1)&lt;&gt;0) then exit;   
153if (x2-x1)=0 then   
154for j:=0 to (y2-y1) do   
155begin   
156form1.Canvas.Pen.Color:=icolor;   
157form1.Canvas.Ellipse(x1-1,y1-1,x1+1,y1+1);   
158if (y2-y1)=0 then exit;   
159asm   
160push eax   
161mov eax,y1   
162inc eax   
163mov y1,eax   
164pop eax   
165end;   
166end// end for   
167else for j:=0 to (x2-x1) do   
168begin   
169form1.Canvas.Pen.Color:=icolor;   
170form1.Canvas.Ellipse(x1-1,y1-1,x1+1,y1+1);   
171if (x2-x1)=0 then exit;   
172asm   
173push eax   
174mov eax,x1   
175inc eax   
176mov x1,eax   
177pop eax   
178end;   
179end;// end for   
180end;   
181procedure TForm1.Timer1Timer(sender:TObject);   
182begin 
183
184end;   
185procedure TForm1.DrawRain;   
186var   
187x1,y1,x2,y2,d,i:integer;   
188begin   
189for i:=0 to 100 do   
190begin   
191x1:=random(537);   
192y1:=random(280);   
193d:=random(7);   
194asm   
195push eax   
196mov eax,x1   
197sub eax,d   
198mov x2,eax   
199mov eax,y1   
200add eax,d   
201mov y2,eax   
202pop eax   
203end;   
204times:=times+1;   
205drawLine2(x1,y1,x2,y2,clmedGray);   
206wait();   
207if (i div 2)=0 then drawLine2(x1,y1,x2,y2,clwindow);   
208end;   
209end; 
210
211procedure TForm1.DrawTree(x,y,height:integer);   
212var   
213x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,d1:integer;   
214begin   
215asm   
216push eax   
217push ebx   
218push ecx   
219push edx   
220mov eax,height   
221mov edx,0   
222mov ecx,2   
223div ecx   
224mov d1,eax   
225mov eax,x   
226mov ebx,y 
227
228sub eax,height   
229mov x1,eax   
230sub ebx,height   
231mov y1,ebx   
232add eax,height   
233sub eax,5   
234sub ebx,height   
235mov x2,eax   
236mov y2,ebx   
237mov eax,x   
238add eax,3   
239sub ebx,height   
240mov x3,eax   
241mov y3,ebx   
242add eax,8   
243add ebx,height   
244mov x4,eax   
245mov y4,ebx   
246add eax,height   
247sub eax,5   
248add ebx,height   
249mov x5,eax   
250mov y5,ebx 
251
252pop edx   
253pop ecx   
254pop ebx   
255pop eax   
256end;   
257DrawLine2(x3,y3,x2-d1,y2,clcream);   
258DrawLine1(x3,y3,x4+d1,y4,clcream);   
259drawline3(x2-d1,y2,x2,y2,clcream);   
260drawline3(x4,y4,x4+d1,y4,clcream);   
261DrawLine2(x2,y2,x1,y1,clcream);   
262DrawLine1(x4,y4,x5,y5,clcream);   
263DrawLine2(x2+2,y2,x1,y1+2,clcream);   
264DrawLine1(x4-2,y4,x5,y5+2,clcream);   
265drawline3(x1,y1,x5,y5,clcream);   
266drawline3(x1,y1-1,x5,y5-1,clcream);   
267drawline3(x,y5,x,y,clcream);   
268drawline3(x,y,x+5,y,clcream);   
269drawline3(x+5,y5,x+5,y,clcream);   
270form1.Canvas.Brush.Color:=clgreen;   
271form1.Canvas.FloodFill(x,y1-5,clcream,fsBorder);   
272form1.Canvas.FloodFill(x+2,y-5,clcream,fsBorder); 
273
274end;   
275procedure TForm1.Exit1Click(Sender: TObject);   
276begin   
277close;   
278end; 
279
280procedure TForm1.About1Click(Sender: TObject);   
281begin   
282form3.Show;   
283end; 
284
285procedure TForm1.Spring1Click(Sender: TObject);   
286var i,k,j:integer;   
287begin   
288StatusBar1.Panels[1].text:='风雨之春...';   
289form1.Canvas.Brush.Color:=clwindow;   
290form1.Canvas.FloodFill(1,1,clred,fsBorder);   
291for i:=0 to 10do   
292begin   
293k:=random(10);   
294j:=random(10);   
295j:=-j;   
296drawTree(10+k*50,300+j*20,20);   
297end;   
298for i:=0 to 10 do   
299begin   
300form1.Canvas.Brush.Color:=clwindow;   
301form1.Canvas.FloodFill(1,1,clgreen,fsBorder);   
302drawRain;   
303sleep(100);   
304end; 
305
306end; 
307
308procedure TForm1.FormCreate(Sender: TObject);   
309begin   
310times:=0;   
311form1.canvas.Brush.Color:=clwindow;   
312form1.caption:=form1.caption+' Please select the Pictype!... ';   
313end;   
314procedure TForm1.drawClear;   
315var i,k:integer;   
316begin   
317form1.Canvas.Brush.Color:=clblack;   
318form1.Canvas.FloodFill(15,15, clcream, fsBorder);   
319for i:=0 to 5 do   
320begin   
321k:=random(300);   
322DrawLine3(20+k,1,20+k,307,clyellow);   
323DrawLine3(200+k,1,200+k,307,clyellow);   
324end;   
325end;   
326procedure TForm1.Summer1Click(Sender: TObject);   
327begin   
328drawClear;   
329form1.Canvas.Font.Color:=clblue;   
330form1.Canvas.Font.Size:=18;   
331form1.canvas.textOut(150,150,'绿色海洋...休整时间^_^!');   
332//DrawTree; 
333
334end; 
335
336procedure TForm1.Autumn1Click(Sender: TObject);   
337begin   
338drawClear;   
339form1.Canvas.Font.Color:=clblue;   
340form1.Canvas.Font.Size:=18;   
341form1.canvas.textOut(150,150,'红叶香山...正在休整^_^!');   
342end; 
343
344procedure TForm1.Winter1Click(Sender: TObject);   
345//var i,x,y:integer;   
346begin   
347drawClear;   
348form1.Canvas.Font.Color:=clblue;   
349form1.Canvas.Font.Size:=18;   
350form1.canvas.textOut(150,150,'银蛇腊象...暂不开放^_^!');   
351end; 
352
353procedure TForm1.ext1Click(Sender: TObject);   
354begin   
355form5.Show;   
356end; 
357
358end. 
359
360下面是附带的使用浮点数指令的测试程序,当时的原本,未达到效果的:):   
361//指令图书馆查的:)   
362procedure Tform1.xx;   
363var   
364xmax,ymax,x,y,a,b:single;   
365i,z:integer;   
366begin   
367a:=2.0;b:=10.0;   
368xmax:=image1.Width;   
369ymax:=image1.Height;   
370for i:=0 to image1.Width do   
371begin   
372asm   
373//.80x87 
374
375finit   
376fld xmax //push xmax in st(0)   
377fdiv a   
378fchs //let st(0)=-st(0)   
379fadd i //st(0)=st(0)+i   
380fdiv b //st(0)=st(0)/b   
381fstp x //put st(0) in x without pop   
382fld x   
383fmul x   
384fchs   
385fadd ymax   
386//frndint   
387//fabs   
388fstp y   
389end;   
390x:=(i-xmax/2)/10;   
391y:=-x*x+ymax;   
392z:=trunc(z);   
393image1.canvas.Ellipse(i-1,trunc(y)-1,i+1,trunc(y)+1);   
394//image1.Canvas.Pixels[x,y];   
395end;   
396end; 
397
398选的是其中一个过程,呵呵,见笑了。   
399大家不妨把自己的东西拿出来,经验说一说,我准备洗耳恭听:)。   
400请----</x1>
Published At
Categories with Web编程
comments powered by Disqus