۰۸-دى-۱۳۹۰, ۱۲:۳۸:۱۶
با سلام
درنسخه های مختلف دلفی همیشه یک اسمبلر بنام tasm32 وجود دارد که با خط فرمان کار میکند بعضی ها فکر میکنند که tasm32 مرده ولی در حقیقت این طور نیست درسته که بروز نمیشه ولی یکی از بهترین اسمبلر ها برای استفاده در دلفی میباشد کسانی هم که از masm میاکروسافت استفاده میکنند شاید خوشحال شوند که tasm همخوانی زیادی با masm دارد هنگامی که شما از حالت ideal استفاده نکنید به این امر پی خواهید برد در این مقاله شما خواهید دانست که چگونه از فایلهای کامپایل شده در tasm و masm در دلفی استفاده کنید البته فایلهای کامپایل شده با masm گارانتی زیادی ندارند توجه داشته باشید که اگر از delphi xe2 استفاده میکنید کدها کمی متفاوت میباشد
دانلود tasm و سورس مثال
با استفاده از دستور زیر میتوانید سورس را کامپایل کنید
این هم نمونه کامپایل شده برای استفاده در مثال در این مثال 3 تابع وجود دارد اولی برای محاسبه یک مقدار float و 2 تابع دیگر یک روتین مربوط به انکریپشن XXTEA میباشند که با استفاده از ان میتوانید مقدار
دانلود masm نسخه 0.8 همرا با سورس مثال
با استفاده از دستور زیر میتوانید سورس را کامپایل کنید
شما برای کامپایل این کد میتوانید از clone JWasm نیز استفاده کنید
JWasm -omf asmmas.asm
حالا شما نیاز به fix کردن OBJ OMF بدست امده برای سازگار کردن ان با کامپایلر دلفی دارید که این کار را میتوانید با برنامه OMF2D انجام دهید برنامه و کامند انرا میتوانید از زیر دانلود کنید
اکنون asmmasm_d.obj تولید شده را در پوشه پروژه خود کپی کنید در بالای یونیت نیازی به اعلان {$define USINGTASM} نیست حالا پروزه را کامپایل و اجرا کنید
در اینجا ما از delphi xe2 برای این کار استفاده میکنیم که قابلیتهای لازم برای اجرای این تکنیک را داراست یکی از انها استفاده از فایلهای obj 64 بیتی و استفاده از فایلهای ابجکت COFF تولید شده توسط کامپایلرهای مایکروسافت میباشد کامپایلر Tasm 64 بیتی وجود ندارد اما تعدادی از اسمبلرها وجو دارند که فایلهای تولید شده توسط انها در دلفی قابل استفاده میباشد برای این کار شما میتوانید از Masm یا JWasm استفاده کنید استفاده از ابجکت فایلهای 64 بیتی در دلفی اسانتر از 32 بیتی میباشد زیرا حالت فراخوانی یک روتین توسط یک تابع به صورت FastCall میباشد شما میتوانید از فایلهای obj 64 بیتی تولید شده توسط BASM در دلفی استفاده کنید اسمبلر و سورس را میتوانید از زیر دانلود کنید
فایل ابجکت مورد نظر را میتوانید از زیر دریافت کنید
حالا میتوانید پروژه را کامپایل و اجرا کنید.
حالا سورس زیر را دانلود کرده و با کامند زیر کامپایل کنید
استفاده از zt0 فراخوانی STDCALL را حذف میکند که همانند masm بدون این فراخوانی شود سورس برنامه را میتوانید از لینک زیر دانلود کنید
توجه داشته باشید که راهنمای {$defines} در ابتدای یونیت قرار میگیرد در مجموع 3 نوع object file تولید شده برای cof های 32 بیتی تعریف شده از اعلان USINGTASM و تعریف نشده از USINGMASMCOFF استفاده کنید
فایلهای تولید شده را با اعلان L$ در دلفی فراخوانی میکنید به عنوان مثال اگر یک فایل با نام myCompiledAsmFile.obj در اختیار داشته باشید تنها کافیست راهنما را به صورت بنویسید البته به شرطی که فایل ابجکت فورمت مورد شناسایی delphi باشد دلفی تنها فایلهای ابجکت 32 بیتی OEM را میپزیرد و فایلهای COFF قبول نیست همه اسمبلرها OEM تولید نمیکنند TASM یکی از انهاست که نسخه کامند لاین ان به همراه دلفی نصب میشود اما کار بزرگی که اکمپانی دلفی اجام داد در مورد استفاده از هر 2 فورمت coff و oem برای 64 بیتی بود اسمبلر 64 بیتی masm یا JWasm را میتوانید برای این منظور استفاده کنید
کد اسمبلی
کد دلفی برای استفاده از obj file تولید شده از این کد
دانلود سورس مثال 64 بیتی
منبع
درنسخه های مختلف دلفی همیشه یک اسمبلر بنام tasm32 وجود دارد که با خط فرمان کار میکند بعضی ها فکر میکنند که tasm32 مرده ولی در حقیقت این طور نیست درسته که بروز نمیشه ولی یکی از بهترین اسمبلر ها برای استفاده در دلفی میباشد کسانی هم که از masm میاکروسافت استفاده میکنند شاید خوشحال شوند که tasm همخوانی زیادی با masm دارد هنگامی که شما از حالت ideal استفاده نکنید به این امر پی خواهید برد در این مقاله شما خواهید دانست که چگونه از فایلهای کامپایل شده در tasm و masm در دلفی استفاده کنید البته فایلهای کامپایل شده با masm گارانتی زیادی ندارند توجه داشته باشید که اگر از delphi xe2 استفاده میکنید کدها کمی متفاوت میباشد
دانلود tasm و سورس مثال
کد:
http://www.atelierweb.com/articles/Assembly/asmtasm.zip
کد:
command line:
<path>\tasm32 asmtasm.asm
کد:
http://www.atelierweb.com/articles/Assembly/Delphi5AndAsm.zip
دانلود masm نسخه 0.8 همرا با سورس مثال
کد:
http://www.atelierweb.com/articles/Assembly/asmmasm.zip
کد:
command line:
ml /c /omf asmmasm.asm
JWasm -omf asmmas.asm
حالا شما نیاز به fix کردن OBJ OMF بدست امده برای سازگار کردن ان با کامپایلر دلفی دارید که این کار را میتوانید با برنامه OMF2D انجام دهید برنامه و کامند انرا میتوانید از زیر دانلود کنید
کد:
http://www.atelierweb.com/articles/Assembly/Delphi5AndAsm.zip
<path>\omf2d asmmasm.obj asmmasm_d.obj
در اینجا ما از delphi xe2 برای این کار استفاده میکنیم که قابلیتهای لازم برای اجرای این تکنیک را داراست یکی از انها استفاده از فایلهای obj 64 بیتی و استفاده از فایلهای ابجکت COFF تولید شده توسط کامپایلرهای مایکروسافت میباشد کامپایلر Tasm 64 بیتی وجود ندارد اما تعدادی از اسمبلرها وجو دارند که فایلهای تولید شده توسط انها در دلفی قابل استفاده میباشد برای این کار شما میتوانید از Masm یا JWasm استفاده کنید استفاده از ابجکت فایلهای 64 بیتی در دلفی اسانتر از 32 بیتی میباشد زیرا حالت فراخوانی یک روتین توسط یک تابع به صورت FastCall میباشد شما میتوانید از فایلهای obj 64 بیتی تولید شده توسط BASM در دلفی استفاده کنید اسمبلر و سورس را میتوانید از زیر دانلود کنید
کد:
http://www.atelierweb.com/articles/Assembly/asmrotines64.zip
command line:
<path>\jwasm -c -win64 -Zp8 asmrotines64.asm
کد:
http://www.atelierweb.com/articles/Assembly/DelphiXE2Asm.zip
حالا سورس زیر را دانلود کرده و با کامند زیر کامپایل کنید
کد:
http://www.atelierweb.com/articles/Assembly/asmcoff.zip
<path>\jwasm -coff -zt0 asmcoff.asm
کد:
http://www.atelierweb.com/articles/Assembly/DelphiXE2Asm.zip
فایلهای تولید شده را با اعلان L$ در دلفی فراخوانی میکنید به عنوان مثال اگر یک فایل با نام myCompiledAsmFile.obj در اختیار داشته باشید تنها کافیست راهنما را به صورت
کد:
$L myCompiledAsmFile.obj
کد اسمبلی
کد:
32-bit ASM code:
; The default is to compile with
; JWASM
; <path>\jwasm -omf asmFile32.asm
;To compile with TASM32
; <path>\tasm32.exe asmFile32.asm
; Remove the semi-colon below:
; _TASM_ EQU 1
IFDEF _TASM_
extern MessageBoxW : NEAR
public showMsgGetArray32
public addValues32
ELSE
externdef MessageBoxW : NEAR
ENDIF
.386
.model flat
.data
myReturnString dw "I"," ","a","m"," ","b","a","c","k"," ","i","n"
dw " ","D","e","l","p","h","i","!",0
endOfString dw 0
.code
addValues32 proc
add eax, edx
ret
addValues32 endp
showMsgGetArray32 proc
push edi
push esi
push dword ptr 0
push eax
push edx
push dword ptr 0
mov edi, ecx ; Save the return pointer to EDI
; because we need ECX as a
; counter and EDI is the destination
; pointer in a rep movsw instruction
call MessageBoxW
mov esi, offset myReturnString
mov ecx, offset endOfString - offset myReturnString
shr ecx, 1
rep movsw
pop esi
pop edi
ret
showMsgGetArray32 endp
end
64-bit ASM code:
;To compile with MASM
;<path>\ml64.exe asmFile64.asm
;Compile with JWASM
;<path>\jwasm -win64 asmFile64.asm
externdef MessageBoxW : NEAR
.data
myReturnString dw "I"," ","a","m"," ","b","a","c","k"," ","i","n"
dw " ","D","e","l","p","h","i","!",0
endOfString dw 0
.code
;General rule: Integer and pointer arguments are passed
;left to right in RCX, RDX, R8 and R9
;Simple results are returned in RAX
addValues64 proc
mov rax,rcx
add rax, rdx
ret
addValues64 endp
;The general rule is integer and pointer arguments are passed
;left to right in RCX, RDX, R8 and R9
;HOWEVER, when there is a large return value, this is the case here,
;RCX contains a pointer to the return space when the callee
;is called and all Registers usage are pushed one to the right
showMsgGetArray64 proc
push rsi
push rdi
push rbx
push rbp
sub rsp, 28h
xor r9, r9
mov rbx, rcx
mov rax, rdx
mov rdx, r8
mov r8, rax
xor rcx, rcx
call MessageBoxW
mov rdi, rbx
mov rsi, offset myReturnString
mov ecx, offset endOfString - offset myReturnString
shr ecx, 1
rep movsw
add rsp, 28h
pop rbp
pop rbx
pop rdi
pop rsi
ret
showMsgGetArray64 endp
end
کد:
unit asmTest;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm2 = class(TForm)
GroupBox1: TGroupBox;
btAdd: TButton;
lblInt1: TLabel;
edInt1: TEdit;
edInt2: TEdit;
lblInt2: TLabel;
GroupBox2: TGroupBox;
lblCaption: TLabel;
Label2: TLabel;
btGo: TButton;
edCaption: TEdit;
edMessage: TEdit;
procedure btAddClick(Sender: TObject);
procedure btGoClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
type
bigarray = array[0..127] of char;
{$IFDEF CPUX86}
{$L asmFile32.obj}
function addValues32(val1: integer; val2: integer): integer; external;
function showMsgGetArray32(myCaption: string; myText : string): bigarray; external;
{$ELSE}
{$IFDEF CPUX64}
{$L asmFile64.obj}
function addValues64(val1: integer; val2: integer): integer; external;
function showMsgGetArray64(myCaption: string; myText : string): bigarray; external;
{$ENDIF}
{$ENDIF}
implementation
{$R *.dfm}
procedure TForm2.btAddClick(Sender: TObject);
var
retValue : dword;
value1, value2 : dword;
begin
value1 := strToInt(edInt1.Text);
value2 := strToInt(edInt2.Text);
{$IFDEF CPUX86}
retValue := addValues32(value1, value2);
{$ELSE}
{$IFDEF CPUX64}
retValue := addValues64(value1, value2);
{$ENDIF}
{$ENDIF}
showMessage('The result is: '+inttostr(retValue));
end;
procedure TForm2.btGoClick(Sender: TObject);
var
retValue : bigArray;
begin
{$IFDEF CPUX86}
retValue := showMsgGetArray32(edCaption.Text, edMessage.Text);
{$ELSE}
{$IFDEF CPUX64}
retValue := showMsgGetArray64(edCaption.Text, edMessage.Text);
{$ENDIF}
{$ENDIF}
showMessage(retValue);
end;
end.
دانلود سورس مثال 64 بیتی
کد:
http://www.atelierweb.com/articles/DelphiAsm.zip
منبع
کد:
http://www.atelierweb.com/articles/delphi64assemblylanguage.htm
http://www.atelierweb.com/articles/DelphiAndAsmP1.htm
http://www.atelierweb.com/articles/DelphiAndAsmP2.htm