Function NumberExpression() As Variant
Dim CToHex As Boolean
SkipBlank
If IsSymbol("$") Then Skip: CToHex = True
While IsNumeric(Mid(Source, SourcePos, 1)) Or Mid(Source, SourcePos, 1) = "-" Or _
Mid(Source, SourcePos, 1) = "A" Or Mid(Source, SourcePos, 1) = "B" Or _
Mid(Source, SourcePos, 1) = "C" Or Mid(Source, SourcePos, 1) = "D" Or _
Mid(Source, SourcePos, 1) = "E" Or Mid(Source, SourcePos, 1) = "F"
NumberExpression = NumberExpression & Mid(Source, SourcePos, 1)
Skip
Wend
If CToHex = True Then NumberExpression = CLng("&H" & NumberExpression)
End Function
Sub Expr_Sub(Name As String, Value As Long)
AddCodeByte &H81, &H2D
AddCodeFixup Name
AddCodeDWord Value
End Sub
Sub Expr_MovEAX(Name As String)
'mov eax,[name]
AddCodeByte &HA1
AddCodeFixup Name
End Sub
Sub Expr_MovEAXAdress(Name As String)
'mov eax,name
AddCodeByte &HB8
AddCodeFixup Name
End Sub
Sub Expr_MovECX(Name As String)
'mov ecx,value
AddCodeByte &H8B, &HD
AddCodeFixup Name
End Sub
Sub Expr_Compare(VarI As String, VarII As String)
Expr_MovEAX VarI
Expr_MovEDX VarII
'cmp eax,edx
AddCodeByte &H39, &HD0
End Sub
Sub InitPEHeader()
'Signature = "PE"
AddLinkByte &H50, &H45, &H0, &H0
'Machine 0x014C;i386
AddLinkByte &H4C, &H1
'NumberOfSections = 3
AddLinkByte &H3, &H0
'TimeDateStamp
AddLinkByte &H0, &H0, &H0, &H0
'PointerToSymbolTable = 0
AddLinkByte &H0, &H0, &H0, &H0
'NumberOfSymbols = 0
AddLinkByte &H0, &H0, &H0, &H0
'SizeOfOptionalHeader
AddLinkByte &HE0, &H0
'Characteristics
AddLinkByte &H8F, &H81
'Magic
AddLinkByte &HB, &H1
'MajorLinkerVersion
AddLinkByte &H1
'MinerLinkerVersion
AddLinkByte &H0
'SizeOfCode
AddLinkByte &H0, &H0, &H0, &H0
'SizeOfInitializedData
AddLinkByte &H0, &H0, &H0, &H0
'SizeOfUnInitializedData
AddLinkByte &H0, &H0, &H0, &H0
'AddressOfEntryPoint
AddLinkByte &H0, &H20, &H0, &H0
'BaseOfCode
AddLinkByte &H0, &H0, &H0, &H0
'BaseOfData
AddLinkByte &H0, &H0, &H0, &H0
'ImageBase
AddLinkByte &H0, &H0, &H40, &H0
'SectionAlignment
AddLinkByte &H0, &H10, &H0, &H0
'FileAlignment
AddLinkByte &H0, &H2, &H0, &H0
'MajorOSVersion
AddLinkByte &H1, &H0
'MinorOSVersion
AddLinkByte &H0, &H0
'MajorImageVersion
AddLinkByte &H0, &H0
'MinorImageVersion
AddLinkByte &H0, &H0
'MajorSubSystemVerion
AddLinkByte &H4, &H0
'MinorSubSystemVerion
AddLinkByte &H0, &H0
'Win32VersionValue
AddLinkByte &H0, &H0, &H0, &H0
'SizeOfImage
AddLinkByte &H0, &H40, &H0, &H0
'SizeOfHeaders
AddLinkByte &H0, &H2, &H0, &H0
'CheckSum
AddLinkByte &H94, &H6B, &H0, &H0
'SubSystem = 2:GUI; 3:Console
AddLinkByte AppType
AddLinkByte &H0
'DllCharacteristics
AddLinkByte &H0, &H0
'SizeOfStackReserve
AddLinkByte &H0, &H10, &H0, &H0
'SizeOfStackCommit
AddLinkByte &H0, &H10, &H0, &H0
'SizeOfHeapReserve
AddLinkByte &H0, &H0, &H1, &H0
'SizeOfHeapRCommit
AddLinkByte &H0, &H0, &H0, &H0
'LoaderFlags
AddLinkByte &H0, &H0, &H0, &H0
'NumberOfDataDirectories
AddLinkByte &H10, &H0, &H0, &H0
'Export_Table
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'Import_Table
AddLinkByte &H0, &H30, &H0, &H0, &H80, &H0, &H0, &H0
'ReSource_Table
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'Exception_Table
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'Certificate_Table
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'Relocation_Table
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'Debug_Data
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'Architecture
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'Global_PTR
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'TLS_Table
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'Load_Config_Table
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'BoundImportTable
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'ImportAddressTable
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'DelayImportDescriptor
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'COMplusRuntimeHeader
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
'Reserved
AddLinkByte &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0
End Sub
Public Sub DeclareFasmPath()
FasmPath = InputBox("Specify the fasm path (ex: C:\fasm164\) without the exe file." & vbNewLine & "You need to have 'flat assembler for DOS' installed. You only require this if you want to use inline assembler. (http://www.flatassembler.net)", "Fasm Path", FasmPath)
SaveSetting "Libry", "Settings", "FasmPath", FasmPath
End Sub
ProgramID = Shell(FasmPath & "fasm.exe C:\LIA.ASM C:\LIA.EXE", vbHide)
If Dir("C:\LIA.ASM") <> "" Then Kill "C:\LIA.ASM"
Хакер писал(а):В общем, это пример ошеломляюще дрянных практик, как в плане компиляции, так и в плане решения прикладных сопутствующих проблем (вроде создания временных файлов).
jangle писал(а):Ну ладно пусть код дрянь. Но ведь компилятор работает же! Много тебе приходилось видеть компиляторов полностью написанных на VB6 которые анализирует Си-подобный язык и генерируют на его основе полноценный Win32 PE EXE, без всяких внешних костылей? Я например первый раз такой вижу.
Ну Хакер, тебе пора уже давно присвоить звание "Разрушителя легенд про VB", ты и без компилятора Си уже неплохо отличился. Я до сей поры пребываю в легком шоке от твоих изобретений ИМХО намного лучше было бы изобрести встроеннный ассемблер в VB. Сам то ассемблер написать не такая уж большая проблема, но вот совместить его с VB, что бы это все совместно и весело работало, тут все очень не просто...Хакер писал(а):Типа, думали на VB6 нельзя написать компилятор Си? (Почему-то лидер ответов в глупых опросах «чего нельзя написать на ВБ»). А-вот-фиг.
Хакер писал(а):но, имхо, это вредная в рамках VB вещь
Хакер писал(а):Нет, но я делал такой на Си.
jangle писал(а):Выложи его в форум, хочется посмотреть.
Хакер писал(а):Без Add-in-а его не сделать. С Add-In-ом — вообще элементарно,
Хакер писал(а):Вот я думаю, а что если правда написать компилятор Си-подобного языка на VB? Причём оформив его как цикл статей, каждая статья — определённый этап (уровень). Думаю, это могло бы сделать кое-какой приток посетителей на форум.
Qwertiy писал(а):Какая-то урезанная версия Си или что-то другое?
Сам то поди знаешь, и еще как знаешь Вот и мне захотелось.Хакер писал(а):Какая разница, как это работает.
Хакер писал(а):Вот я думаю, а что если правда написать компилятор Си-подобного языка на VB? Причём оформив его как цикл статей, каждая статья — определённый этап (уровень).
А почему Си? Нет, сама идея (цикл обучающих статей) конечно классная, но может не Си, а что нибудь в виде дополнения, расширяющего возможности VB, ИМХО это будет полезнее. Например изготовление TLB шек средствами VB, безо всяких мутных MIDL 'ов.Хакер писал(а):Дескать, проект делался исключительно в целях обучения/забавы
Грубо говоря, VB создает объект из твоей dll и передает ему ссылку на свою объектную модель (VBIDE), с которой ты можешь делать все что угодно. Addin-хэлловорлд доступен в самом VB через New Project — Addin.как это работает
Хакер писал(а):Вот я думаю, а что если правда написать компилятор Си-подобного языка на VB? Причём оформив его как цикл статей, каждая статья — определённый этап (уровень). Думаю, это могло бы сделать кое-какой приток посетителей на форум.
NashRus писал(а):Тебе надо мыслить другими категориями, а не приток посетителей на форум.
NashRus писал(а):Думай над своим проктом и готовь его к публикации.
jangle писал(а):Для этого компилятор должен реально использоваться пользователями.
jangle писал(а):Вообще за мобильными платформами будущее.
Хакер писал(а):Я не хочу делать компилятор, которым будут пользоваться. Для этого я даже специально, в шутку говоря, могу сделать так, чтобы для компиляции требовалось собрать легкий пазл Это чтобы отбить желание использовать его в рабочей деятельности.
Я хочу показать, как это делается, какой принцип. Плюс, на VB. Из-за того, что в VB я не имею макросы, полноценные указатели и тому подобные вещи, я скомпенсирую это за счёт прозрачной работы с COM (буду максимально использовать классы и интерфейсы).
[/quote]Я не хочу участвовать в приближении этого ужасного будущего
jangle писал(а):Это никому не нужно. Описание как делается есть в большом количестве литературы. Нужен рабочий исходник компилятора. Проблема в том, что человек пишущий книгу о компиляции неспособен сам написать компилятор.
jangle писал(а):аких примеров масса, большинство книжек по-компиляции содержат нерабочие исходники.
Потому, что эти книжки пишут люди не умеющие программировать, зато умеющие прекрасно надувать щеки. При этом вся теоретическая часть просто копипастится из Ульмана и Ахо.
А практической реализации в коде нет, или она не работает.
Сейчас этот форум просматривают: AhrefsBot и гости: 42