Страница: 1 | 2 |
Вопрос: Локальный Бейсик
Добавлено: 23.09.04 04:25
Автор вопроса: CyRax | Web-сайт:
Ответы
Всего ответов: 29
Номер ответа: 16
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #16
Добавлено: 27.09.04 17:58
Ну чтож уже не плохо. Небольшие поправки.
3:
;EAX=EAX\EBX
MOV EDX,0
MOV EAX,Number
MOV EBX,Divider
DIV EBX
4:
=VARPTR
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=5 -> EBP-4=5
Номер ответа: 17
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #17
Добавлено: 27.09.04 18:57
Прикольно, спасибо
А что ты думаешь насчет записи в стек вида:
адрес 0000 и число 5 размера приведены для примера)
возможо такое или нет, и придется ли вручную изменять esp и edp?
И еще: можно ли присваивать регистру сегмента данных ds, на некоторое время адрес сегмента стека ss? Будет ли комп правильно адресовать пространство стека? Тогда может быть можно будет адресовать стек так:
mov dword ptr [0000], 5
;адрес ds:0000, но т.к. ds=ss, то получается ss:0000?
Конечно это не преследует каких-либо практических целей, просто интересно
Номер ответа: 18
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #18
Добавлено: 27.09.04 19:51
Здесь явная ошибка: ты затрёшь ячейку - вершину стека. Т.е. значение, которое было последним положено в стек перед твоей командой.
Если ты к примеру делал так:
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-сайт:
Профиль | | #19
Добавлено: 27.09.04 20:35
Не, ты все правильно сказал насчет сдвинуть esp, я просто хотел узнать, что в принципе возможна запись в стек по прямому адресу (не с помощью косвенной регистровой адресации).
Просто CyRax говорил:
А что ты думаешь насчет возможности присвоить на некоторое время регистру ds адрес ss?
Номер ответа: 20
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #20
Добавлено: 28.09.04 17:27
Впринципе вполне можно обходится и адресацией через общие регистры.
Зубков:
Т.е.
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-сайт:
Профиль | | #21
Добавлено: 28.09.04 17:40
Да, если кто хочет написать дополнительный модуль адресации через сегментные регистры - не стесняйтесь. Запишу в соавторы.
Номер ответа: 22
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #22
Добавлено: 28.09.04 18:32
Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в сегментном регистре ds, при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения в команде. Адреса дополнительных сегментов данных должны содержаться в регистрах es, gs, fs (extension data segment registers)
Т.е. как я понимаю доступ к этим регистрам такой же, как и к ds, cs, ss.
Т.е.
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-сайт:
Профиль | | #23
Добавлено: 28.09.04 19:28
Попробуй так:
MOV EAX,DS
MOV SS,EAX
Номер ответа: 24
Автор ответа:
ISpy
Разработчик Offline Client
Вопросов: 47
Ответов: 621
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #27
Добавлено: 29.09.04 02:21
Фух, приклепал сегментные регистры.
А вот правильный порядок их расположения.
/0 ES
/1 CS
/2 SS
/3 DS
/4 FS
/5 GS
Номер ответа: 28
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #28
Добавлено: 19.10.04 15:51
Мммм.... а может есть смысл написать полностью свой басик?... то бишь синтаксис и тд итп как у ВБ (или ПБ) но без изврата .. то бишь работа с диалогами такая же как у ВБ... и тд итп... компилируется всё в Асм листинг для масм... то бишь это будет компилятор компилятора.... получатся сверх малые (без изврата который у ПБ) и сверх шустрые ЕХЕ.... мне кажется народ памятник тогда создателю поставит ... вот .... впринцыпи при наших технологиях и мозгах.. что мешает то? +)... помоему ничего... либо делать компилятор компилятора в Си код или Си++... вообщем.. вот +)
Номер ответа: 29
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #29
Добавлено: 05.11.04 09:57
Нет, всё таки лучше компилировать в машинный код. А такие трансляторы уже и так есть.