Страница: 1 | 2 |
Вопрос: Э-э-э, а можно спросить?..
Добавлено: 26.08.04 00:09
Автор вопроса: AgentFire | ICQ: 192496851
Я что-то не совсем понял – как это вставлять в VB6 ассемблеровский код? Чтобы он там еще работал?
А производительность программы, где вместо "x=5" будет написано тоже, но на асме, повысится?
Ответы
Всего ответов: 29
Номер ответа: 1
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #1
Добавлено: 26.08.04 00:48
Это на АСМ'е не повысится. Это будет всего лишь адрес памяти под переменную. Переменные Устроены одинаково и в ЯВУ(только стандартные типы) и в Ассемблере.
Если вот страница на LASM IDE. Он может создавать BAS и VBP файлы. http://basicproduction.nm.ru/ASM/LASM/LASMLIGHT.html
А это на закачку. Русская версия.
http://basicproduction.nm.ru/ASM/LASM/lasmlightru.rar
А переменные выглядят так:
MOV [EBP-4],5 -> X=5
MOV [EBP-8],&HFF -> Y=-1
MOV [EBP-12],123 -> Z=123
Т.е. переменная может выглядеть только как операнд(т.е. над ним проводится действие) в той или иной инструкции. Таких как MOV - изменить значение переменной; ADD - сложение, SUB - вычитание; MUL - умножение; DIV - деление и т.д.
Номер ответа: 2
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #2
Добавлено: 26.08.04 00:52
А если хочешь получить результат из Ассемблера в VB, просто пиши так:
MOV EAX,Число(или регистр или адрес памяти)
Номер ответа: 3
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #3
Добавлено: 26.08.04 01:13
Как вставлять - это к CyRax'у вопрос. Он придумывал.
Для х=5 будет потеря производительности, т.к. готовить и передавать данные займет больше времени, чем на VB сделать х=5. Это имеет смысл в случае больших и долгих вычислений (большие циклы, сортировки и т.п.).
Номер ответа: 4
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #4
Добавлено: 26.08.04 01:14
Пока писал, опаздал (
Номер ответа: 5
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 26.08.04 01:25
Код ассемблерный встывлять дело довольно муторное, и кое-что, все же, остается недоступным...
Номер ответа: 6
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #6
Добавлено: 26.08.04 09:33
Дык вроде уже определились с этим. Если небольшой - можно сразу загнать в массив, инача - сначала в ресурсы, а потом в массив. А как выполнить код из массива - уже сто раз разбирали.
Номер ответа: 7
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #7
Добавлено: 26.08.04 22:07
CyRax, ну написал я "MOV EAX, <адрес>" ну выдал он мне: "Процедура или функция неопределена ", и что мне дальше делать?.. :~((
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 27.08.04 21:45
Покажи весь исходник
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 27.08.04 21:53
Мне он такого не пишет. Команда типа MOV r32,[imm] не поддерживается. Хотя сначала она была.
Номер ответа: 10
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #10
Добавлено: 30.08.04 22:15
Private Sub Command1_Click
Dim x as byte
MOV EAX, 5
MsgBox CStr(x)
End Sub
И он пишет, что такой функции нет.
Может мой VB6 вообще асм не саппорит?
Номер ответа: 11
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #11
Добавлено: 31.08.04 00:27
Не знаю, чего должен показать MsgBox, но если ты ожидаешь увидеть 5, то для начала измени тип переменной х. Т.к. в eax записывается дворд, а не байт. Либо делай mov al,5
Номер ответа: 12
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 31.08.04 01:01
А потом не помешает прибавить к этому числу 30h
Номер ответа: 13
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #13
Добавлено: 04.09.04 03:48
>im x as byte
>MOV EAX, 5
>MsgBox CStr(x)
Ты это прямо в VB6 IDE пишешь? Не, ну мой ассемблер тебе тут не помощник. Скачай лучше Inline Assembler для VB6. Сделай поиск по форуму. Ссылки поищи. К нему ещё правда MASM32 качать нужно. Но это тебе только на пользу будет.
А по поводу твоего кода - это полный бред. Ты это от фонаря написал?
Для того чтобы переслать значение в x сначала необходимо найти его адрес. На самом деле "x" не существует. При компиляции вместо него в EXE файле записывается адрес памяти по которому будет хранится значение.
Допустим компилятор расчитал адрес переменной x как &H700000
Тогда твой VB код реально будет выглядеть так.
MOV BYTE PTR [&H700000], 5
То что в квадратных скобках - это указатель. На русский язык это можно перевести так: Переслать в байт по адресу &H700000 число 5.
Мой ассемблер не использует глобальных адресов. Он выполняет код, представленный в виде локальной процедуры. Он не расчитывает адреса переменных как это делает компилятор VB6.
Но посчитать тебе их совершенно не сложно.
[EBP-4] - адрес первой переменной типа LONG
[EBP-8] - адрес второй переменной типа LONG
[EBP-12] - адрес третьей переменной типа LONG
Или так
[EBP-4] - адрес первой переменной типа BYTE
[EBP-5] - адрес второй переменной типа BYTE
[EBP-6] - адрес третьей переменной типа BYTE
Стандартных типов в ассемблере всего 3: BYTE, WORD (Integer в VB6) и DWORD (Long в VB6). Есть ещё QWORD, но он не совсем стандартный, так как хранится не в регистре, а в регистровой паре EAX:EDX (правда когда .NET-чики показывали свой супер пупер быстрый цикл на 20 млрд., там QWORD хранился в паре ESI:EDI. Я уже начинаю подозревать что эти регистры работают быстрее всех).
Ладно, хватит отступлений.
Тип переменной ты указываешь не объявлением, а в операции непосредственно. Например
BYTE PTR [адрес переменной] - будет выполнена операция над операндом размером в байт.
WORD PTR [адрес переменной] - будет выполнена операция над операндом размером в слово (2 байта).
 WORD PTR [адрес переменной] - будет выполнена операция над операндом размером в двойное слово (4 байта).
И если ты не понял, то VB не поддерживает ассемблер непосредственно. Да и вообще Бейсик от Микрософта никогда ассемблер не поддерживал. Такая у них политика.
Номер ответа: 14
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #14
Добавлено: 04.09.04 03:55
Да, если ты скачаешь Inline Assembler для VB6, то забудь всё что я тебе говорил про адреса. Этот add-one сам будёт всё считать (точно также как компилятор VB6).
Номер ответа: 15
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #15
Добавлено: 04.09.04 20:40
Да, в асме я полный нуль, ну ладно будем осваивать...