PDA

View Full Version : حرفه ای: ساخت اسمبلر با وی بی



pcdownload.bloghaa.com
شنبه 08 آبان 1389, 14:41 عصر
خوب دوستان امروز می خوام قدرت vb را به برنامه نویسان دلفی و سی پلاس پلاس و..
نشان بدم.
و ثابت کنم فقط شما نیستید که برنامه های سیستمی می نویسید ما هم می تونیم.

اول طرز کار یک اسمبلر را به شما به صورت عملی و با یک مثال نشان می دهم.

خوب فرض میکنیم برنامه ما می خواهد کد اسمبلی زیر را تبدیل به یک برنامه اجرایی کند.

MOV AH, 09
MOV DX, 0109
INT 21
INT 20
DB 'Hello' 32
DB 'World !' 07
DB '$'


یک پروژه جدید در وی بی باز کرده ویک تکست باکس و یک کامند باتن در فرم قرار داده ودر
قسمت جنرال کد زیر را کپی کنید.


Option Explicit
Option Compare Text
Const AH = 180
Const AL = 176
Const AX = 184
Const BX = 187
Const CX = 185
Const DX = 186
Private program(40) As String


Private Sub Command1_Click()
On Error Resume Next
Dim n As Integer, nCounter As Integer, nMen As Long
Dim chCmd As String, strHex As String
Dim ii, k As Long
Kill "c:\test.com"
Open "c:\test.com" For Binary As #1
For n = LBound(program) To UBound(program)
If Len(program(n)) <> 0 Then chCmd = program(n) Else _
Exit For

If InStr(chCmd, "mov") <> 0 Then
'chr(97)=a ... chr(100)=d
For ii = 97 To 100
If InStr(chCmd, Chr(ii)) <> 0 Then
nCounter = InStr(chCmd, Chr(ii))
Exit For
End If
Next ii
nMen = Mnem(Mid$(chCmd, nCounter, 2))
k = InStr(nCounter, chCmd, ",") + 1
strHex = LTrim(Mid(chCmd, k))
If Len(strHex) <= 2 Then
strHex = Hexer(strHex)
Put #1, , Chr$(nMen)
Put #1, , Chr$(strHex)
If nMen = AX Or nMen = BX Or nMen = CX Then Put #1, , Chr$(0)
Else
If Len(strHex) = 3 Then strHex = "0" & strHex
Put #1, , Chr$(nMen)
Put #1, , Chr$(Val(Hexer(Right$(strHex, 2))))
Put #1, , Chr$(Val(Hexer(Left$(strHex, 2))))
If nMen = AX Or nMen = BX Or nMen = CX Then Put #1, , Chr$(0)
End If
ElseIf InStr(chCmd, "int") <> 0 Then
nCounter = 0
nCounter = Val(LTrim(Mid(chCmd, 4)))
Put #1, , Chr$(205)
Put #1, , Chr$(nCounter + 12)
ElseIf InStr(chCmd, "db") <> 0 Then
Dim chstr As String
chstr = ""
chstr = Mid(chCmd, InStr(1, chCmd, "'") + 1, InStrRev(chCmd, "'") - InStr(1, chCmd, "'") - 1) + Chr(Val(Mid(chCmd, InStrRev(chCmd, " ") + 1)))
Put #1, , chstr
End If
Next n
Close #1
Shell "c:\test.com", vbNormalFocus
End Sub


Private Sub Form_Load()
Dim n As Integer

program(0) = "MOV AH, 09"
program(1) = "MOV DX, 0109"
program(2) = "INT 21"
program(3) = "INT 20"
program(4) = "DB 'Hello' 32"
program(5) = "DB 'World !' 07"
program(6) = "DB '$'"

For n = LBound(program) To UBound(program)
If Len(program(n)) <> 0 Then _
Text1.Text = Text1.Text & program(n) & vbCrLf
Next n

End Sub

Function Hexer(no As String) As String
If Len(no) <= 2 Then
If Len(no) = 1 Then no = CStr(Val("0" & Trim(str$(no))))
Hexer = CStr(Val("&h" & CStr(no)))
Exit Function
End If
End Function

Function Mnem(str As String) As Long
Select Case str
Case "ah"
Mnem = AH
Case "ax"
Mnem = AX
Case "bx"
Mnem = BX
Case "cx"
Mnem = CX
Case "dx"
Mnem = DX
Case "al"
Mnem = AL
End Select
End Function




هر کجای کد مشکل داشتید بگید تا توضیح بدم.

Felony
شنبه 08 آبان 1389, 16:20 عصر
خوب دوستان امروز می خوام قدرت vb را به برنامه نویسان دلفی و سی پلاس پلاس و..
نشان بدم.
و ثابت کنم فقط شما نیستید که برنامه های سیستمی می نویسید ما هم می تونیم.
اینجا یه انجمن تخصصی هست نه فستیوال قدرت به رخ کشیدن ، هر زبانی برای یک کاری ساخته شده و یکسری قابلیت داره ، این کاری که شما انجام دادی اسمش برنامه نویسی سیستمی نیست ، شما برداشتی تو یه فایل دستورات اسمبلی نوشتی و به این میگی اسمبلر !

در کل VB امکان استفاده از توابع Assembly رو به صورت inLine نداره ، پس نمیشه بین کدهای VB نوشته شده تو برنامه از اسمبلی استفاده کرد در صورتی که با توجه به کاربردهای ++VC یا دلفی شما میتونید با دایرکتیو ASM به کامپایلر اعلان کنید که این قسمت از کد اسمبلی هست و نتیجه رو عینا در خروجی exe خود برنامه یا dll تولید شده توسط کامپایلر مشاهده کنید .

راستی به این کار نمیگن نوشتن اسمبلر ، اسمبلر به برنامه ای گفته میشه که یه کد زبان بالا رو به اسمبلی و در آخر کد ماشین تبدیل کنه !

vbhamed
شنبه 08 آبان 1389, 17:02 عصر
سلام

البته ايشون هم دستورات اسمبلي رو ننوشته تو فايل و به نوعي كامپايلش كرده و فايل .com رو تشكيل داده
ولي خب اون اسمبلي كه در سي يا دلفي نوشته ميشه كجا و اين كجا

اما به نظر من اگر گسترشش بدين خوب ميشه

xxxxx_xxxxx
شنبه 08 آبان 1389, 23:13 عصر
سلام،
جالب بود. متشکرم.



شما برداشتی تو یه فایل دستورات اسمبلی نوشتی و به این میگی اسمبلر !

توی فایل دستور اسمبلی نوشته نمیشه. دقیقاً کد ماشین هست که نوشته میشه. یعنی معادل نویسی میشه.




راستی به این کار نمیگن نوشتن اسمبلر ، اسمبلر به برنامه ای گفته میشه که یه کد زبان بالا رو به اسمبلی و در آخر کد ماشین تبدیل کنه ! اسمبلر فقط دستور اسمبلی رو به زبان ماشین تبدیل میکنه. تبدیل کد زبان سطح بالا به اسمبلی توسط کامپایلرها انجام میشه.

pcdownload.bloghaa.com
شنبه 08 آبان 1389, 23:23 عصر
دوست عزیز آقای مجتبی تاجیک من با نظرات شما چندان موافق نیستم.

1.این که هر زبانی برای یک کار خاص ساخته شده است کاملا اشتباه است.
شاید بسیاری با نظر من موافق باشند که در ویژوال بیسیک غیرممکن وجود ندارد.

2.برنامه ای که کدهای زبان سطح بالا را به اسمبلی تبدیل میکند کامپایلر نام دارد.
3.برنامه ای که کد های اسمبلی را به زبان ماشین تبدیل می کند اسمبلر نام دارد.
4.یک اسمبلر برنامه ای سیستمی است.
5.در ویژوال بیسیک نیز مانند زبان دلفی و سی پلاس پلاس امکان استفاده Inline از کد های
اسمبلی وجود دارد.(سورس ضمیمه شده را مشاهده بفرمایید.)
6.کار اسمبلر هم در نهایت تبدیل کد های اسمبلی به 0و1 و نوشتن آن در یک فایل است.
البته مثالی که من زدم یک مثال ساده برای یاد گیری بود.
اما سورس یک اسمبلر تمام و کمال 32 بیتی را با ویژوال بیسیک در پست های بعدی قرار
خواهم داد.
--------------------------------------------------------------------------------------------
سوررسی که ضمیمه کردم یک لیست طولانی را مرتب می کنه .
دو تا دکمه هست که یکی این کار را با وی بی و یکی همین کار را با دستورات اسمبلی
به صورت inline داخل ویژوال بیسیک انجام میده. و مطمنا سرعت کد های اسمبلی بیشتره.

Felony
یک شنبه 09 آبان 1389, 07:15 صبح
توی فایل دستور اسمبلی نوشته نمیشه. دقیقاً کد ماشین هست که نوشته میشه. یعنی معادل نویسی میشه.
معلومه که برای اجرای یک فایل باید کد ماشین تولید شده باشه !


اسمبلر فقط دستور اسمبلی رو به زبان ماشین تبدیل میکنه. تبدیل کد زبان سطح بالا به اسمبلی توسط کامپایلرها انجام میشه.
بله ، سرم شلوغ بود بد توضیح دادم .

1.این که هر زبانی برای یک کار خاص ساخته شده است کاملا اشتباه است.
شاید بسیاری با نظر من موافق باشند که در ویژوال بیسیک غیرممکن وجود ندارد.
بی خیال پسر ، یکم رو حرفی که میزنی فکر کن ... !

حوصله ندارم اینجا جواب بدم و در آخر بیان بگن تاپیک رو از بحث اصلیش خارج کردی ، ولی تحقیق کن و بعد اینطور قاطعانه نظر بده .


4.یک اسمبلر برنامه ای سیستمی است.
برنامه شما اینطور نیست ، مثلا همین سورسی که ضمیمه کردید و نویسندش ادعا کرده از اسمبلی به صورت inLine استفاده کرده ، توضیحاتش رو بخونید و بعد خود سورس رو هم بخونید :


' VB "Inline" ASM
'
' Arne Elster 2007 / 2008


' all samples are called with CallWindowProc,
' so they must accept 4 arguments
'
' a1: [ebp+12]
' a2: [ebp+16]
' a3: [ebp+20]
' a4: [ebp+24]

حالا من نمیدونم از کی تاحالا استفاده از تابع API شده برنامه نویسی سیستمی ، اسم اون کار هم استفاده به صورت inLine نیست تو فایل های ASMMemory و ASMBler هم نگاهی بندازی کلا میبینید که چه طور این کار رو انجام داده ، فرق ++VC و Delphi با VB هم دقیقا همین جاست .


5.در ویژوال بیسیک نیز مانند زبان دلفی و سی پلاس پلاس امکان استفاده Inline از کد های
اسمبلی وجود دارد.(سورس ضمیمه شده را مشاهده بفرمایید.)
نه مانند دلفی و ++VC ، این استفاده از اسمبلی به صورت inLine نیست ، دلفی و ++VC زمین تا آسمون در این نوع موارد با VB تفاوت دارن ؛ کافیه تو گوگل یه جست و جو ساده بکنی .

در کل فکر نکن قراره به ++VC یا دلفی به خاطر استفاده از توابع ASM به صورت inLine جایزه بدن ، شما بسته به نیازت VB رو انتخاب کردی ، لازم هم نیست این کارها رو بکنی چون اصلا VB برای تولید برنامه های RAD تولید شده بوده نه ساخت به نوعی اسمبلر و برنامه های سیستمی !

برای اینکه بحث تاپیک منحرف نشه دیگه ادامه نمیدم و تو این تاپیک کاری ندارم .

موفق باشید .

pcdownload.bloghaa.com
پنج شنبه 13 آبان 1389, 16:25 عصر
یه برنامه نویس باید فقط به هدف کار فکر کند و از هر راهی که شده به هدف برسد.
حالا از api کمک گرفته یا از هرچی بالاخره می تونه از کد های اسمبلی استفاده کنه.

برای این که جمله "در وی بی غیر ممکن وجود ندارد" را به اثبات نزدیک کنم.
سورس یک اسمبلر کامل با ویژوال بیسیک را که چند تا مثال هم توش داره رو براتون قرار
می دهم.
ضمنا سورس امولاتور بازی های game boy color را هم براتون می ذارم که به آن جمله معروف
به واقع فکر کنید. و فایل بعدی هم یک بازی برای آن امولاتور هستند.این بازی سیاه سفید است اما بازی های رنگی هم دارد که برای استفاده از رنگی باید تیک گزینهEmulate gbc را در منوی emulator بزنید.
و آخرین سورس هم نحوه استفاده از پلاگین را در وی بی نشان می دهد.

returnx
پنج شنبه 13 آبان 1389, 17:12 عصر
در وی بی غیر ممکن وجود ندارد
منم کاملا با این حرف موافقم میتونید نحوه استفاده از اشاره گر در VB هم را در این تاپیک ببینید:
http://barnamenevis.org/forum/showthread.php?t=253488