Contoh penggunaan perakitan di Delphi
-----Juga mahasiswa tahun kedua, mengikuti contoh sebelumnya. Haha, programnya agak berantakan saat saya menulisnya, mohon maaf :).
Menggunakan perakitan untuk pemrograman hybrid di Delphi sangatlah nyaman. Dengan cara ini, bila Anda ingin mendapatkan efisiensi, Anda dapat memilih perakitan, tetapi untuk sebagian besar pekerjaan, Anda tetap menikmati kenyamanan pemrograman visual dan berorientasi objek. Dalam bahasa Delphi, dengan menggunakan segmen program asm...end untuk menulis bagian kode rakitan, variabel bahasa tingkat tinggi dapat dipanggil di segmen kode rakitan, yang perlu diperhatikan adalah melindungi variabel register tertentu, dan lalu, beberapa detail dan dos. Kompilasi di bawah ini berbeda. Lihatlah contoh ini.
Mari kita bahas beberapa pengetahuan umum terlebih dahulu:
1. Ada dua cara untuk memanggil Majelis di Delphi.
Sama seperti---
Prosedur TForm1.DrawRain;
var
x1,y1,x2,y2,d,i:bilangan bulat;
mulai//program delphi dimulai
untuk i:=0 hingga 100 lakukan
mulai
x1:=acak(537);
y1:=acak(280);
d:=acak(7);
asm//perakitan tertanam dimulai
dorong eax
pindahkan eax,x1
subbeax,d
bergerak x2, eax
pindahkan eax,y1
tambahkan eax,d
pindah y2, eax
pop eax
akhir;;//Akhir dari perakitan tertanam
kali:=kali+1;
drawLine2(x1,y1,x2,y2,clmedGray);
Tunggu();
jika (i div 2)=0 maka drawLine2(x1,y1,x2,y2,clwindow);
akhir;
akhir;//program delphi berakhir
Ada cara lain untuk menghapus bagian luar mulai...akhir dan langsung masuk ke Majelis melalui asm...akhir.
prosedur TForm1.Tunggu();
asm//perakitan tertanam dimulai
dorong eax
bergerak eax,0
@lingkaran:
tambahkan eax,1
cmp eax,1000000
jnz @loop
pop eax
akhir;//akhir perakitan inline
2. Gunakan variabel delphi dalam perakitan
Jika Anda melihat contoh kode pertama, mudah dimengerti:
asm//perakitan tertanam dimulai
dorong eax
mov eax,x1 //x1 adalah variabel lokal delphi, digunakan sebagai nilai di sini
subbeax,d
mov x2,eax //x2 adalah variabel lokal delphi dan juga digunakan sebagai alamat memori
pindah eax,y1
tambahkan eax,d
pindah y2, eax
pop eax
akhir;;//Akhir dari perakitan tertanam
3. Detail kompilasi yang berbeda
Saya tidak akan memposting contohnya. Mari kita bandingkan sendiri.
@lingkaran:
//...
jnz @loop
Selain itu, sebagian besar interupsi int mungkin tidak tersedia. Saya belum mencobanya, dan saya belum melihat informasi apa pun tentangnya. Siapa tahu, tolong kirimkan saya pesan? Terima kasih sebelumnya.
Di bawah ini adalah contoh efek animasi yang lebih besar. Karena saya baru mulai mempelajari ilmu ini di masa lalu, pengalaman saya sangat kasar. Ini adalah pemandangan hujan terus-menerus di hutan kecil---ada banyak masalah, yang paling menonjol adalah pertama-tama, instruksi floating point tidak digunakan (saya akan lampirkan contoh pengujian instruksi floating point untuk dicoba nanti ), Beberapa algoritme belum diketahui pada saat itu, dan hasilnya adalah gambaran yang agak monoton. Kedua, koordinasi antar pemandangan kurang baik, misalnya pepohonan tidak terlindungi secara efektif dan kemudian "berbunga" oleh hujan :).
Tapi saya masih memberi contoh. Jangan menertawakan saya. Pertama, saya tidak punya waktu untuk menulis contoh di bidang ini. Kedua, jika Anda mempelajari cara menggunakan perakitan di Delphi, itu masih bisa menjelaskan masalah tertentu. Selain itu, penerapan ini dihindari dalam materi umum. Kadang-kadang disebutkan dalam beberapa pemrograman tingkat lanjut, tetapi jika Anda ingin menguasainya, Anda harus mempraktikkannya sendiri. Contoh ini dapat mengajari Anda banyak hal :).
satuan Unit1;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Varian, Kelas, Grafik, Kontrol, Formulir,
Dialog, ExtCtrls, Menu, ExtDlgs, FileCtrl, StdCtrls, ComCtrls, ImgList;
jenis
TForm1 = kelas(TForm)
Menu Utama1: Menu Utama;
File1: TMenuItem;
Keluar1: TMenuItem;
N1: TMenuItem;
Bantuan1: TMenuItem;
Tentang1: TMenuItem;
g1: TMenuItem;
Musim Semi1: TMenuItem;
Musim Panas1: TMenuItem;
Musim Gugur1: TMenuItem;
Musim Dingin1: TMenuItem;
StatusBar1: TStatusBar;
ext1: TMenuItem;
Pengatur Waktu1: Pengatur Waktu;
prosedur Exit1Click(Pengirim: TObject);
prosedur About1Click(Pengirim: TObject);
prosedur Spring1Click(Pengirim: TObject);
prosedur FormCreate(Pengirim: TObject);
prosedur Summer1Click(Pengirim: TObject);
prosedur Autumn1Click(Pengirim: TObject);
prosedur Winter1Click(Pengirim: TObject);
procedure ext1Click(Pengirim: TObject);
pribadi
prosedur DrawLine1(x1,y1,x2,y2:integer;icolor:TColor);// x2>x1 dan y2>y1
prosedur DrawLine2(x1,y1,x2,y2:integer;icolor:TColor);// x2<x1 dan y2>y1
procedure DrawLine3(x1,y1,x2,y2:integer;iColor:TColor);// x1=x2 atau y1=y2
prosedur DrawRain;
prosedur DrawTree(x,y,height:integer);
procedure Timer1Timer(pengirim:TObject);
prosedur drawClear;
prosedur Tunggu();
{Deklarasi pribadi}
publik
{Pernyataan publik}
akhir;
var
Formulir1: TForm1;
kali: lajang;
pelaksanaan
menggunakan Unit3,Unit5;
{$R *.dfm}
prosedur TForm1.Tunggu();
asm
dorong eax
bergerak eax,0
@lingkaran:
tambahkan eax,1
cmp eax,1000000
jnz @loop
pop eax
akhir;
prosedur TForm1.DrawLine1(x1,y1,x2,y2:integer;iColor:TColor);
konstanta i:bilangan bulat=1;
var j,k1,k2,d:bilangan bulat;
mulai
if((x2-x1)<=0)or((y2-y1)<=0) lalu keluar;
untuk j:=0 hingga (x2-x1) lakukan
mulai
form1.Canvas.Pen.Warna:=icolor;
form1.Kanvas.Ellipse(x1,y1,x1+2,y1+2);
form1.Kanvas.Ellipse(x1-1,y1-1,x1+1,y1+1);
jika ((x2-x1)=0)atau((y2-y1)=0) maka keluar;
asm
dorong eax
pushebx
pushecx
dorong edx
bergerak ecx,0
pindahkan eax,x2
subbeax,x1
pindah ebx,y2
sub ebx,y1
pindah d,ebx
pindahkan edx,0
div d
pindah k2, eax
pindah eax,y2
sub eax,y1
pindahkan ebx,x2
sub ebx,x1
pindah d,ebx
pindahkan edx,0
div d
pindah k1, eax
pindahkan eax,x1
@ putaran2:
tambahkan eax,i
Incecx
cmpecx,k2
jb @ loop2
bergerak x1, eax
pindah eax,y1
@ putaran1:
tambahkan eax,i
Incecx
cmpecx,k1
jb @ loop1
pindah y1, eax
pop edx
popecx
pop ebx
pop eax
akhir;
akhir;// akhir untuk
akhir;
prosedur TForm1.DrawLine2(x1,y1,x2,y2:integer;icolor:TColor);
konstanta i:bilangan bulat=1;
var j,k1,k2,d:bilangan bulat;
mulai
if((x1-x2)<=0)or((y2-y1)<=0) lalu keluar;
untuk j:=0 hingga (x1-x2) lakukan
mulai
form1.Canvas.Pen.Warna:=icolor;
form1.Kanvas.Ellipse(x1,y1,x1+2,y1+2);
form1.Kanvas.Ellipse(x1-1,y1-1,x1+1,y1+1);
jika ((x1-x2)=0)atau((y2-y1)=0) maka keluar;
asm
dorong eax
pushebx
pushecx
dorong edx
bergerak ecx,0
pindahkan eax,x1
subbeax,x2
pindah ebx,y2
sub ebx,y1
pindah d,ebx
pindahkan edx,0
div d
pindah k2, eax
pindah eax,y2
sub eax,y1
pindahkan ebx,x1
sub ebx,x2
pindah d,ebx
pindahkan edx,0
div d
pindah k1, eax
pindahkan eax,x1
@ putaran2:
sub eax,i
Incecx
cmpecx,k2
jb @ loop2
bergerak x1, eax
pindah eax,y1
@ putaran1:
tambahkan eax,i
Incecx
cmpecx,k1
jb @ loop1
pindah y1, eax
pop edx
popecx
pop ebx
pop eax
akhir;
akhir;// akhir untuk
akhir;
prosedur TForm1.DrawLine3(x1,y1,x2,y2:integer;icolor:TColor);
var j:bilangan bulat;
mulai
if((x2-x1)<>0)and((y2-y1)<>0) lalu keluar;
jika (x2-x1)=0 maka
untuk j:=0 hingga (y2-y1) lakukan
mulai
form1.Canvas.Pen.Warna:=icolor;
form1.Kanvas.Ellipse(x1-1,y1-1,x1+1,y1+1);
jika (y2-y1)=0 maka keluar;
asm
dorong eax
pindah eax,y1
termasuk eax
pindah y1, eax
pop eax
akhir;
akhir// akhir untuk
lain untuk j:=0 hingga (x2-x1) lakukan
mulai
form1.Canvas.Pen.Warna:=icolor;
form1.Kanvas.Ellipse(x1-1,y1-1,x1+1,y1+1);
jika (x2-x1)=0 maka keluar;
asm
dorong eax
pindahkan eax,x1
termasuk eax
bergerak x1, eax
pop eax
akhir;
akhir;// akhir untuk
akhir;
prosedur TForm1.Timer1Timer(pengirim:TObject);
mulai
akhir;
prosedur TForm1.DrawRain;
var
x1,y1,x2,y2,d,i:bilangan bulat;
mulai
untuk i:=0 hingga 100 lakukan
mulai
x1:=acak(537);
y1:=acak(280);
d:=acak(7);
asm
dorong eax
pindahkan eax,x1
subbeax,d
bergerak x2, eax
pindah eax,y1
tambahkan eax,d
pindah y2, eax
pop eax
akhir;
kali:=kali+1;
drawLine2(x1,y1,x2,y2,clmedGray);
Tunggu();
jika (i div 2)=0 maka drawLine2(x1,y1,x2,y2,clwindow);
akhir;
akhir;
prosedur TForm1.DrawTree(x,y,height:integer);
var
x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,d1:bilangan bulat;
mulai
asm
dorong eax
pushebx
pushecx
dorong edx
bergerak eax, tinggi
pindahkan edx,0
bergerak ecx,2
menyelam
pindah d1, eax
bergerak eax,x
pindah ebx,y
sub eax, tinggi
bergerak x1, eax
sub ebx, tinggi
pindah y1,ebx
tambahkan eax, tinggi
subbeax,5
sub ebx, tinggi
bergerak x2, eax
pindah y2,ebx
bergerak eax,x
tambahkan eax,3
sub ebx, tinggi
pindah x3, eax
pindah y3,ebx
tambahkan eax,8
tambahkan ebx, tinggi
pindah x4, eax
pindah y4,ebx
tambahkan eax, tinggi
subbeax,5
tambahkan ebx, tinggi
pindah x5, eax
pindah y5,ebx
pop edx
popecx
pop ebx
pop eax
akhir;
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,clkrim);
DrawLine1(x4-2,y4,x5,y5+2,clkrim);
drawline3(x1,y1,x5,y5,clcream);
drawline3(x1,y1-1,x5,y5-1,krim);
drawline3(x,y5,x,y,clkrim);
drawline3(x,y,x+5,y,clcream);
drawline3(x+5,y5,x+5,y,clkrim);
form1.Canvas.Brush.Warna:=clhijau;
form1.Canvas.FloodFill(x,y1-5,clcream,fsBorder);
form1.Canvas.FloodFill(x+2,y-5,clcream,fsBorder);
akhir;
prosedur TForm1.Exit1Click(Pengirim: TObject);
mulai
menutup;
akhir;
prosedur TForm1.About1Click(Pengirim: TObject);
mulai
form3.Tampilkan;
akhir;
prosedur TForm1.Spring1Click(Pengirim: TObject);
var i,k,j:bilangan bulat;
mulai
StatusBar1.Panels[1].text:='Musim Semi Badai...';
form1.Canvas.Brush.Warna:=clwindow;
form1.Canvas.FloodFill(1,1,clred,fsBorder);
untuk i:=0 hingga 10do
mulai
k:=acak(10);
j:=acak(10);
j:=-j;
drawTree(10+k*50.300+j*20,20);
akhir;
untuk i:=0 hingga 10 lakukan
mulai
form1.Canvas.Brush.Warna:=clwindow;
form1.Canvas.FloodFill(1,1,clgreen,fsBorder);
menggambarHujan;
tidur(100);
akhir;
akhir;
prosedur TForm1.FormCreate(Pengirim: TObject);
mulai
kali:=0;
form1.canvas.Brush.Warna:=clwindow;
form1.caption:=form1.caption+' Silakan pilih Pictype!... ';
akhir;
prosedur TForm1.drawClear;
var i,k:integer;
mulai
form1.Canvas.Brush.Warna:=clhitam;
form1.Canvas.FloodFill(15,15, clcream, fsBorder);
untuk i:=0 hingga 5 lakukan
mulai
k:=acak(300);
DrawLine3(20+k,1,20+k,307,clkuning);
DrawLine3(200+k,1,200+k,307,clkuning);
akhir;
akhir;
prosedur TForm1.Summer1Click(Pengirim: TObject);
mulai
menggambar Hapus;
form1.Canvas.Font.Color:=clbiru;
form1.Canvas.Font.Ukuran:=18;
form1.canvas.textOut(150.150,'Lautan hijau...waktu istirahat^_^!');
//Pohon Gambar;
akhir;
prosedur TForm1.Autumn1Click(Pengirim: TObject);
mulai
menggambar Hapus;
form1.Canvas.Font.Color:=clbiru;
form1.Canvas.Font.Ukuran:=18;
form1.canvas.textOut(150.150,'Daun merah dan pegunungan harum...sedang beristirahat^_^!');
akhir;
prosedur TForm1.Winter1Click(Pengirim: TObject);
//var i,x,y:integer;
mulai
menggambar Hapus;
form1.Canvas.Font.Color:=clbiru;
form1.Canvas.Font.Ukuran:=18;
form1.canvas.textOut(150,150,'Gajah lilin ular perak...belum dibuka^_^!');
akhir;
prosedur TForm1.ext1Click(Pengirim: TObject);
mulai
form5.Tampilkan;
akhir;
akhir.
Berikut ini adalah program pengujian terlampir menggunakan instruksi floating point. Versi asli pada saat itu tidak mencapai efek :):
// Perintahkan perpustakaan untuk memeriksa :)
prosedur Tform1.xx;
var
xmax,ymax,x,y,a,b:tunggal;
saya,z:bilangan bulat;
mulai
a:=2.0;b:=10.0;
xmax:=gambar1.Lebar;
ymax:=gambar1.Tinggi;
untuk i:=0 hingga image1.Width lakukan
mulai
asm
//.80x87
terbatas
fld xmax //tekan xmax di st(0)
fdiv a
fchs //biarkan st(0)=-st(0)
iseng saya //st(0)=st(0)+i
fdiv b //st(0)=st(0)/b
fstp x //masukkan st(0) ke dalam x tanpa pop
X
fmul x
fchs
iseng-iseng ymax
//frndint
//hebat
fstp y
akhir;
x:=(i-xmax/2)/10;
y:=-x*x+ymaks;
z:=potong(z);
image1.kanvas.Ellipse(i-1,trunc(y)-1,i+1,trunc(y)+1);
//gambar1.Kanvas.Piksel[x,y];
akhir;
akhir;
Saya memilih salah satu prosesnya, haha, lucu.
Anda sebaiknya mengeluarkan barang-barang Anda dan berbagi pengalaman Anda, saya siap mendengarkan :).
Tolong----