PDA

View Full Version : استفاده از کد اسمیلی در دلفی و یا تبدیل کد اسمبلی به دلفی



khakestany
جمعه 01 اسفند 1393, 10:43 صبح
با سلام
من برای خوندن اطلاعات یک پورت از اسمبلی استفاده کردم . چطور میتونم این کد را در دلفی انجام دهم و یا کد نوشته شده را در دلفی استفاده کنم. کد نوشته شده در اسمبلی به شرح زیر است:


model small
.code
org 100h
r_f_port proc
push bx
push cx
push dx
;***************init port************************
push bx
mov ah,0
mov dx,1
mov al,0EFh
int 14h
pop bx
;************************************************
mov cx,5000
push 49
or bx,bx
jnz cont1
pop dx
push 50
jmp cont7
;; data not ready
cont1:
pop dx
push 50
dec cx
jcxz cont7
pop dx
push 51
call delay1
mov dx,03fdh
in al,dx
test al,1
jz cont1
;; CX for counter
mov cx,0
cont2:
mov dx,03f8h
in al,dx
test al,080h
jz cont2
cont3:
mov [bx],al
inc bx

inc cx
cmp cx,5
je cont4
cont5:
call delay1
mov dx,03fdh
in al,dx
test al,1
jz cont5

mov dx,03f8h
in al,dx
jmp cont3
cont4:
mov al,[bx-5]
and al,7
mov [bx],al

mov al,[bx-5]
and al,16
mov [bx+1],al

mov al,[bx-4]
and al,8
mov [bx+2],al

mov dl,byte ptr[bx-1] ; save lower byte
mov dh,byte ptr[bx-2]
mov al,byte ptr[bx-3]
mov ah,byte ptr[bx-4] ; save higher byte

and ax,077fh
shl al,1
shr ax,1
push ax
shr ax,1
shr ax,1
mov [bx+6],ax

shl dl,1
shr dx,1
pop ax
mov cl,14
shl ax,cl
or dx,ax
mov word ptr[bx+4],dx

cont7:
pop ax
pop dx
pop cx
pop bx
mov [bx],al
retf
r_f_port endp
;************************************************
delay1 proc
push dx
mov dx,8000
loop1:
dec dx
push dx
pop dx
cmp dx,0
jne loop1
pop dx
ret
delay1 endp
;***********************************************
end r_f_port

یوسف زالی
جمعه 01 اسفند 1393, 11:10 صبح
سلام.
در دلفی می تونید با گذاشتن کلمه asm مستقیم اسمبلی بنویسید.

khakestany
جمعه 01 اسفند 1393, 21:47 عصر
متاسفانه با استفاده از asm بعضی از دستورها فراخوانی نمیشن .

lord_viper
یک شنبه 03 اسفند 1393, 08:57 صبح
اگه پورت پارالل هست میتونین از io32.dllیا input32.dll استفاده کنید که روی همه ویندوزها هم جواب میده
اگه سریال هست کامپوننت و کد به دلفی براش هست

بهروز عباسی
دوشنبه 04 اسفند 1393, 11:07 صبح
کتاب آموزش استفاده از اسمبلی در دلفی (البته 32بیتی) (http://barnamenevis.org/showthread.php?401895-%DA%A9%D8%AA%D8%A7%D8%A8-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%A7%D8%B3%D9%85%D8%A8%D9%84%DB%8C-%D8%AF%D8%B1-%D8%AF%D9%84%D9%81%DB%8C-(%D8%A7%D9%84%D8%A8%D8%AA%D9%87-32%D8%A8%DB%8C%D8%AA%DB%8C))

golbafan
دوشنبه 04 اسفند 1393, 11:16 صبح
در دلفی کدهای اسمبلی رو نمیشه 64 بیتی کامپایل کرد

BORHAN TEC
دوشنبه 04 اسفند 1393, 12:16 عصر
در دلفی کدهای اسمبلی رو نمیشه 64 بیتی کامپایل کرد

اگه درست یادم مونده باشه توی XE2 میشه این کار رو انجام داد. :متفکر:

golbafan
دوشنبه 04 اسفند 1393, 12:34 عصر
اگه درست یادم مونده باشه توی XE2 میشه این کار رو انجام داد. :متفکر:

نمیشه حتی در xe7

BORHAN TEC
دوشنبه 04 اسفند 1393, 14:20 عصر
نمیشه حتی در xe7

سلام، بله در نسخه های جدیدتر دلفی نمیشه، منظور من فقط و فقط نسخه XE2 و کامپایلر 64 بیتی دلفی هست. این کد رو در سایت Stackoverflow پیدا کردم که در خصوص delphi xe2 هست:
procedure CopySwapPixel(const Source, Destination: Pointer);
{$IFDEF CPUX64}
asm
mov al,[rcx+0]
mov ah,[rcx+1]
mov [rdx+2],al
mov [rdx+1],ah
mov al,[rcx+2]
mov ah,[rcx+3]
mov [rdx+0],al
mov [rdx+3],ah
end;
{$ELSE}
asm
push ebx //[DCC Error]: E2116 Invalid combination of opcode and operands
mov bl,[eax+0]
mov bh,[eax+1]
mov [edx+2],bl
mov [edx+1],bh
mov bl,[eax+2]
mov bh,[eax+3]
mov [edx+0],bl
mov [edx+3],bh
pop ebx //[DCC Error]: E2116 Invalid combination of opcode and operands
end;
{$ENDIF}
یه بنده خدایی هم یادمه که میگفت کامپایلر 64 بیتی در نسخه XE2 کدهای اسمبلی رو کامپایل میکنه و میشه در اون از inline assembly استفاده کرد. من روی سیستمم xe2 رو ندارم و نمیتونم تستش کنم ولی بالای 90% مطمعن هستم که این ویژگی در نسخه یاد شده وجود داره.

golbafan
دوشنبه 04 اسفند 1393, 15:25 عصر
من الان تست کردم و گیر داد (فکر کنم برای cpu) های مختلف فرق داره !!! :چشمک:

اما چند تا سایت دیدم که توش یا xe2 اینکا انجام شده بود

BORHAN TEC
دوشنبه 04 اسفند 1393, 15:39 عصر
نمیدونم، شاید من هنوز مفهوم inline assembly رو درست درک نکردم. :متفکر: همین الان کد رو توی XE7 تست کردم و جالبه که میشه دیباگش کرد!!!
این هم از عکس مربوطه:

golbafan
دوشنبه 04 اسفند 1393, 15:44 عصر
چه جالب! پس شاید مشکل از cpu من هست amd64

راستی شما پروسیجر رو فراخونی کردید؟

BORHAN TEC
دوشنبه 04 اسفند 1393, 15:47 عصر
چه جالب! پس شاید مشکل از cpu من هست amd64

نمیدونم، ولی بعید به نظر میرسه که ربطی به این موضوع داشته باشه. :متفکر: لطفاً دوستانی که از این موضوع اطلاع دارند توضیح بدن که الان دقیقاً چی به چیه! :گیج:
cpu سیستم من اینه:

Intel(R) Core(TM)i5-4200M CPU @ 2.50GHz


راستی شما پروسیجر رو فراخونی کردید؟

بله

Mask
دوشنبه 04 اسفند 1393, 22:55 عصر
دقیقا بر میگرده به معماری Cpu حتی بر روی cpu های AMD شما نمیتونید بعضی از ایمولاتورهایی که دارند Arm رو شبیه سازی میکنند، نصب کنید.

بهروز عباسی
سه شنبه 05 اسفند 1393, 19:23 عصر
در نسخه های جدید هم همچنان امکان استفاده از Inline Asm وجود داره مشکل با x64 اه که اینم راهی داره. توی کدهای ۶۴ بیت میشه از inline asm استفاده کرد ولی باید کل procedure یا function رو با اسمبلی بنویسی, یعنی بدنه تابع باید با asm ... end;باز و بسته بشه و نه begin ... end; .:متفکر:

golbafan
سه شنبه 05 اسفند 1393, 22:03 عصر
کد رو intel corei5 اجرا کردم درست کار کرد:لبخند: