Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/65: Рейтинг темы: голосов - 65, средняя оценка - 4.85
9 / 9 / 8
Регистрация: 03.07.2015
Сообщений: 219

Поиск символа в строке

10.01.2016, 21:23. Показов 13550. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа принимает аргумент из командной строки и выводит его на экран. Перед тем как положить на стэк данный аргумент (для того, чтобы вывести его на экран), который я записываю в регистр EDI, я хочу проверить имеется ли в данной строке буква "а".
Для этого использую инструкцию scasb(сканирует побайтово строку в ES:EDI и сравнивает результат сканирования с содержимым регистра AL и устанавливает соответствующие флаги). Если сравниваемый элемент не был найден, то значение регистра CX будер равняться 0, в противном случае наоборот.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
.intel_syntax noprefix
.text
.globl main
main:
        push ebp
        mov ebp,esp
        mov ebx,[ebp+12]
        mov eax,[ebp+8]
 
        cld                         ;направление сканирования слева направо 
        mov al,'a'                ;символ, который хочу найти в AL
        lea edi,WORD [ebx]   ;бросаю указатель на строку в регистр EDI
        mov cx,4                ;сканирую 4 байта(либо 4 символа, тут я не уверен. поэтому тестирую на слове из 4 букв)
        repne scasb             ;сканирую пока не найдётся совпадение
        dec edi                    ;тепер EDI декрементирую т.к. он указывает на следующий символ после найденного
        cmp cx,0                  ;сравниваю CX с нулем
        je fin                       ;если равно нулю(символ не найде) выходим из программы, в противном случае выводим
                                      ;строку на экран
 
        mov edi, DWORD [ebx]
        push ebx
        push eax
        push edi
        mov edi,offset msg
        push edi
        call printf
        add esp,8
 
        pop eax
        pop ebx
fin:
        dec di
        mov esp,ebp
        pop ebp
        ret
.data
msg: .ascii "%s\n"
Код компилируется, но работает некорректно.
например в данном случае вроде бы как все хорошо:

→ ./found abcd
abcd

а в данном примере строка не должна выводится на экран, но выводится:
→ ./found xzwq
xzwq

Т.е. строка кода
Assembler
1
2
./found xzwq
xzwq
всегда false!!! помогите, плиз, с этим разобраться, подскажите, что я делаю не так??? в инете много примеров на то как найти искомый символ в строке, все из них пробовал, но увы никак не получается запилить требуемый результат.
для примера выложу некоторые примеры исползования scasb, которые я нашел в интернете, можте это как-то поможет кому-нибудь помочь мне:
Пример 1
Assembler
1
2
3
4
5
6
7
8
9
10
MOV DI, offset str
    PUSH DS
    POP ES
    CLD         ;left to right or auto-increment mode 
    MOV CX, 12      ;string length
    MOV AL, 'A'     ;character to be searched is A
REPNE  SCASB            ;cmp till equal or cx=0
    JNE Not_Found
    DEC DI
    ...
Пример 2
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
start:
; set forward direction:
    cld
; set counter to string size:
    mov cx, 10
; load string address into es:di
    mov ax, cs
    mov es, ax
    lea di, str1
; we will look for the character in string:
    mov al, find_what
    repne   scasb
    jz  found
Пример 3
Assembler
1
2
3
4
5
6
7
8
9
10
DATASEG
str DB     'ABC'     ;define string
CODESEG 
mov    ax,@data 
mov    es,ax    ;initialize es 
cld           & nbsp; ;process left to right 
lea    di,[str] ;di points to str 
mov    al,'B'   ;target character 
scasb           ;scan first byte 
scasb           ;scan second byte
Какие-нибудь идеи, ответы, знания по этому поводу???
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.01.2016, 21:23
Ответы с готовыми решениями:

Операции в строке: поиск, замена, удаление символа в строке
Доброго здравия! В ассемблере совсем новичок, поэтому прошу помощи. Программа должна получать строку с клавиатуры, получать символ,...

Поиск символа во введенной строке
Здравствуйте! Помогите написать программу под TASM, в которой вводится строка и в ней надо найти количество символа А. Идею понимаю,...

Поиск символа в строке и замена
В общем такое задание: дана страка символов, допустим "asdfjklrtldfl" дан символ "l" допустим. И нужно заменить этот символ в...

3
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
10.01.2016, 22:15
Можешь поискать так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
ORG 100h
JMP  start
 
mess0  DB  13,10,'Enter symbol: $'
mess1  DB  13,10,'Symbol found!$'
mess2  DB  13,10,'Symbol not found!$'
text   DB  'Test string',0
 
start:
;===================;/// вычисляем длинну строки =========//
   MOV   DI,text       ; адрес строки для поиска
   MOV   CX,0FFFFh     ; ставим СХ на максимум
   XOR   AL,AL         ; искать будем нуль (маркер конца)
   REPNE SCASB
   NOT   CX            ; СХ = длинна строки
   SUB   DI,CX         ; DI = адрес начала строки
 
;===================;/// принимаем от юзера символ =======//
   MOV   AH,9
   MOV   DX,mess0
   INT   21h
   MOV   AH,1          ; AL = символ для поиска
   INT   21h
 
;===================;/// начинаем поиск.. ================//
   REPNE SCASB         ; ищем до совпадения
   JZ    ok            ; переход, если ZF=1 (т.е. символ найден)
   MOV   DX,mess2      ; мессага "..нет символа"
   JMP   print         ; зовём DOS
ok:
   MOV   DX,mess1      ; есть такой символ!
print:
   MOV   AH,9
   INT   21h
 
exit:
   XOR   AX,AX           ; выход!
   INT   16h
   INT   20h
2
9 / 9 / 8
Регистрация: 03.07.2015
Сообщений: 219
10.01.2016, 23:50  [ТС]
R71MT, сори, а как например перевести данную строку
Assembler
1
ORG 100h
под линукс??? прочитал что она резервирует 100 байт памяти под нужды программы при ее запуске. Я то в nasm'ме не силен, а тут для меня буквы h в строках абсолютная магия,
Цитата Сообщение от R71MT Посмотреть сообщение
MOV * DI,text * * * ; адрес строки для поиска
* *MOV * CX,0FFFFh * * ; ставим СХ на максимум
* *XOR * AL,AL * * * * ; искать будем нуль (маркер конца)
* *REPNE SCASB
* *NOT * CX * * * * * *; СХ = длинна строки
* *SUB * DI,CX * * * * ; DI = адрес начала строки
Данный участок кода я перевёл как:
Assembler
1
2
3
4
5
6
 mov edi,dword [ebx]
        mov ecx,65535
        xor al,al
        repne scasb
        not ecx
        sub edi,ecx
Но это не заработало почемуто??? Строку я заношу в edi т.к. аргумент,который я считываю с командной строки dw(4 байта). Я бы это задание с божьей помощью давно бы написалда вот только нормально не могу например с MASM'а на NASM перевести))))))))))))))
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
11.01.2016, 00:38
..ORG 100h - это зарезервировать 100h/256d байт в начале кода для PSP (префикса программного сегмента). Юзается только для COM-файлов. А участок кода ты перевёл правильно. Литер "h" в конце числа означает, что число в 16-тиричном (HEX) формате: 65535d = FFFFh
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2016, 00:38
Помогаю со студенческими работами здесь

Поиск последней позиции символа в строке
Есть строка, в нее получаю путь к файлу, нужно обрезать до имени, следовательно нужно искать позицию последнего символа '\'. Есть...

Поиск символа в строке. Как осуществить поиск в обратном направлении
Всем доброго времени суток. Вопрос такой: как осуществить поиск в обратном направлении, т.е. я в строке (a(bc)) нахожу первую закрытую...

Поиск символа в строке
Доброго времени суток, форумчане. Подскажите как сделать примерно такой алгоритм: Нужно выполнить поиск в строке символа '_' и затем ...

Поиск символа в строке
Предположим я беру строчку вот так: Memo1->Lines->Strings; Как сделать поиск по этой строке, и когда будет символ #, все что после этого...

Поиск символа в строке
Здравствуйте! у меня такой вопрос, надо найти символ в строке, а именно символ '<' и '>' между этими символами может быть что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru