亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi+匯編例子2

2019-11-18 18:35:35
字體:
來源:轉載
供稿:網友
 

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<x1 and y2>y1
procedure DrawLine3(x1,y1,x2,y2:integer;iColor:TColor);// x1=x2 or y1=y2
procedure DrawRain;
procedure DrawTree(x,y,height:integer);
procedure Timer1Timer(sender:TObject);
procedure drawClear;
procedure Wait();
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
times:single;
implementation
uses Unit3,Unit5;
{$R *.dfm}

procedure TForm1.Wait();
asm
push eax
mov eax,0
@loop:
add eax,1
cmp eax,1000000
jnz @loop
pop eax
end;

procedure TForm1.DrawLine1(x1,y1,x2,y2:integer;iColor:TColor);
const i:integer=1;
var j,k1,k2,d:integer;
begin
if((x2-x1)<=0)or((y2-y1)<=0) then exit;
for j:=0 to (x2-x1) do
begin
form1.Canvas.Pen.Color:=icolor;
form1.Canvas.Ellipse(x1,y1,x1+2,y1+2);
form1.Canvas.Ellipse(x1-1,y1-1,x1+1,y1+1);
if ((x2-x1)=0)or((y2-y1)=0) then exit;
asm
push eax
push ebx
push ecx
push edx
mov ecx,0
mov eax,x2
sub eax,x1
mov ebx,y2
sub ebx,y1
mov d,ebx
mov edx,0
div d
mov k2,eax

mov eax,y2
sub eax,y1
mov ebx,x2
sub ebx,x1
mov d,ebx
mov edx,0
div d
mov k1,eax

mov eax,x1
@loop2:
add eax,i
inc ecx
cmp ecx,k2
jb @loop2
mov x1,eax

mov eax,y1
@loop1:
add eax,i
inc ecx
cmp ecx,k1
jb @loop1
mov y1,eax

pop edx
pop ecx
pop ebx
pop eax
end;
end;// end for
end;
procedure TForm1.DrawLine2(x1,y1,x2,y2:integer;icolor:TColor);
const i:integer=1;
var j,k1,k2,d:integer;
begin
if((x1-x2)<=0)or((y2-y1)<=0) then exit;
for j:=0 to (x1-x2) do
begin
form1.Canvas.Pen.Color:=icolor;
form1.Canvas.Ellipse(x1,y1,x1+2,y1+2);
form1.Canvas.Ellipse(x1-1,y1-1,x1+1,y1+1);
if ((x1-x2)=0)or((y2-y1)=0) then exit;
asm
push eax
push ebx
push ecx
push edx

mov ecx,0

mov eax,x1
sub eax,x2
mov ebx,y2
sub ebx,y1
mov d,ebx
mov edx,0
div d
mov k2,eax

mov eax,y2
sub eax,y1
mov ebx,x1
sub ebx,x2
mov d,ebx
mov edx,0
div d
mov k1,eax

mov eax,x1
@loop2:
sub eax,i
inc ecx
cmp ecx,k2
jb @loop2
mov x1,eax

mov eax,y1
@loop1:
add eax,i
inc ecx
cmp ecx,k1
jb @loop1
mov y1,eax

pop edx
pop ecx
pop ebx
pop eax
end;
end;// end for
end;
procedure TForm1.DrawLine3(x1,y1,x2,y2:integer;icolor:TColor);
var j:integer;
begin
if((x2-x1)<>0)and((y2-y1)<>0) then exit;
if (x2-x1)=0 then
for j:=0 to (y2-y1) do
begin
form1.Canvas.Pen.Color:=icolor;
form1.Canvas.Ellipse(x1-1,y1-1,x1+1,y1+1);
if (y2-y1)=0 then exit;
asm
push eax
mov eax,y1
inc eax
mov y1,eax
pop eax
end;
end// end for
else for j:=0 to (x2-x1) do
begin
form1.Canvas.Pen.Color:=icolor;
form1.Canvas.Ellipse(x1-1,y1-1,x1+1,y1+1);
if (x2-x1)=0 then exit;
asm
push eax
mov eax,x1
inc eax
mov x1,eax
pop eax
end;
end;// end for
end;
procedure TForm1.Timer1Timer(sender:TObject);
begin

end;
procedure TForm1.DrawRain;
var
x1,y1,x2,y2,d,i:integer;
begin
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;

procedure TForm1.DrawTree(x,y,height:integer);
var
x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,d1:integer;
begin
asm
push eax
push ebx
push ecx
push edx
mov eax,height
mov edx,0
mov ecx,2
div ecx
mov d1,eax
mov eax,x
mov ebx,y

sub eax,height
mov x1,eax
sub ebx,height
mov y1,ebx
add eax,height
sub eax,5
sub ebx,height
mov x2,eax
mov y2,ebx
mov eax,x
add eax,3
sub ebx,height
mov x3,eax
mov y3,ebx
add eax,8
add ebx,height
mov x4,eax
mov y4,ebx
add eax,height
sub eax,5
add ebx,height
mov x5,eax
mov y5,ebx

pop edx
pop ecx
pop ebx
pop eax
end;
DrawLine2(x3,y3,x2-d1,y2,clcream);
DrawLine1(x3,y3,x4+d1,y4,clcream);
drawline3(x2-d1,y2,x2,y2,clcream);
drawline3(x4,y4,x4+d1,y4,clcream);
DrawLine2(x2,y2,x1,y1,clcream);
DrawLine1(x4,y4,x5,y5,clcream);
DrawLine2(x2+2,y2,x1,y1+2,clcream);
DrawLine1(x4-2,y4,x5,y5+2,clcream);
drawline3(x1,y1,x5,y5,clcream);
drawline3(x1,y1-1,x5,y5-1,clcream);
drawline3(x,y5,x,y,clcream);
drawline3(x,y,x+5,y,clcream);
drawline3(x+5,y5,x+5,y,clcream);
form1.Canvas.Brush.Color:=clgreen;
form1.Canvas.FloodFill(x,y1-5,clcream,fsBorder);
form1.Canvas.FloodFill(x+2,y-5,clcream,fsBorder);

end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.About1Click(Sender: TObject);
begin
form3.Show;
end;

procedure TForm1.Spring1Click(Sender: TObject);
var i,k,j:integer;
begin
StatusBar1.Panels[1].text:='風雨之春...';
form1.Canvas.Brush.Color:=clwindow;
form1.Canvas.FloodFill(1,1,clred,fsBorder);
for i:=0 to 10do
begin
k:=random(10);
j:=random(10);
j:=-j;
drawTree(10+k*50,300+j*20,20);
end;
for i:=0 to 10 do
begin
form1.Canvas.Brush.Color:=clwindow;
form1.Canvas.FloodFill(1,1,clgreen,fsBorder);
drawRain;
sleep(100);
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
times:=0;
form1.canvas.Brush.Color:=clwindow;
form1.caption:=form1.caption+' Please select the Pictype!... ';
end;
procedure TForm1.drawClear;
var i,k:integer;
begin
form1.Canvas.Brush.Color:=clblack;
form1.Canvas.FloodFill(15,15, clcream, fsBorder);
for i:=0 to 5 do
begin
k:=random(300);
DrawLine3(20+k,1,20+k,307,clyellow);
DrawLine3(200+k,1,200+k,307,clyellow);
end;
end;
procedure TForm1.Summer1Click(Sender: TObject);
begin
drawClear;
form1.Canvas.Font.Color:=clblue;
form1.Canvas.Font.Size:=18;
form1.canvas.textOut(150,150,'綠色海洋...休整時間^_^!');
//DrawTree;

end;

procedure TForm1.Autumn1Click(Sender: TObject);
begin
drawClear;
form1.Canvas.Font.Color:=clblue;
form1.Canvas.Font.Size:=18;
form1.canvas.textOut(150,150,'紅葉香山...正在休整^_^!');
end;

procedure TForm1.Winter1Click(Sender: TObject);
//var i,x,y:integer;
begin
drawClear;
form1.Canvas.Font.Color:=clblue;
form1.Canvas.Font.Size:=18;
form1.canvas.textOut(150,150,'銀蛇臘象...暫不開放^_^!');
end;

procedure TForm1.ext1Click(Sender: TObject);
begin
form5.Show;
end;

end.

下面是附帶的使用浮點數指令的測試程序,當時的原本,未達到效果的:):
//指令圖書館查的:)
procedure Tform1.xx;
var
xmax,ymax,x,y,a,b:single;
i,z:integer;
begin
a:=2.0;b:=10.0;
xmax:=image1.Width;
ymax:=image1.Height;
for i:=0 to image1.Width do
begin
asm
//.80x87

finit
fld xmax //push xmax in st(0)
fdiv a
fchs //let st(0)=-st(0)
fadd i //st(0)=st(0)+i
fdiv b //st(0)=st(0)/b
fstp x //put st(0) in x without pop
fld x
fmul x
fchs
fadd ymax
//frndint
//fabs
fstp y
end;
x:=(i-xmax/2)/10;
y:=-x*x+ymax;
z:=trunc(z);
image1.canvas.Ellipse(i-1,trunc(y)-1,i+1,trunc(y)+1);
//image1.Canvas.Pixels[x,y];
end;
end;

選的是其中一個過程,呵呵,見笑了。
大家不妨把自己的東西拿出來,經驗說一說,我準備洗耳恭聽:)。
請----


上一篇:Delphi+匯編例子1(求和的比較)

下一篇:Delphi中兩個BUG的分析與修復

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性欧美长视频免费观看不卡| 国产999视频| 亚洲成人激情在线观看| 欧美日本高清一区| 久久国产精品99国产精| 亚洲国产中文字幕久久网| 国内外成人免费激情在线视频| 在线观看日韩视频| 国产精品久久久久久久久久久新郎| 欧美一级片在线播放| 91久久久久久久久久久久久| 欧美大片va欧美在线播放| 亚洲欧美第一页| 精品一区二区三区四区在线| 国产福利视频一区二区| 亚洲精品电影在线| 国产精品主播视频| 国产一区二区三区在线免费观看| 精品国产网站地址| 亚洲午夜精品久久久久久久久久久久| 久久夜色精品国产亚洲aⅴ| 国产精品视频网站| 成人av在线亚洲| 91在线观看免费高清完整版在线观看| 有码中文亚洲精品| 国产视频精品一区二区三区| 欧美黄色成人网| 欧美日韩亚洲系列| 亚洲欧美福利视频| 欧美大学生性色视频| 一区二区三区国产在线观看| 久久久精品国产网站| 日韩视频免费观看| 97人人爽人人喊人人模波多| 亚洲成年人影院在线| 成人疯狂猛交xxx| 夜夜嗨av一区二区三区四区| 亚洲无av在线中文字幕| 992tv在线成人免费观看| 欧美视频一二三| 亚洲午夜小视频| 日韩成人中文电影| 97视频免费看| 亚洲欧美日韩天堂| 久久成年人视频| 国产精品久久久久久亚洲影视| 欧美第一黄网免费网站| 国产午夜精品久久久| 国产精品久久久久久亚洲影视| 国产主播喷水一区二区| 久久精品成人动漫| 亚洲福利视频网站| 日韩av综合网站| 亚洲成人黄色在线观看| 欧美电影在线观看| 亚洲成色999久久网站| 国产欧美一区二区三区久久人妖| 日韩亚洲欧美中文在线| 亚洲综合日韩中文字幕v在线| 亚洲在线一区二区| 中文在线资源观看视频网站免费不卡| 精品视频—区二区三区免费| 成人国产精品久久久| 日韩av电影手机在线观看| xxxxxxxxx欧美| 国产suv精品一区二区三区88区| 国产精品国产自产拍高清av水多| 日韩有码片在线观看| 亚洲xxx视频| 亚洲国产私拍精品国模在线观看| 欧美性猛交xxxx黑人猛交| 在线免费观看羞羞视频一区二区| 米奇精品一区二区三区在线观看| 久久久女人电视剧免费播放下载| 日韩欧美精品免费在线| 色琪琪综合男人的天堂aⅴ视频| 国产成人一区二区三区小说| 久久精品中文字幕电影| 日韩av一卡二卡| 久久99国产精品自在自在app| 亚洲精品在线看| 国产+人+亚洲| 日韩av在线网站| 国产97在线|日韩| 久久久亚洲国产| 精品亚洲一区二区三区四区五区| 国产日产欧美精品| 国产在线拍揄自揄视频不卡99| 日韩网站免费观看高清| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲日本中文字幕免费在线不卡| 成人精品一区二区三区电影免费| 日本亚洲精品在线观看| 亚洲国产毛片完整版| 国产精品一香蕉国产线看观看| 亚洲女人天堂视频| 欧美尺度大的性做爰视频| 亚洲国产精彩中文乱码av在线播放| 日韩风俗一区 二区| 中文字幕在线观看亚洲| 国产成人欧美在线观看| 国产97色在线| 精品国内产的精品视频在线观看| 亚洲国产成人在线视频| 免费不卡欧美自拍视频| 亚洲天天在线日亚洲洲精| 欧美日韩国产精品一区二区三区四区| 亚洲精品ady| 国产亚洲精品久久久优势| 国产97在线|亚洲| 欧美日韩国产一区二区| 午夜精品视频在线| 欧美一级淫片播放口| 亚洲精品资源美女情侣酒店| 91精品国产综合久久香蕉922| 欧美成人三级视频网站| 亚洲天堂成人在线视频| 美日韩精品免费视频| 中文字幕一区二区三区电影| 国内精品小视频| 欧美日韩国产精品一区二区不卡中文| 大胆人体色综合| 亚洲一区二区中文| 欧美日韩不卡合集视频| 国产亚洲成av人片在线观看桃| 97超碰蝌蚪网人人做人人爽| 2018中文字幕一区二区三区| 欧美人在线视频| 日本a级片电影一区二区| 97在线免费视频| 欧美成人激情视频免费观看| 亚洲精品99久久久久| 亚洲精品电影网站| 欧美中文在线字幕| 国产日韩在线看片| 亚洲综合大片69999| 亚洲精品ady| 亚洲999一在线观看www| 亚洲欧美国产视频| 久久精品男人天堂| 在线观看国产精品淫| 成人午夜黄色影院| 精品国产一区二区三区久久久| 亚洲欧美国产精品专区久久| 日韩亚洲综合在线| 亚洲成人在线网| 欧美精品久久久久久久免费观看| 亚洲国产精品成人va在线观看| 高跟丝袜欧美一区| 欧美专区福利在线| 国产亚洲免费的视频看| 国产国语videosex另类| 国产精品久久久久福利| 久久久精品日本| 亚州精品天堂中文字幕| 亚洲欧美综合另类中字| 国内精品400部情侣激情| 精品一区二区电影| 久久久人成影片一区二区三区观看| 亚洲开心激情网| 亚洲综合国产精品| 国产精品免费久久久| 蜜臀久久99精品久久久久久宅男| 日本视频久久久|