Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 08.04.2012
Сообщений: 100
1

Сравнение символов в строке

22.04.2015, 15:44. Показов 3371. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста. Почему выводятся различные значения ведь edi указывает на начало строки? При выводе через %c выводится единица в обоих случаях. И можно ли использовать cmp для сравнения символов?


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
40
41
42
43
44
45
format PE console
entry enter_num
include 'win32a.inc'
 
section '.data' data readable writable
 
 
msg1 db "Test %d",0dh,0ah,0
 
text db '10',0
 
 
section '.text' code readable executable
 
enter_num:
 
        mov edi, text
        mov eax, '1'
        
        invoke printf,msg1,eax
        invoke printf,msg1,[edi]
 
        ;mov ebx, edi
        ;cmp ebx, '1'
        ;je finish
 
 
         
finish:       invoke getch
               cmp eax,27
               jnz enter_num
 
               invoke ExitProcess, 0           
 
section '.idata' import data readable
library kernel,'kernel32.dll',\
        msvcrt,'msvcrt.dll'
 
import kernel,\
       ExitProcess,'ExitProcess'
 
import msvcrt,\
       printf,'printf',\
       scanf,'scanf',\
       getch,'_getch'
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2015, 15:44
Ответы с готовыми решениями:

Сравнение символов в строке
Подскажите, пожалуйста, как можно сравнить каждое слово в строке с несколькими буквами (которые...

Сравнение и замена символов в строке
У меня в файле записан определенный текст, мне нужно читать каждое слово и если встречается в этом...

Сравнение символов в строке со списком разрешенных
Вводим слово. Может содержать всякие непечатаемые символы, в т.ч. и из других кодировок. Задача:...

YASM сравнение символов в строке с заданным символом
Здравствуйте! Объясните, пожалуйста, как посчитать количество символов в строке? Пытаюсь:...

10
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
22.04.2015, 16:22 2
Assembler
1
2
3
4
5
6
7
mov     eax, 31h
push    eax
push    offset aTestD   ; "Test %d\r\n"
call    ds:printf
push    dword ptr [edi]
push    offset aTestD   ; "Test %d\r\n"
call    ds:printf
А в стек загоняется двойное слово которое хранится по адеру в edi, а это 0х3031 = 12337
0
1 / 1 / 0
Регистрация: 08.04.2012
Сообщений: 100
22.04.2015, 16:52  [ТС] 3
Assembler
1
push    dword ptr [edi]
не проходит
0
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
22.04.2015, 17:05 4
Что не проходит? Код который я приложил, это результат работы компилятора, а именно директива invoke.

У Вас выводит 49 и 12337, в первом случае число хранится в регистре, во втором в памяти. По адресу, который хранится в edi будет прочитано двойное слово, а это 0х00003031, т.е. 12337, если Вы перепишите
Assembler
1
text db '1',0,0,0
То получите свой результат.
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
22.04.2015, 17:07 5
deleted
0
1 / 1 / 0
Регистрация: 08.04.2012
Сообщений: 100
22.04.2015, 17:11  [ТС] 6
Понял . а как получить 1 значение из строки? и почему он считывает двойное слово'1',0,0,0 а не '1' '0'
0
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
22.04.2015, 17:27 7
Вы создаете программу в WIN32, там все регистры, стек и адресация, по умочанию 32-х битная.
Загружаете в другой регистр, и обнуляете старшие биты.
Assembler
1
2
3
xor eax,eax
mov al,[edi]
invoke printf,msg1,eax
1
1 / 1 / 0
Регистрация: 08.04.2012
Сообщений: 100
22.04.2015, 17:31  [ТС] 8
Спасибо. Я думал можно только регистры одинаковой размерности использовать в команде а сейчас наткнулся на чужой код и вы написали
Assembler
1
mov al,[edi]
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
22.04.2015, 18:05 9
Цитата Сообщение от Manula93 Посмотреть сообщение
invoke printf,msg1,eax
Тут должен быть cinvoke - printf использует сюшную конвенцию вызова из-за переменного кол-ва аргументов.
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
    format  PE console
    include 'win32a.inc'
 
enter_num:
 
    mov edi, text
;   mov eax, '1'
 
    cinvoke printf,msg1,eax
    cinvoke printf,msg1,[edi]
 
finish: invoke getch
    cmp eax,27
    jnz enter_num
 
    invoke  exit, 0
 
msg1    db "Test %d",0dh,0ah,0
text    db '10',0
 
 
data import
    library msvcrt,'msvcrt.dll'
 
    import  msvcrt,\
    printf,'printf',\
    scanf,'scanf',\
    exit,'exit',\
    getch,'_getch'
end data
0
1 / 1 / 0
Регистрация: 08.04.2012
Сообщений: 100
22.04.2015, 18:12  [ТС] 10
invoke что то не правильно делает в задаче? или просто нужно использовать cinvoke при разном количестве аргументов
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
22.04.2015, 18:26 11
Цитата Сообщение от Manula93 Посмотреть сообщение
или просто нужно использовать cinvoke при разном количестве аргументов
Угу. для printf/scanf (cscanf, fscanf, sscanf, vcscanf, vfscanf, vscanf, vsscanf, _bprintf, cprintf, fprintf, sprintf, _vbprintf, vcprintf, vfprintf, vprintf, vsprintf) стек от параметров должна очищать вызывающая прога.
2
22.04.2015, 18:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2015, 18:26
Помогаю со студенческими работами здесь

В строке символов выяснить, имеется ли в строке пара одинаковых символов до первого восклицательного знака
Ребята буду признателен если поможете. Написать, подпрограмму, которая в строке символов...

Строку из n символов распечатать по m символов. Если в последней строке нет m символов, то ее не печатать
Строку из n символов распечатать по m символов в строке. Если в последней строке нет m символов, то...

В строке символов найти максимальное число одинаковых символов стоящих подряд
Разработать программу, которая в любой заданной строке символов находит максимальное число...

При смещении символов в строке выдается результат в виде кривых символов
У меня такая проблема: дело в том что я циклом смещаю символы в строке вот таким образом,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru