Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Совместные проекты

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

 

  Вопрос: Локальный Бейсик Добавлено: 23.09.04 04:25  

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

Ответить

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

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #16
Добавлено: 27.09.04 17:58
Ну чтож уже не плохо. Небольшие поправки.

3:
;EAX=EAX\EBX
MOV EDX,0
MOV EAX,Number
MOV EBX,Divider
DIV EBX

4:
;D=VARPTR(A)
MOV EAX,EBP
SUB EAX,4
MOV [EBP-16],EAX

По поводу слова "локальный". Это примерно что то типа такого:
Sub Main
 Call LocalProc
End Sub

Sub LocalProc
...
End Sub

Это значит что все переменные существуют только в процедуре LocalProc и при выходе из неё теряются.

А VARPTR - это совсем просто.
 A=5 -> [EBP-4]=5
 VARPTR(A)=5 -> EBP-4=5

Ответить

Номер ответа: 17
Автор ответа:
 ISpy



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

Вопросов: 47
Ответов: 621
 Web-сайт: intermult.boom.ru
 Профиль | | #17
Добавлено: 27.09.04 18:57
Прикольно, спасибо :)

Это называется ПАМЯТЬ. В неё ты по другому никак не запишешь. Только так ([EBP-4]) или с помощью инструкции PUSH.

А что ты думаешь насчет записи в стек вида:
mov dword ptr ss:0000h, 5

;(адрес 0000 и число 5 размера приведены для примера)
возможо такое или нет, и придется ли вручную изменять esp и edp?

И еще: можно ли присваивать регистру сегмента данных ds, на некоторое время адрес сегмента стека ss? Будет ли комп правильно адресовать пространство стека? Тогда может быть можно будет адресовать стек так:
mov ds, ss
mov dword ptr [0000], 5

;адрес ds:0000, но т.к. ds=ss, то получается ss:0000?

Конечно это не преследует каких-либо практических целей, просто интересно :)

Ответить

Номер ответа: 18
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #18 Добавлено: 27.09.04 19:51
mov dword ptr ss:0000h, 5


Здесь явная ошибка: ты затрёшь ячейку - вершину стека. Т.е. значение, которое было последним положено в стек перед твоей командой.

Если ты к примеру делал так:

push 1234h
... ;какие-то операции
...
mov dword ptr ss:0000h

то 0000h пропишется в ячейку, где было 1234h.

Чтобы не перетирало, надо сначала сдвинуть esp вниз на кол-во байт, равных длине 1234h, т.е. сместить вершину стека и потом пытаться сделать mov dword ptr ss:0000h. Примерно так:

push 1234h
add esp,-4
mov [esp],0000h

Но зачем такие финты? Есть push\pop, они разом и вершину двигают и значение заносят\считывают. Это и быстрее и меньше кода.

Ответить

Номер ответа: 19
Автор ответа:
 ISpy



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

Вопросов: 47
Ответов: 621
 Web-сайт: intermult.boom.ru
 Профиль | | #19
Добавлено: 27.09.04 20:35
Чтобы не перетирало, надо сначала сдвинуть esp вниз на кол-во байт, равных длине 1234h, т.е. сместить вершину стека и потом пытаться сделать mov dword ptr ss:0000h. Примерно так:

Не, ты все правильно сказал насчет сдвинуть esp, я просто хотел узнать, что в принципе возможна запись в стек по прямому адресу (не с помощью косвенной регистровой адресации).
Просто CyRax говорил:
Это называется ПАМЯТЬ. В неё ты по другому никак не запишешь. Только так ([EBP-4]) или с помощью инструкции PUSH.
Вот меня и заинтересовала эта тема :)
А что ты думаешь насчет возможности присвоить на некоторое время регистру ds адрес ss?

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #20
Добавлено: 28.09.04 17:27
Впринципе вполне можно обходится и адресацией через общие регистры.
Зубков:
Если ESP или EBP используются в роли базового регистра, селектор сегмента операнда берется по умолчанию из регистра SS, во всех остальных случаях — из DS.

Т.е.
MOV [ESP],5 - это MOV SS:ESP,5
MOV [EAX],5 - это MOV DS:EAX,5

У меня же эти регистры поддерживаются только для инструкции PUSH.

А ввобще по моему в Виндовс из всех этих регистров (CS,SS,DS,ES,FS,GS) доступ есть только к CS,SS,DS, а к остальным запрещён. Хотя может я и не прав.

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #21
Добавлено: 28.09.04 17:40
Да, если кто хочет написать дополнительный модуль адресации через сегментные регистры - не стесняйтесь. Запишу в соавторы.

Ответить

Номер ответа: 22
Автор ответа:
 ISpy



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

Вопросов: 47
Ответов: 621
 Web-сайт: intermult.boom.ru
 Профиль | | #22
Добавлено: 28.09.04 18:32
ES, FS, GS - Регистры для дополнительных сегментов данных.
Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в сегментном регистре ds, при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения в команде. Адреса дополнительных сегментов данных должны содержаться в регистрах es, gs, fs (extension data segment registers)
Уф :)
Т.е. как я понимаю доступ к этим регистрам такой же, как и к ds, cs, ss.

Если ESP или EBP используются в роли базового регистра, селектор сегмента операнда берется по умолчанию из регистра SS, во всех остальных случаях — из DS.
Т.е.
MOV [ESP],5 - это MOV SS:ESP,5
MOV [EAX],5 - это MOV DS:EAX,5

Вот это то мне и интересно! Возможно ли при адресации по умолчанию, т.е. вида MOV [EAX],5 - это MOV DS:EAX,5, сменив ЗНАЧЕНИЕ регистра ds на значение ss, адресовать данные в стек, как будто в сегмент данных. Типа обмануть комп :)

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #23
Добавлено: 28.09.04 19:28
 Попробуй так:
 MOV EAX,DS
 MOV SS,EAX

Ответить

Номер ответа: 24
Автор ответа:
 ISpy



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

Вопросов: 47
Ответов: 621
 Web-сайт: intermult.boom.ru
 Профиль | | #24
Добавлено: 28.09.04 20:14
Попробуй так:
 MOV EAX,DS
 MOV SS,EAX

Как это реализовать я и так знаю, но сработает или нет вот в чем вопрос :) Пробовать пока лень, но думаю надо.
Хотя моя идея заключалась немного в другом:
mov eax,ss
mov ds,eax
Т.е. чтоб писать в стек можно было так, например:
mov [0000],5
или
mov [eax],5
Т.е. тогда адрес ПО УМОЛЧАНИЮ получается ds:eax, но т.к. мы в ds занесли значение ss, то мы как бы адресуем в стек :) Извини если я непонятно объясняю свою идею, но по-другому не умею.

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #25
Добавлено: 28.09.04 21:08
Уже добавил MOV r/m32,Sreg и MOV r/m16,SReg
Ещё осталось MOV Sreg,r/m32 и MOV SReg,r/m16

Кто знает в каких ещё инструкциях сегментые регистры выступают операндами?

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #26
Добавлено: 28.09.04 21:32
Т.е. чтоб писать в стек можно было так, например:
mov [0000],5

 Я поддержку такого сначала сделал в своём ассемблере. Но потом почему то убрал когда алгоритм переписывал. Почему не помню.
 А, вспомнил, это нужно только в компиляторах приложений, где адреса глобальных переменных высчитываются компилятором и в таком виде записываются в экзешник. А в локальном ассемблере это не нужно, т.к. память у процедуры находится в стеке, а адреса глобальных переменных можно передавать через параметры.

 Кстати я обнаружил опкоды для этого дела случайно. Дело в том что при адресации по [EBP] опкод должен быть [EBP+00], а я записывал просто [EBP]. В результате получилось что вместо [EBP] писалось [imm].
К примеру
MOV [EBP],1
Будет
C7/45/0/1/0/0/0

Здесь 45 - это [r32+imm], а если отнять 40, то будет просто [r32]. Это верно для любого регистра кроме EBP.
[EBP] - это [imm]
Например
DB &HС7,5,0,1,0,0,0

WDasm 10:
:00000020 C705000100000089EC81 mov dword ptr [00000100], 81EC8900

Подгоняем длины операндов под imm32 и готово. Вот такая вот история ;)

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #27
Добавлено: 29.09.04 02:21
Фух, приклепал сегментные регистры.
А вот правильный порядок их расположения.
/0 ES
/1 CS
/2 SS
/3 DS
/4 FS
/5 GS

Ответить

Номер ответа: 28
Автор ответа:
 Fallout



Вопросов: 10
Ответов: 387
 Web-сайт: mudator.by.ru
 Профиль | | #28
Добавлено: 19.10.04 15:51
Мммм.... а может есть смысл написать полностью свой басик?... то бишь синтаксис и тд итп как у ВБ (или ПБ) но без изврата .. то бишь работа с диалогами такая же как у ВБ... и тд итп... компилируется всё в Асм листинг для масм... то бишь это будет компилятор компилятора.... получатся сверх малые (без изврата который у ПБ) и сверх шустрые ЕХЕ.... мне кажется народ памятник тогда создателю поставит =)... вот .... впринцыпи при наших технологиях и мозгах.. что мешает то? +)... помоему ничего... либо делать компилятор компилятора в Си код или Си++... вообщем.. вот +)

Ответить

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



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

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #29
Добавлено: 05.11.04 09:57
 Нет, всё таки лучше компилировать в машинный код. А такие трансляторы уже и так есть.

Ответить

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

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



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