Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 | 2 | 3 | 4 | 5 | 6 |

 

  Вопрос: Проект Ассемблер в VB Добавлено: 11.06.04 21:13  

Автор вопроса:  @CyRax PTR | Web-сайт: basicproduction.nm.ru/ | ICQ: 204447456 

Ответить

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

Номер ответа: 46
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: basicproduction.nm.ru/
 Профиль | | #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-сайт: basicproduction.nm.ru/
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #50
Добавлено: 21.06.04 21:04
А чем те не нравятся строки из "кучи", или тебе именно средствами только АСМ ?

Ответить

Номер ответа: 51
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #51
Добавлено: 21.06.04 21:26
 А зачем я тогда спрашиваю по твоему? Покажи как из "кучи". Может там несложно. А вообще, АПИ-это тот же АСМ. Да в принципе любой компьютерный код - это АСМ :) Что то я заговариваться начал.

Ответить

Номер ответа: 52
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #52
Добавлено: 21.06.04 23:37
Я в примеры отправил работу с GlobalAlloc (последний)... (можно поменять на HeapCreate+Alloc/VirtualAlloc/LocalAlloc) может подойдет... хотя, думаю? что это не то что тебе надо...

Ответить

Номер ответа: 53
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #53
Добавлено: 22.06.04 04:12
>> следует иметь в асм-подпрограмме возможность обращения к переменным "окружающего мира"
> Что ты имел ввиду? Глобальные переменные процесса?
У процесса переменных нет, они есть у VB программы. Доступ к ним хотелось бы иметь.
> Афтар (это я) действительно нагнал туч, но эти тучи занимаются именно созданием структуры, содержащей параметры, с последующем копированием оных в стек.
Я имел ввиду несколько иные тучи: формированием структуры занимается вызывающий, он передает в стуб адрес структуры и ее длину, а сам стуб копимеморит с этого адреса столько-то байт по EBP и увеличивает EBP на длину, после чего уже вызывает саму асм-процедуру.

Ответить

Номер ответа: 54
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #54
Добавлено: 22.06.04 04:15
Несколько не понимать, где проблема со строками. В выделении памяти? Пиши строку непосредственно в коде (предваряя относительным джампом) и также относительно к ней обращайся.

Ответить

Номер ответа: 55
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #55
Добавлено: 22.06.04 04:18
>Пиши строку непосредственно в коде (предваряя относительным джампом) и также относительно к ней обращайся
 Нет, мне нужны динамические и желательно глобальные. Надо будет код sne поковырять. Авось что и найду для себя.

Ответить

Номер ответа: 56
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #57
Добавлено: 22.06.04 05:28
> Нет, мне нужны динамические и желательно глобальные
Ну тогда, видимо, надо юзать кучу процесса и гадить туда...
> Локальные переменные есть у процедуры
И создаются они в стеке. Это все известно. Хотелось бы иметь доступ к глобальным. А еще хотелось бы все-таки инлайн-ассемблер. Сам себе: не майся дурью, пиши на голом асме :)
Глобальные переменные, афаик, создаются в куче процесса во время инициализации программы загрузчиком, согласно его секции data? (aka BSS)

Ответить

Номер ответа: 58
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #58
Добавлено: 24.06.04 19:45
 Про Inline ASM уже высказался Fallout. Качай и пользуй.
 .data? ? Глянем.

Ответить

Номер ответа: 59
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #59
Добавлено: 11.07.04 21:54
Програмеры,
 Я вот хелп написал к моему ассемблеру.
Потестите если не в лом.
http://basicproduction.nm.ru/ASM/LASM/lasm.rar

Ответить

Номер ответа: 60
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #60
Добавлено: 12.07.04 00:03
Дай еще ссылку последнюю версию асьма...

Ответить

Страница: 1 | 2 | 3 | 4 | 5 | 6 |

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



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