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
هر کجای کد مشکل داشتید بگید تا توضیح بدم.
نشان بدم.
و ثابت کنم فقط شما نیستید که برنامه های سیستمی می نویسید ما هم می تونیم.
اول طرز کار یک اسمبلر را به شما به صورت عملی و با یک مثال نشان می دهم.
خوب فرض میکنیم برنامه ما می خواهد کد اسمبلی زیر را تبدیل به یک برنامه اجرایی کند.
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
هر کجای کد مشکل داشتید بگید تا توضیح بدم.