Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: получение длины строки (массива)  (Прочитано 24041 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Антон09032015
Новенький

ru
Offline Offline

« : 09-03-2015 10:13 » 

Делаю всё в Fasm-е

есть зарезервированный массив
caption1_text rb 32.

В него записываем строку.
Дальше пробую получить длину полученной строки следующим образом
Код:
push    edi ecx
        cld
        mov     edi,dword[caption1_text]
        xor     ecx,ecx
        dec     ecx
        xor     eax,eax
        repne   scasb
        not     ecx
        dec     ecx
        mov     eax,ecx
        pop     ecx edi
Естественно, программа падает ))

Подскажите, что не так делаю?
В асме не силён, особо не ругайте.
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #1 : 10-03-2015 06:25 » 

Честно говоря в fasm-е не силён, но строка, которую Вы записываете в caption1_text ASCIIZ (т.е. заканчивается 0-вым байтом)? Сегментный регистр es инициализирован значением сегмента, в котором хранится строка? Строка, которую Вы записываете в caption1_text не превышает 32 байта?
Записан
slab
Интересующийся

ru
Offline Offline

« Ответ #2 : 31-03-2015 10:14 » new

Хоть тема и устарела, но отвечу, может кому и понадобиться.
Если мы имеем ASCIIZ строку, то она заканчивается символом 0, следовательно заместо команды xor eax,eax
надо mov al,'0'. А так при eax=0 мы выйдем за границы и получим AV.
« Последнее редактирование: 31-03-2015 10:16 от slab » Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #3 : 31-03-2015 10:20 » 

Если мы имеем ASCIIZ строку, то она заканчивается символом 0, следовательно заместо команды xor eax,eax
надо mov al,'0'. А так при eax=0 мы выйдем за границы и получим AV.
Код: (ASM)
xor eax,eax
это, в данном случае, аналог
Код: (ASM)
mov eax,0
что включает в себя, в том числе, и
Код: (ASM)
mov al,0
Записан
slab
Интересующийся

ru
Offline Offline

« Ответ #4 : 31-03-2015 10:27 » 

Если мы имеем ASCIIZ строку, то она заканчивается символом 0, следовательно заместо команды xor eax,eax
надо mov al,'0'. А так при eax=0 мы выйдем за границы и получим AV.
Код: (ASM)
xor eax,eax
это, в данном случае, аналог
Код: (ASM)
mov eax,0
что включает в себя, в том числе, и
Код: (ASM)
mov al,0
Код символа '0' =30, а код символа NUL = 0
тоеть xor eax,eax <> mov al,30,  я не зря 0 в кавычки взял
« Последнее редактирование: 31-03-2015 10:28 от slab » Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #5 : 31-03-2015 10:33 » 

Если мы имеем ASCIIZ строку, то она заканчивается символом 0, следовательно заместо команды xor eax,eax
надо mov al,'0'. А так при eax=0 мы выйдем за границы и получим AV.
Код: (ASM)
xor eax,eax
это, в данном случае, аналог
Код: (ASM)
mov eax,0
что включает в себя, в том числе, и
Код: (ASM)
mov al,0
Код символа '0' =30, а код символа NUL = 0
тоеть xor eax,eax <> mov al,30,  я не зря 0 в кавычки взял
прошу прощения, недоглядел, тем не менее ASCIIZ строка заканчивается не символом '0', а кодом 0.
Записан
slab
Интересующийся

ru
Offline Offline

« Ответ #6 : 31-03-2015 10:36 » 

Ой, точно Улыбаюсь склероз Жаль
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines