Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Э-э-э, а можно спросить?.. Добавлено: 26.08.04 00:09  

Автор вопроса:  AgentFire | ICQ: 192496851 
Я что-то не совсем понял – как это вставлять в VB6 ассемблеровский код? Чтобы он там еще работал?
А производительность программы, где вместо "x=5" будет написано тоже, но на асме, повысится?

Ответить

  Ответы Всего ответов: 29  

Номер ответа: 1
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #8
Добавлено: 27.08.04 21:45
Покажи весь исходник

Ответить

Номер ответа: 9
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #12
Добавлено: 31.08.04 01:01
А потом не помешает прибавить к этому числу 30h ;)

Ответить

Номер ответа: 13
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #13
Добавлено: 04.09.04 03:48
>;Dim 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 байта).
 ;DWORD PTR [адрес переменной] - будет выполнена операция над операндом размером в двойное слово (4 байта).

И если ты не понял, то VB не поддерживает ассемблер непосредственно. Да и вообще Бейсик от Микрософта никогда ассемблер не поддерживал. Такая у них политика.

Ответить

Номер ответа: 14
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #14
Добавлено: 04.09.04 03:55
Да, если ты скачаешь Inline Assembler для VB6, то забудь всё что я тебе говорил про адреса. Этот add-one сам будёт всё считать (точно также как компилятор VB6).

Ответить

Номер ответа: 15
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #15 Добавлено: 04.09.04 20:40
Да, в асме я полный нуль, ну ладно будем осваивать...

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам