Переменная типа String

Предыдущая тема Следующая тема Перейти вниз

Переменная типа String

Сообщение  tux в Вт Авг 19, 2008 2:21 pm

Давно было интересно, как в памяти размещается переменная string, вот и поколупался, вдруг кому интресно будет...
Код:
'мутим переменную, и сразу в нее чевонибудь запихиваем
dim as string pStr
pStr="SHACHLOPOPYACHSYA!!!11"
'смотрим размер переменной
print "sizeof(pStr)=" & sizeof(pStr) & "; len(pStr)=" & len(pStr)
'получаем 12 байт, предположительно 3 переменные integer
'будем побайтово смотреть
'получаем адрес первого байта
dim as integer ptr ppInt
dim as ubyte ptr ppByte
ppInt=@pStr
'смотрим че тама лежит
for i as integer=0 to 2
    print *(ppInt+i) & " "
next i
'ага... первые четыри байта напоминают какойто адрес
'а какой адрес тут может храниться? да наверно начала самой строки
'проверяем))
dim as zstring ptr ppZStr
ppZStr=*ppInt
print *ppZStr
'угадал))
'тааак, а второе число напоминает результат функции len(),
'меняем размер строки и число меняется
'ну а третье это рамер выделяемой памяти под переменную,
'размер выравнивается по границе в 36 байт, указывает на размер
'строки + еще какихто 8 байт, каких пока незнаю
sleep
вот тока для меня так и остался под вопросом тот момент, когда можно добавлять к строке символы, как это реализуется... возможно ети непонятные 8 байт указывают на следующий блок данных с продолжением строки, типа как ссылкой (наподобе списка) хз...
avatar
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 29
Откуда : Сибирь

Посмотреть профиль http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Re: Переменная типа String

Сообщение  electrik в Вт Сен 02, 2008 8:28 pm

привет. как мы знаем, что все переменные во FreeBasic, созданные Dim, хранятся в отведенном стеке. по умолчанию там отведено один мегабайт. туда и попадают переменные типа string. попробуй при компиляции программы использовать ключ -R, не удалять ассемблеровские файлы, там ты много чего увидиш.
приведу простой код со строками и коментариями

dim text as string 'создадим массив
dim text2 as string 'еще один
text="testing string massive " 'запишем в первую переменную текст
text2="freebasic" 'но и вовторую
text=text & text2 'прибавим к первой переменной вторую
print text 'фигачим на экран
sleep 'подождем

называем файл test.bas, компилируем
fbc test.bas -R
смотрим ассемблеровский файл.
комментарии не ковсем строкам, только ко главным
.intel_syntax noprefix

#test.bas' compilation started at 20:32:15 (FreeBASIC v0.20.0b)

.section .text
.balign 16

.globl _main
_main:
push ebp
mov ebp, esp
and esp, 0xFFFFFFF0
sub esp, 28
mov dword ptr [ebp-4], 0
call ___main
push 0
push dword ptr [ebp+12]
push dword ptr [ebp+8]
call _fb_Init@12
.Lt_0001:
#подготовим почву для наших двух массивов
mov dword ptr [ebp-16], 0
mov dword ptr [ebp-12], 0
mov dword ptr [ebp-8], 0
mov dword ptr [ebp-28], 0
mov dword ptr [ebp-24], 0
mov dword ptr [ebp-20], 0
#закончили подготавливать почву

push 0
push 24 #сохраним в стек длину нашего первого текста
push offset _Lt_0003 #сохраним в стеке смещение нашего первого текста)
push -1
lea eax, [ebp-16] #загрузим в регистр eax, смещение в памяти регистра ebp-16
push eax #сохраним в стеке eax
call _fb_StrAssign@20 #а вот как эта функция написана, смотри в исходниках. она уже в стеке создает массив
push 0
push 10 #сохраним в стеке длину нашего второго текста
push offset _Lt_0004 #сохраним в стеке смещение нашего второго текста
push -1
lea eax, [ebp-28] #загрузим в регистр eax, смещение в памяти регистра ebp-28.
push eax #сохраним в стек eax
call _fb_StrAssign@20 #а вот как эта функция написана, смотри в исходниках. она уже создает в стеке наш второй массив

push 0
push -1
lea eax, [ebp-28] #загрузим в eax, смещение ebp-28
push eax #сохраним в стек eax
push -1
lea eax, [ebp-16] #загрузим в eax, смещение ebp-16
push eax #сохраним в стек eax
call _fb_StrConcatAssign@20 #смотри в исходниках. эта функция добавляет к первому массиву второй
push 1
lea eax, [ebp-16] #загрузим в eax, смещение ebp-16
push eax #сохраним в стек eax
push 0
call _fb_PrintString@12 'смотри в исходниках. эта функция печатает текст на экран
push -1
call _fb_Sleep@4 #смотри в исходниках. эта функция sleep
lea eax, [ebp-28] #загрузим в eax, смещение ebp-28
push eax
call _fb_StrDelete@4 #удаляет наш первый массив
lea eax, [ebp-16] #загрузим в eax, смещение ebp-16

push eax
call _fb_StrDelete@4 #удаляет наш второй массив
.Lt_0002:
push 0
call _fb_End@4
mov eax, dword ptr [ebp-4]
mov esp, ebp
pop ebp
ret
#test.bas' compilation took 0.000197609379064545 secs

.section .data
.balign 4
_Lt_0003: .ascii "testing string massive \0" #текст нашего первого массива
.balign 4
_Lt_0004: .ascii "freebasic\0" #текст нашего второго массива


уф, вроде все. если есть какие-нибудь ошибки формулировки, прошу поправить, потому что этот ассемблер, путается в голове. к томуже я давно на нем ни чего не писал. давно, достаточно для ассемблера 2 3 месяца.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Переменная типа String

Сообщение  vbman в Вс Дек 07, 2008 4:25 pm

'ага... первые четыри байта напоминают какойто адрес

Это не адрес. Первые два байта - это длина буфера, выделенного для строки, а вторые - фактическая длина строки до нуля.
avatar
vbman

Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 35
Откуда : Украина, Кировоград

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Переменная типа String

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения