Буфер сам меняет содержимое?

Тема в разделе "WASM.BEGINNERS", создана пользователем Processor, 18 мар 2008.

  1. Processor

    Processor New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2008
    Сообщения:
    46
    В чём причина изменения буфера?

    есть три буфера

    .data
    buf1 db ?
    buf2 db ?
    buf3 db ?
    ----------------------------------------
    Я передаю из эдита строку в первый буфер

    invoke GetWindowText, hwndedit1, ADDR buf1, 129
    Всё нормально

    Сразу же передаю и во второй
    invoke GetWindowText, hwndedit1, ADDR buf2, 129
    Опять всё нормально

    А теперь в третий буфер
    invoke GetWindowText, hwndedit1, ADDR buf3, 129
    В третьем буфере появляется какая-то ерунда.


    Далее многочисленые но неудачные попытки найти причину.
    Устал. Стал думать...
    Ладно, думаю, сделаю хитро - вместо эдита я просто копирую строку из первого буфера в третий...

    И блин снова тоже самое - во третьем буфере опять что-то непонятное...

    Как буфер может самостоятельно менять содержимое?
    Где моя ошибка?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    либо "invoke GetWindowText, hwndedit1, ADDR buf1, 1", либо "db ?" замени на "db 129 dup (?)"
     
  3. Processor

    Processor New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2008
    Сообщения:
    46
    ОК, понял.
    А почему тогда сначала в первый буфер всё корректно забивается? Не могли бы растолковать причину?
     
  4. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Нифига не коректно он вылезает за границы и перезаписывает память которая идёт за ним, тоесть buf2 и buf3 и ещё 126 байт. если это не вызвало ошибку значит в этих 126 байтах небыло ничего критичного
     
  5. a1ss

    a1ss New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2007
    Сообщения:
    120
    db - это резв байтека, это же не ООП, кто кроме тебя должен следить за использованием памяти..
     
  6. Processor

    Processor New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2008
    Сообщения:
    46
    Простите не понял
    что значит этот хитрый термин - резв байтека?
     
  7. keYMax

    keYMax New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2003
    Сообщения:
    276
    Адрес:
    Новоуральск
    просто резервируешь всего лишь 1 байт в секции данных
    хочешь массив байтов надо писать buf1 db 129 dup (?)
     
  8. Processor

    Processor New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2008
    Сообщения:
    46
    Ага .
    Если
    buf1 db 129 dup (?)
    Это я могу разместить тут строку от 1 до 129.

    А почему тогда если
    buf db ?
    Я не могу сюда забить от 1 до 129?

    И в первый буфер же всё помещается!
    А вот потом уже нет.
     
  9. a1ss

    a1ss New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2007
    Сообщения:
    120
    Processor что такое буфер? Фактически это адрес памяти. А размер - это для того, чтобы следующая переменная шла ПОСЛЕ этого кол-ва байтов. Сталобыть не было перезаписано ничем. ТО, что у тебя n байт записывается успешно - всеголишь везение)
     
  10. Processor

    Processor New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2008
    Сообщения:
    46
    Всё понял, спасибо.
    Тогда вот что...
    Если
    buf db 129 dup (?)

    Посоветуйте, как лучше кинуть в eax
    реальное число символов,
    которое сейчас в buf

    Я делаю
    razmer=($-buf)
    А показывает всё равно 1

    Ещё есть что,
    может какая API-шка?

    Вот что-то вертится в голове
    leastrlen что-ли...

    Есть такое?
     
  11. a1ss

    a1ss New Member

    Публикаций:
    0
    Регистрация:
    18 ноя 2007
    Сообщения:
    120
    strlen.... msdn %)
     
  12. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Уточни, что значит "реальное число символов"? Вот так в eax можно передать величину буфера в байтах
    Код (Text):
    1. .data
    2. buf  db  129 dup (?)
    3. n = $-buf; должно стоять именно здесь - после buf  $-получить адрес памяти
    4. ;сразу после конца буфера и вычесть из него адрес начала буфера
    5. .code
    6. ...
    7. mov eax,n
    А можно еще проще
    Код (Text):
    1. num equ 129
    2. .data
    3. buf db num (?)
    4. .code
    5. mov eax,num
     
  13. Processor

    Processor New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2008
    Сообщения:
    46
    num equ 129
    .data
    buf db num (?)
    .code
    mov eax,num

    Так же не пойдёт?
    Так число символов всегда будет 129
    Я же ввожу в буфер данные из эдитбокса. Заранее не зная сколько их будет. 129 -это максимум.
    А если идти таким методом, этот приём покажет не количество символов, а размер буфера - 129. Я и так знаю, что он 129.

    И вот... Превращать 129 в константу... Я думаю, это не даёт сокращения работы... Те же три символа. И лишь новая строка
    num equ 129
     
  14. boobl

    boobl New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    18
    Чтобы узнать длину строки которая лежит в буфере, необходимо вызывать ф-цию strlen, которая принимает в качестве своего единственного параметра адрес буфера в котором строка и находится.
    Для того чтобы ф-ция работала правильно, в конце строки должен находиться нулевой байт. Впрочем,
    invoke GetWindowText, hwndedit1, ADDR buf1, 129
    добавит его автоматически.

    А трюки с $ здесь не помогут т.к. само $ известно на этапе линковки и $ - buf это элементарная арифметическая операция.
    Соответственно
    Код (Text):
    1. buf  db  129 dup (?)
    2. n = $-buf;
    и
    Код (Text):
    1. num equ 129
    2. .data
    3. buf db num (?)
    4. .code
    5. mov eax,num
    — вещи абсолютно идентичные.
     
  15. Processor

    Processor New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2008
    Сообщения:
    46
    <Чтобы узнать длину строки которая лежит в буфере, <необходимо вызывать ф-цию strlen, которая принимает в <качестве своего единственного параметра адрес буфера в <котором строка и находится.

    Спасибо, Буби.
    Вот сейчас все нормально работает.
    В eax реальное количество символов.
     
  16. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Processor
    Один из вариантов
    Буфер предварительно заполняется нулями. После получения символов из эдита ищется первый ноль
    Код (Text):
    1. or ecx,-1
    2. xor al,al
    3. mov edi,offset buf
    4. repne scasb
    5. not ecx; в ecx количество введенных символов
    boobl
    а трюки с n equ 129 /buf db n dup (?) и buf db 'Hello, world!',0/n = $-buf используются первый для отвода места под буфер, второй для подсчета символов в сообщении
    Я ведь просил уточнить, что Processor понимает под "реальным числом символов"? ...
     
  17. Processor

    Processor New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2008
    Сообщения:
    46
    Красиво!
     
  18. boobl

    boobl New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    18
    Mikl__
    К вам, товарищ, претензий нет, т.к. величину буфера надобно вычислять как раз с помощью $-buf
    только вот
    Код (Text):
    1. or ecx,-1
    2. xor al,al
    3. mov edi,offset buf
    4. repne scasb
    5. not ecx; в ecx количество введенных символов
    выполняется в n раз медленнее чем та же стандартная функция strlen, находящаяся в стандартной же библиотеке masm.
     
  19. Processor

    Processor New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2008
    Сообщения:
    46
    Но вариант довольно-таки познавателен именно с целью демонстрации возможностей асма. Вероятно, Микл именно на этом и акцентировал. Спасибо Микл тоже.
     
  20. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    пардон, во сколько раз медленнее?
    стоит задача соптимизировать код, только вместо scasb присутствует movs:
    Код (Text):
    1.      mov    eax, [length]  ; bytes
    2.      mov    ecx, eax
    3.      shr    ecx, 2
    4.      mov    edi, ...
    5.      mov    esi, ...
    6.      rep movsd
    7.      test   al,0x2
    8.      je     @1
    9.      movsw  
    10. @1:     test   al,0x1
    11.      je     @2
    12.      movsb
    13. @2: