Страница: 1 | 2 |
Вопрос: Локальный Бейсик
Добавлено: 23.09.04 04:25
Автор вопроса: CyRax | Web-сайт:
Многие знают о возможности вызова машинных кодов из VB6 с помощью CallWindowProc. Некоторые даже видели адаптированный ассемблер, написанный мной.
В скором времени я собираюсь писать компилятор Бейсика для такого вызова. Всех кто горит желанием написания своего языка приглашаю присоединится. Проект ещё не открыт, но думаю в ближайшие месяцы будет.
Требование только одно - знание ассемблера. Знание машинных кодов приветствуется.
Выбор ассемблера за вами. Каждый может использовать свой любимый инструмент. Я например буду использовать свой.
Ответы
Всего ответов: 29
Номер ответа: 1
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #1
Добавлено: 23.09.04 18:27
Как-то пропустил Не скажешь где можно скачать, если можно конечно? Насчет проекта.. можешь поподробнее описать задумку?
Номер ответа: 2
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #2
Добавлено: 23.09.04 19:06
http://www.vbnet.ru/soft/
Номер ответа: 3
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #3
Добавлено: 23.09.04 19:20
Задумка такая.
Ну допустим человеку нужно что то быстрое в VB. К его услугам есть Функция CallWindowProc, запускающая машинный код.
Но далеко не многие знают ассемблер. Раз для этих людей родным является Бейсик, то нужно для них его написать
Конечно это не будет полноценный Бейсик. Он будет ориентирован на ассемблер, но вместо мнемоник программист будет писать известные ему команды.
Например:
 IM A AS LONG
 IM B AS LONG
A=5
B=B+A
Это будет:
MOV EBP,ESP
SUB ESP,8
MOV DWORD PTR [EBP-4],5
MOV EAX, DWORD PTR [EBP-4]
ADD DWORD PTR [EBP-8],EAX
Ну и так далее в таком роде. Разумется с поддержкой API.
Номер ответа: 4
Автор ответа:
Keen
ICQ: 284-467-526
Вопросов: 12
Ответов: 25
Профиль | | #4
Добавлено: 23.09.04 19:52
Если бы я знал ASM ((... А так я ногами и руками - за! Вообще, я тут тоже хочу открыть проект - язык программирования для игр (как звучит!) на VB. Преимуществ у него будет много, но главное - все уже готово, сиди и пиши скрипт движка . Но об этом позже, да и стоит ли (хотя чуть-чуть уже написано)?
Номер ответа: 5
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #5
Добавлено: 23.09.04 20:44
SUB ESP,8
MOV DWORD PTR [EBP-4],5
MOV EAX, DWORD PTR [EBP-4]
ADD DWORD PTR [EBP-8],EAX
Прикольно, но на таком уровне я ассемблер не знаю Для меня он пока ограничивается кодингом в MASM'e небольших оконных и не оконных приложение с использованием API. Но ничё, может подучусь и успею помочь в проекте
Номер ответа: 6
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #6
Добавлено: 23.09.04 22:42
Добро пожаловать. Насчёт знаний не беспокойся. Что знаю - объясню. А что не знаю у crest'ы спросим. Или на MASMFORUM.COM
Главное чтобы желание было. Так что давай, подучивайся. А то не хотелось бы уделять всё время репетиторству.
Номер ответа: 7
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #7
Добавлено: 24.09.04 16:37
Ok, ща на выходных, на даче почитаю книжечку В. Юрова "Assembler" - учебник, а приеду уроки Iczelion'а проштудирую
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 24.09.04 16:41
Добро, а я пока свой ассемблер в порядок приведу. Вот только имя никак не могу подобрать.
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 25.09.04 05:10
С переменными теперь будет попроще. Я добавил в ассемблер метаоператор #DIM, который позволит не заботится об подсчёте адресов локальных переменных.
Номер ответа: 10
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #10
Добавлено: 26.09.04 14:37
Прикольная книжка оказалась, узнал много интересного и поразмыслив я перешел на TASM.
Разобрался с кодом:
[CODE] MOV EBP,ESP
SUB ESP,8
MOV DWORD PTR [EBP-4],5
MOV EAX, DWORD PTR [EBP-4]
ADD DWORD PTR [EBP-8],EAX[/CODE]
Он был для меня непонятен из-за косвенной регистровой адресации со смещением ( [EBP-4] ), не читал я об этом ранее
Зато теперь готов к труду и обороне ) Надо еще правда почитать о CallWindowProc, но это я быстро.
Номер ответа: 11
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #11
Добавлено: 26.09.04 22:24
ISpy
Ты с Юровым поосторожней, в нём ошибок - как у собаки блох
А спросить если что лучше на wasm'e. Там народ несколько грубоватый,(как сказал один чел: "суровые парни пишут суровый код" но можно много чего узнать.
Номер ответа: 12
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #12
Добавлено: 27.09.04 01:22
Это называется ПАМЯТЬ. В неё ты по другому никак не запишешь. Только так ([EBP-4]) или с помощью инструкции PUSH. Полная формула выглядит так:
[r32+r32*Масштаб+Смещение]
В языках высокого уровня такая запись называется указателем.
Рад что ты смог разобраться.
Сможешь теперь написать простенький пример с использованием локальных переменных?
 IM A,B,C,D
A=5
B=5
A=A+B
C=A/2
 =VARPTR
Номер ответа: 13
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #13
Добавлено: 27.09.04 13:53
Это не просто память, - это стек. В регистре ESP находится указатель стека, в EBP - указатель базы кадра стека. Но это так, к слову
А разве в стек нельзя записать, используя эффективный адрес? Типа
mov dword ptr [0000],5
вот только как сделать чтоб он адресовал не в сегмент данных а в стек (т.е. адрес был, например не ds:0000, а ss:0000)? Может можно пихнуть на некоторое время в ds адрес ss, он будет думать, что пишет в сегмент данных, а будет писать в стек? Но это опять таки размышление вслух
Что значит локальных, стек что ли использовать? А какой размер переменных? Ладно, пусть будет двойное слово.
Код:
mov ebp,esp
sub esp,16
mov dword ptr [ebp-4],5 ;A
mov dword ptr [ebp-8],5 ;B
mov eax, dword ptr [ebp-8]
add dword ptr [ebp-4],eax
;младшая часть числа A уже находиться в ax
mov dx,word ptr [ebp-4] ;Нет опыта, так что не уверен правильно ли пихнул в dx старшую часть числа A
mov bx,2 ;Делитель в bx
div bx
mov word ptr [ebp-12],ax ;Пишу частное в верхнюю (вроде) часть C. Куда девать остаток от деления?
;Сорри, не знаю что такое VARPTR (пока), поэтому не могу найти D
Код неполный, и может немного неправильный - нет опыта, раньше кодил на асмье в основном только API
Возможно, для твоего проекта я пока не дорос по уровню знаний, хотя он уже принес мне пользу заставив подумать головой и засесть за учебники, так что я доволен )
Номер ответа: 14
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #14
Добавлено: 27.09.04 15:32
mov dword ptr [0000],5
вот только как сделать чтоб он адресовал не в сегмент данных а в стек
Вроде можно писать так: mov dword ptr ss:0000h, 5
(например)
Но тогда скорее всего придется вручную изменять esp и edp
Номер ответа: 15
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #15
Добавлено: 27.09.04 17:44
Еще раз подумал, и вот к чему пришел:
mov EBP,ESP
sub ESP,16
mov dword ptr [EBP-4], 5 ;Число A
mov dword ptr [EBP-8], 5 ;Число B
mov eax, dword ptr [EBP-8] ;B в eax
add dword ptr [EBP-4], eax ;А + В
xor eax, eax ;Чистим на всякий случай
mov ax, word ptr [EBP-4] ;Младшая часть А
mov dx, word ptr [EBP-2] ;Старшая часть А
mov bx, 2 ;Делитель
div bx ;А/2
mov word ptr [EBP-10], ax ;Частное в старшую часть С
mov word ptr [EBP-12], dx ;Остаток в младшую часть С
VARPTR - пока не знаю что это такое