VB + ASM

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.07.2004 (Пн) 17:22

:shock:
Если честно, не понятно ни.. чего :)

С мануалом можно и помочь, давай rtf...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 12.07.2004 (Пн) 17:59

В смысле синтаксис непонятный?
Там просто по умолчанию первый параметр - это адрес VB-шной функции, показывающей MSGBOX. Это сделано для удобства отладки (IDE всё таки). Его можно и не использовать. Просто замени число из первого параметра на нужное тебе и убери CALL [EBP+8].

А запускать там очень просто. Сначала жмёшь Compile. Станет доступной кнопка Run. Вот ей и запускаешь.

Всё таки я решил что это не последний вариант IDE. Забыл кнопку экспорта в бинарник и хекс добавить. Хотя по умолчанию он и так в lasmide.bin после каждой компиляции коды скидывает.

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 12.07.2004 (Пн) 18:04

Вот исходники Help'а. Делал в своей проге ПСП (есть на моём сайте)
У вас нет доступа для просмотра вложений в этом сообщении.

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 12.07.2004 (Пн) 19:46

Приделал контекстную справку.
Качай по той же ссылке
http://basicproduction.nm.ru/ASM/LASM/LASMIDE.rar

Ещё вопрос.
Допустим «Набор серебряных пуль» участвует в проектах сайта, а твой нет.
По каким критериям ведётся отбор?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.07.2004 (Пн) 19:54

А фиг его знает...


Но скажи мне... Неужели удобно делать хэлп в этой твоей штуке? Я просто попробовал и сразу там потерялся. Я даже не отличаю, где разметка, а где текст (к примеру, текст /r). А ворд этот файл не открывает. А в виде текста, опять же, никакого смысла, потому что это же ужас...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 12.07.2004 (Пн) 20:25

Вообще то не очень удобно. Было бы время так я бы её по нормальному заделал.
У неё цель другая - учебная. Обучает RTF'у для HELP'ов.
А я её использую по 2-м причинам.
1. Я афтар :)
2. Посмотри размер HELP-фалйов. А теперь попробуй такие же в Ворде сделать.

Это всё равно что один HTML в блокноте набирает, а другой в Front Page. Причём каждый чувствует ущербность другого :)

Для моего редактора RTF нужно знать. А он именно м предназначен для обучения RTF. Ну и по совместительству продвинутый блокнот для RTF кодера.

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 12.07.2004 (Пн) 20:27

Пока бахвалился пропустил твой вопрос.
Выдели текст темы, затем правую кнопку на выделении и в меню выбери пункт "Статистика".
Она поможет тебе ориентироваться.

PS: Не, ну если не знаешь RTF'а, то можешь и в блокноте написать. А я уж сам как нибудь переформатирую.

PPS: Можно попробовать декомпилировать HELP прогой типа HELPDECO. Она по моему делает RTF, понятный WORD'у. Только прелесть блокнотного хелпа тогда потеряется.

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 12.07.2004 (Пн) 21:37

Кстати, мне не удалось вызвать многопараметерную функцию по твоему способу.
Я даже менял Rel32 на r32 (т.е. по абсолютному адресу тоже).
Я правда переписывал твой код под себя. Может и ошибся где.

Ты пробовал только для библиотек или для массивов с бинарниками тоже?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.07.2004 (Пн) 21:50

Я для всего пробовал. И из ресурсов вызывал, и из библиотек, и из памяти.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 12.07.2004 (Пн) 21:57

По поводу усовершенствований.
Появилась идея создания высокоуровневых команд, вычисляющих некоторые адреса для массивов и строк.
Для массивов: длину массива, адрес начала данных и длину элементов.
Для строк: длину строки и адрес начала данных.
Назвать можно как хотите, хоть свои именем :)

Формат такой
Команда r/m32, r/m32 . Можно и для r/m8(16) если не в лом.
Например:
String LEN Destination,Source
String ADDR Destination,Source
Можно и другой синтаксис применить. Можно вообще VB-шным синтаксисом.
Вобщем формат команды не важен, главное чтобы работала :)
Писать нужно на VB. Тогда она войдёт в модуль компилятора.

PS: Честно говоря это не моя гениальная идея. Просто наткнулся на твою статью о массивах.
Да и вспомнил дискуссии о строках.
Авось кто глянет что проект не стоит и тоже присоединится.

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 12.07.2004 (Пн) 23:20

Поверь. У меня не работает.
Это для твоей процедуры CallFunction
Я подменил прямо внутри неё FuncPointer на адрес первого элемента массива.
У меня через массив бинарники запускаются.

:00000000 55 push ebp
:00000001 89E5 mov ebp, esp
:00000003 53 push ebx
:00000004 56 push esi
:00000005 57 push edi
:00000006 B80F000000 mov eax, 0000000F
:0000000B 5F pop edi
:0000000C 5E pop esi
:0000000D 5B pop ebx
:0000000E 89EC mov esp, ebp
:00000010 5D pop ebp
:00000011 C21000 ret 0010

Dim BinArray() as byte
redim BinArray(20)
BinArray(0)=val("&H55")
BinArray(1)=val("&H89")
BinArray(2)=val("&HE5")
BinArray(3)=val("&H53")
BinArray(4)=val("&H56")
BinArray(5)=val("&H57")
BinArray(6)=val("&HB8")
BinArray(7)=val("&H0F")
BinArray(8)=val("&H00")
BinArray(9)=val("&H00")
BinArray(10)=val("&H00")
BinArray(11)=val("&H5F")
BinArray(12)=val("&H5E")
BinArray(13)=val("&H5B")
BinArray(14)=val("&H89")
BinArray(15)=val("&HEC")
BinArray(16)=val("&H5D")
BinArray(17)=val("&HC2")
BinArray(18)=val("&H10")
BinArray(19)=val("&H00")

FuncPointer = VarPtr(BinArray(0))

Запускаю и выбивает

Это адреса. Каждый раз разные. Просто для проверки что не ноль.
FuncPointer=611E74
hGlobal=625594


А так ругается.
Программа VB6 вызвала сбой при обращении к странице памяти
в модуле <нет данных> по адресу 0000:00000009.
Регистры:
EAX=0000007f CS=0167 EIP=00000009 EFLGS=00010a86
EBX=00618160 SS=016f ESP=007ff4a8 EBP=007ff604
ECX=0fc01fab DS=016f ESI=0062bd15 FS=42df
EDX=817ae824 ES=016f EDI=007ff4ac GS=0000
Байты по адресу CS:EIP:
00 70 09 65 04 70 00 65 04 70 00 54 ff 00 f0 08
Содержимое стека:
00000000 ffffffff 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 006181bc 00000000 00000000 00000000

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 13.07.2004 (Вт) 0:03

Такая хрень тоже ошибку выдаёт
s = f.CallFunction(vbNullString, VarPtr(BinArray(0)), 2, p1, p2)

А Дельфинский код работает в твоей процедуре.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.07.2004 (Вт) 17:16

Не знаю, чего ты там менял :)
Но работает оно, работает и активно используется.

А насчёт хелпа - смотреть на него не могу. Вот когда понимаешь, что подсветка синтаксиса - это не роскошь, а средство сохранения психического здоровья...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 13.07.2004 (Вт) 18:45

>Но работает оно, работает и активно используется.
- Получается что работает если только Дельфи написано. А я его с детства не люблю.

>А насчёт хелпа - смотреть на него не могу. Вот когда понимаешь, что подсветка синтаксиса - это не роскошь, а средство сохранения психического здоровья...
- Согласен. Только если RTF не знаешь, то тебе никакая подсветка не поможет.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.07.2004 (Вт) 19:03

Ха-ха :)

Скажи мне, а зачем у тебя RET 10? У тебя должно быть просто RET, ибо у данного конкретного отрезка кода нет параметров.
RET 10 у моей функции вызова – так это у неё, у обёртки... Вызываемый отрезок должен иметь свой собственный RET.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 13.07.2004 (Вт) 19:09

Почему у меня RET 10. Вот если бы я знал. :)
Когда вызываешь мой код через CallWindowProc то всё работает нормально с RET 10, а с RET выбивает.
Не, я конечно понял твои объяснения по поводу числа после RET, но на практике не применял ещё.

А параметры у меня есть
я когда вызывал твою функцию
s = f.CallFunction(vbNullString, VarPtr(BinArray(0)), 2, p1, p2)

то p1 и p2 присваивал значения от фонаря.

А у меня RET 10 наверное из за этого:
:00000000 55 push ebp
:00000001 89E5 mov ebp, esp
:00000003 53 push ebx
:00000004 56 push esi
:00000005 57 push edi

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.07.2004 (Вт) 19:19

Ну ещё бы :)
Не, вот красавец. В моём классе обёртка потому имеет RET 10, что она как раз параметры CallWindowProc выпихивает. Если напрямую вызывать через CallWindowProc, то, конечно, RET 10. Правда, я не знаю, как это будет соотноситься с собственными параметрами функции. Хотя нет, знаю - таковых параметров должно быть ровно 4 и никак иначе. Именно для отмены этого ограничения у меня обёртка.
Вот, попробуй:

Код: Выделить всё
Option Explicit

Private Sub Form_Load()
  Dim BinArray() As Byte

  ReDim BinArray(0 To 17)
  BinArray(0) = &H55
  BinArray(1) = &H89
  BinArray(2) = &HE5
  BinArray(3) = &H53
  BinArray(4) = &H56
  BinArray(5) = &H57
  BinArray(6) = &HB8
  BinArray(7) = &HF
  BinArray(8) = &H0
  BinArray(9) = &H0
  BinArray(10) = &H0
  BinArray(11) = &H5F
  BinArray(12) = &H5E
  BinArray(13) = &H5B
  BinArray(14) = &H89
  BinArray(15) = &HEC
  BinArray(16) = &H5D
  BinArray(17) = &HC3
 
  Dim a As New cFuncCall
 
  MsgBox a.CallFunction(vbNullString, VarPtr(BinArray(0)), 0)
 
  Set a = Nothing
End Sub


Возвращает 15 :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 13.07.2004 (Вт) 21:36

Спасибо. Щаз потестю.
>Возвращает 15
Ну да. У меня в IDE это
MOV EAX,&B1111


Я хотел сделать 2 типа вызова.
Твой - медленный, но может вызывать более 4-х параметров
И обычный - CallWindowProc (4 и < параметров)

У меня есть такая фича:
If checked, then compiled code will put into automatic created header and footer.
Push EBP
Mov EBP,ESP
Push EBX
Push ESI
Push EDI
<YOU SOURCE CODE>
Pop EDI
Pop ESI
Pop EBX
Mov ESP,EBP
Pop EBP
Ret 10
Length of 'header' will automaticaly added to addresses calculation

Если у меня больше 4-х параметров, то я должен поменять
C2 iw RET imm16 Near return to calling procedure and pop imm16 bytes from stack

на
C3 RET Near return to calling procedure

Всё правильно? Больше ничего не надо делать?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.07.2004 (Вт) 23:22

Если юзаешь мой код, то вызываемая процедура должна иметь RET, соответствующий количеству её параметров.
Если юзаешь напрямую CallWindowProc, то RET 10. Всегда 4 параметра, и никаких "меньше". Не нужны - нулями.
А так вроде всё :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 14.07.2004 (Ср) 13:20

Теперь всё понятно.
Долго не мог отдуплится по простой причине. Меня смущало число 10. Вот что значит человек в десятичной системе думает :)

Что то в копирайте на твою функцию писать?

Пред.

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33

    TopList  
cron