Картинка на тему устройства строковых типов и кое что еще

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Картинка на тему устройства строковых типов и кое что еще

Сообщение ANDLL » 03.12.2006 (Вс) 22:29

Картинка
Изображение
Некий BV надоумил меня нарисовать пару картинок на тему устройства типов данных.
Строки
Тут я описал три способа хранить строки(на самом деле способов можно придумать бесчисленное множество, но наиболее распространены как мне кажеться эти).
Итак, первый тип, BSTR(именно он использовуется в переменных типа String в VB6) - строка из unicode-символов, которая кончается двухбайтовым терминатором и перед которой стоит ее длина. Ввиду того, что сама строка содержит свою длину она может содержать произвольные символы.
Во второй тип, ABSTR, VB преобразует строки перед тем как передать их в API-функции. Этот тип отличается от BSTR тем, что содержит однобайтовые символы, вместо двухбайтовых.
Третий, LPSTR традиционно используется в C. Этот тип нигде не хранит длину строки, окончание строки определяется по нулевому терминатору в конце. Строка содержит однобайтовые символы. В отличие от первых двух типов, где нулевой терминатор стоит в конце лишь для совместимости со старыми типами, в LPSTR нулевой терминатор необходим, так как он указывает на конец строки. Так же нелишне отметить, что LPSTR строки по определению не могут содержать нулевых символов. Если вы поместите в LPSTR нулевой символ то для всех использующих ее функций строка "обрежется" до этого символа(по вполне очевидным причинам). Не менее важный минус LPSTR заключается в том, что время определения длины такой строки прямо пропорционально длине строки. Для очень длинных строк, порядка мегабайта, определение длины может оказаться весьма дорогой ситуацией. Типы (A)BSTR этого недостатка лишены.
Адреса
Напоследок раскажу об устройстве адреса в ОС windows. Вам ведь известно, что любую ячейку памяти процесса можно "обозвать" четырехбайтовым числом? Если известно, то увы вы малость заблуждаетесь.
На самом деле АП процесса содержит как минимум два сегмента - основной сегмент и вспомогательный.
Номер основного сегмента хранится в регистрах ds,cs,ss,es. gs не используется.
В fs хранится номер второго, служебного сегмента(который правда, является частью основного сегмента) и в этом сегменте храняться некоторые полезные данные о процессе, например его id.
Однако на практике этот сегмент используется только внутри ОС, так как его содержимое вообще говоря малокументировано(описание некоторого содержимого fs можно прочитать в топике tyomitch).
А вот со вторым сегментом, номер которого всегда хранится в DS и ведет работа наша программа.
Если теперь принять утверждение о том, что написанная нами часть кода программы будет работать только с теми данными, что лежат в основном сегменте, то становится очевидным, почему так часто говорят что адрес в windows это только лишь четырех байтовое число.
Полное устройство адреса показано на рисунке, как видно он состоит из трех частей, номера сегмента, номера страницы и смещения внутри страницы.
Номер сегмента, как было сказано всегде лежит в ds и ss, так что про него можно "забыть" в большинстве случаев.
Номер страницы и смещение храняться внути 4-х байтового числа, void* в C++ или просто Long в VB. При этом под смещение страницы выделяется 12 бит а под номер - 20 бит. Если вам вдруг потребуется разрубить адрес на две части(я с трудом, правда, представляю, зачем вам это), то можно воспользоваться такой простой формулой:
Код: Выделить всё
Offset=Address\&h1000
PageNumber=Address AND &hfffff000
Последний раз редактировалось ANDLL 05.12.2006 (Вт) 16:34, всего редактировалось 4 раз(а).
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.12.2006 (Вс) 22:42

То, что fs ссылается не в "другую реальность", а внутрь основного сегмента -- это незначительная мелочь? :-)


Ещё придирки по мелочам:

1) ABSTR принято называть именно так (не BSTRA)
2) gs никуда не указывает (это я про "и всех остальных кроме fs")
3) ячейка fs:0 указывает на вершину списка SEH, в этом качестве вполне документирована, и активно используется практически всеми прикладными программами.
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 03.12.2006 (Вс) 23:49

Кто такая Каринка? :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.12.2006 (Пн) 7:21

Выспавшись, увидел катастрофический баг в картинке: перед BSTR хранится её длина не в символах, а в байтах. На верхнем рисунке тоже должно быть 0Ch
(ну, и порядок байтов на картинке тоже какой-то не такой)
Изображение

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 04.12.2006 (Пн) 12:01

ANDLL доработай свой труд и пришли мне его по e-mail в формате Word для выкладки на сайте.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.12.2006 (Пн) 16:29

И снова я чувствую себя испытательным полигоном :? Топик сначала проверяется, и если он будет иметь успех, запощивается сюда. Так?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 04.12.2006 (Пн) 23:21

tyomitch
fixed.
Еще комментарии?
Хакер
Не понимаю, о чем ты. То тебе не нравится что у тебя никто не пишет, то не нравится, что пишет.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.12.2006 (Вт) 3:06

ANDLL
Я же тебе уже всё объяснил в асе.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.12.2006 (Вт) 6:40

ANDLL писал(а):tyomitch
fixed.
Еще комментарии?

"и всех остальных кроме fs" осталось.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 05.12.2006 (Вт) 15:09

Fixed. Еще?
Кстати, добавлен LPWSTR
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.12.2006 (Вт) 15:24

В заголовке ABSTR, в маленькой рамочке BSTRA.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.12.2006 (Вт) 16:18

:lol: :lol:
Прошу заменить фразу "Номер основного сегмента хранится в регистрах ds,cs,ss и некоторых других." на "Номер основного сегмента хранится в регистрах ds,cs,ss,es и больше нигде, потому что gs не используется, fs описан ниже, а других сегментных регистров в i386 нету."


Фраза про то, что есть "как минимум два сегмента - основной сегмент и вспомогательный", хотя формально верна, всё ещё кажется вводящей в заблуждение (вспомогательный сегмент -- часть основного).
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 05.12.2006 (Вт) 16:31

GSerg, tyomitch
fixed
Последний раз редактировалось ANDLL 05.12.2006 (Вт) 16:35, всего редактировалось 1 раз.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 05.12.2006 (Вт) 19:52

А является ли ABSTR OLE-типом? И каким образом его объявлять в tlb?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.12.2006 (Вт) 20:53

ABSTR -- это частный случай BSTR. Объявляется так же.
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 05.12.2006 (Вт) 21:23

Спасибо, но видимо не совсем... В доках к PowerBASIC указано, что местный String - ABSTR, однако, будучи объявленным в TLB, как BSTR таки вызывает Access Violation. Впрочем, та проблема уже решена.
Изображение


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 82

    TopList