Страница: 1 | 2 | 3 | 4 | 5 | 6 |
Вопрос: Проект Ассемблер в VB
Добавлено: 11.06.04 21:13
Автор вопроса: @CyRax PTR | Web-сайт:
Ответы
Всего ответов: 77
Номер ответа: 46
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #46
Добавлено: 16.06.04 14:02
С вызовом при более 4 параметрах, имхо, автор нагнал туч. Можно просто формировать параметры в структуре, передавать ее адрес "стубу", который скопирует ее в память стека и изменит указатель на его вершину.
Мысль про асм в VB возникала издавна и у многих. Однако большинство приходило к выводу, что нужно взаимодействие с внешним миром, т.е., например, следует иметь в асм-подпрограмме возможность обращения к переменным "окружающего мира" без посредников типа передачи адресов этих переменных.
Опкоды смотри в документе IA-32 Instruction Set на intel.com, там есть все, что нужно. Цитата:
Opcode Instruction Description
D0 /4 SAL r/m8,1 Multiply r/m8 by 2, once
D2 /4 SAL r/m8,CL Multiply r/m8 by 2, CL times
C0 /4 ib SAL r/m8,imm8 Multiply r/m8 by 2, imm8 times
D1 /4 SAL r/m16,1 Multiply r/m16 by 2, once
D3 /4 SAL r/m16,CL Multiply r/m16 by 2, CL times
C1 /4 ib SAL r/m16,imm8 Multiply r/m16 by 2, imm8 times
D1 /4 SAL r/m32,1 Multiply r/m32 by 2, once
D3 /4 SAL r/m32,CL Multiply r/m32 by 2, CL times
C1 /4 ib SAL r/m32,imm8 Multiply r/m32 by 2, imm8 times
D0 /7 SAR r/m8,1 Signed divide* r/m8 by 2, once
D2 /7 SAR r/m8,CL Signed divide* r/m8 by 2, CL times
C0 /7 ib SAR r/m8,imm8 Signed divide* r/m8 by 2, imm8 times
D1 /7 SAR r/m16,1 Signed divide* r/m16 by 2, once
D3 /7 SAR r/m16,CL Signed divide* r/m16 by 2, CL times
C1 /7 ib SAR r/m16,imm8 Signed divide* r/m16 by 2, imm8 times
D1 /7 SAR r/m32,1 Signed divide* r/m32 by 2, once
D3 /7 SAR r/m32,CL Signed divide* r/m32 by 2, CL times
C1 /7 ib SAR r/m32,imm8 Signed divide* r/m32 by 2, imm8 times
D0 /4 SHL r/m8,1 Multiply r/m8 by 2, once
D2 /4 SHL r/m8,CL Multiply r/m8 by 2, CL times
C0 /4 ib SHL r/m8,imm8 Multiply r/m8 by 2, imm8 times
D1 /4 SHL r/m16,1 Multiply r/m16 by 2, once
D3 /4 SHL r/m16,CL Multiply r/m16 by 2, CL times
C1 /4 ib SHL r/m16,imm8 Multiply r/m16 by 2, imm8 times
D1 /4 SHL r/m32,1 Multiply r/m32 by 2, once
D3 /4 SHL r/m32,CL Multiply r/m32 by 2, CL times
C1 /4 ib SHL r/m32,imm8 Multiply r/m32 by 2, imm8 times
D0 /5 SHR r/m8,1 Unsigned divide r/m8 by 2, once
D2 /5 SHR r/m8,CL Unsigned divide r/m8 by 2, CL times
C0 /5 ib SHR r/m8,imm8 Unsigned divide r/m8 by 2, imm8 times
D1 /5 SHR r/m16,1 Unsigned divide r/m16 by 2, once
D3 /5 SHR r/m16,CL Unsigned divide r/m16 by 2, CL times
C1 /5 ib SHR r/m16,imm8 Unsigned divide r/m16 by 2, imm8 times
D1 /5 SHR r/m32,1 Unsigned divide r/m32 by 2, once
D3 /5 SHR r/m32,CL Unsigned divide r/m32 by 2, CL times
C1 /5 ib SHR r/m32,imm8 Unsigned divide r/m32 by 2, imm8 times
Номер ответа: 47
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #47
Добавлено: 17.06.04 20:36
->Можно просто формировать параметры в структуре, передавать ее адрес "стубу", который скопирует ее в память стека и изменит указатель на его вершину.
- Сформируй.
->следует иметь в асм-подпрограмме возможность обращения к переменным "окружающего мира"
- Что ты имел ввиду? Глобальные переменные процесса?
->Опкоды смотри в документе IA-32 Instruction Set на intel.com
- Спасибо, у меня такого добра навалом и на русском и на английском. Это нужно было адаптировать под VBАСМ.
===
VBASM обновился.
Добавлено:
Директивы DB, DW, DD (пока без DUP).
Строчные циклы: REP, REPE, REPZ, REPNE, REPNZ
Контроль регистра флагов: CLC, STC, CMC, CLD, STD, CLI, STI, LAHF, SAHF, PUSHF, PUSHFD, POPF, POPFD
---
Скоро выложу на сайте.
Номер ответа: 48
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #48
Добавлено: 20.06.04 08:37
Я захожу иногда - вы не возражаете?
->С вызовом при более 4 параметрах, имхо, автор нагнал туч. Можно просто формировать параметры в структуре, передавать ее адрес "стубу", который скопирует ее в память стека и изменит указатель на его вершину
Афтар (это я) действительно нагнал туч, но эти тучи занимаются именно созданием структуры, содержащей параметры, с последующем копированием оных в стек.
Номер ответа: 49
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #49
Добавлено: 21.06.04 19:56
GSerg,
Я не возражаю. Как насчёт "разбора полётов" с твоим примером? Я конечно понимаю что грамотнее было бы задать вопрос что конкретно мне непонятно.
Но я ещё не начинал разбирать твой исходник. Разве что глянул раза 4-5.
- До Штирлица не дошло письмо из Центра.
Он перечитал его ещё раз.
Всё равно не дошло.
===
Да, люди что вы знаете про создание строк в АСМ? Только не за счёт стёка. Хотя, если ничего другого... На масмфорум ничего вразумительного не получил. За исключением этого:
MichaelW.
A MASM32 console app is the best I can do. My concept was flawed; EBP should not be altered as noted in the comments.
Code:
.486
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
include \masm32\macros\macros.asm
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
StackStr PROTO :DWORD,:DWORD
.data
buffer db 20 dup(0)
.code
start:
invoke StackStr,5,'$'
print SADD(13,10,"Press enter to exit...",13,10)
invoke StdIn,addr buffer,1
exit
StackStr proc byteLength:DWORD,fillChar:DWORD
LOCAL strPtr:DWORD
; Avoid changing EBP so the parameters and
; local variables can be accessed normally.
mov ebx,esp
; Must allow for byteLength + null.
sub esp,byteLength
sub esp,1
; Set strPtr to start of string.
mov strPtr,esp
; Fill the string with fillChar.
mov edi,strPtr
mov ecx,byteLength
mov eax,fillChar
cld
rep stosb
; And add null terminator.
mov byte ptr[edi],0
; Display the filled string.
print strPtr
; *Must* restore stack pointer before return.
mov esp,ebx
ret
StackStr endp
end start
===
Или этого:
hutch--.
Something I missed with one of your earlier questions, OLE string memory is ideally suited for basic style string manipulation as it is allocated from the OLE string pool which is designed fore the task.
Quote:
comment * --------------------------------------------------
Two macros for allocating and freeing OLE memory.
stralloc returns the handle/address of the string
memory in eax. alloc$ acts in the same way but is
used in the function position. strfree uses the
handle to free memory after use.
NOTE that you must use the following INCLUDE &
LIB files with these two macros.
include \MASM32\include\oleaut32.inc
includelib \MASM32\LIB\oleaut32.lib
-------------------------------------------------- *
alloc$ MACRO ln
invoke SysAllocStringByteLen,0,ln
mov BYTE PTR [eax], 0
EXITM <eax>
ENDM
free$ MACRO strhandle
invoke SysFreeString,strhandle
ENDM
Have a look at this family of API functions in the OLEAUT32 library. If you have the old Borland collection of Winhelp helpfiles, look in OLE.HLP for them. You can allocate, reallocate and free OLE strings using this family of APIs and this is what PB does for dynamic strings.
PB creates the string engine at startup and this is why the minimum size is about 5,5k. It also handles deallocating strings on the fly on procedure exit so be aware that the guts of basic is more complicated than ASM or C.
===
Если то что написал MichaelW ещё можно как нибудь посмотреть через отладчик и адаптировать под мой АСМ, то предложенное hutch'ем требует как минимум MASM32.
Номер ответа: 50
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #50
Добавлено: 21.06.04 21:04
А чем те не нравятся строки из "кучи", или тебе именно средствами только АСМ ?
Номер ответа: 51
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #51
Добавлено: 21.06.04 21:26
А зачем я тогда спрашиваю по твоему? Покажи как из "кучи". Может там несложно. А вообще, АПИ-это тот же АСМ. Да в принципе любой компьютерный код - это АСМ Что то я заговариваться начал.
Номер ответа: 52
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #52
Добавлено: 21.06.04 23:37
Я в примеры отправил работу с GlobalAlloc (последний)... (можно поменять на HeapCreate+Alloc/VirtualAlloc/LocalAlloc) может подойдет... хотя, думаю? что это не то что тебе надо...
Номер ответа: 53
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #53
Добавлено: 22.06.04 04:12
>> следует иметь в асм-подпрограмме возможность обращения к переменным "окружающего мира"
> Что ты имел ввиду? Глобальные переменные процесса?
У процесса переменных нет, они есть у VB программы. Доступ к ним хотелось бы иметь.
> Афтар (это я) действительно нагнал туч, но эти тучи занимаются именно созданием структуры, содержащей параметры, с последующем копированием оных в стек.
Я имел ввиду несколько иные тучи: формированием структуры занимается вызывающий, он передает в стуб адрес структуры и ее длину, а сам стуб копимеморит с этого адреса столько-то байт по EBP и увеличивает EBP на длину, после чего уже вызывает саму асм-процедуру.
Номер ответа: 54
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #54
Добавлено: 22.06.04 04:15
Несколько не понимать, где проблема со строками. В выделении памяти? Пиши строку непосредственно в коде (предваряя относительным джампом) и также относительно к ней обращайся.
Номер ответа: 55
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #55
Добавлено: 22.06.04 04:18
>Пиши строку непосредственно в коде (предваряя относительным джампом) и также относительно к ней обращайся
Нет, мне нужны динамические и желательно глобальные. Надо будет код sne поковырять. Авось что и найду для себя.
Номер ответа: 56
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #56
Добавлено: 22.06.04 04:25
>У процесса переменных нет, они есть у VB программы. Доступ к ним хотелось бы иметь.
Локальные переменные есть у процедуры.
Это [ebp-4] и так далее.
Допустим когда в PB ты говоришь
#Register None
Local Var1 as DWORD
то компилятор заменяет Var1 на [ebp-xx]
А вот глобальные как создаются я пока не выяснил. Ну да MASMFORUM.COM рядом.
Номер ответа: 57
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #57
Добавлено: 22.06.04 05:28
> Нет, мне нужны динамические и желательно глобальные
Ну тогда, видимо, надо юзать кучу процесса и гадить туда...
> Локальные переменные есть у процедуры
И создаются они в стеке. Это все известно. Хотелось бы иметь доступ к глобальным. А еще хотелось бы все-таки инлайн-ассемблер. Сам себе: не майся дурью, пиши на голом асме
Глобальные переменные, афаик, создаются в куче процесса во время инициализации программы загрузчиком, согласно его секции data? (aka BSS)
Номер ответа: 58
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #58
Добавлено: 24.06.04 19:45
Про Inline ASM уже высказался Fallout. Качай и пользуй.
.data? ? Глянем.
Номер ответа: 59
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #59
Добавлено: 11.07.04 21:54
Програмеры,
Я вот хелп написал к моему ассемблеру.
Потестите если не в лом.
http://basicproduction.nm.ru/ASM/LASM/lasm.rar
Номер ответа: 60
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #60
Добавлено: 12.07.04 00:03
Дай еще ссылку последнюю версию асьма...