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

Вывод количества символов в строке без знака пробела

20.06.2018, 09:23. Показов 1903. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Пишу программу для тренировки, но не знаю как убрать знаки пробела из подсчета количества символов в веденной мной строке. Удается убирать только один пробел, пытался сделать все это в цикле, но не получилось. Подскажите как сделать, чтобы счет правильно велся даже при нескольких пробелах.
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
46
47
48
49
50
51
52
53
54
55
56
57
.model small
.stack 100h
 
.data
msg   db 10,13, 'VVEDI STROKU S PROBELOM: $'
msg2  db 10,13, 'KOLICHESTVO SIMVOLOV V STROKE BEZ PROBELOV:$'
string db 255, ?,256 dup ('$')
 
.code
start:
        mov ax, @data
        mov ds, ax
 
        mov ah, 9
        lea dx, msg_a
        int 21h
        
        mov ah, 9
        lea dx, msg
        int 21h
 
        mov ah, 0Ah
        lea dx, string
        int 21h
        
output:
        mov ah, 9
        lea dx, msg2
        int 21h
        mov al,string+1
        cmp al,'' ; проверка на наличие пробела
        dec al    ; если знак пробела, то декрементируем содержимое al
        call Print
Exit:
        mov ah, 4Ch
        int 21h
 
Print   proc
        xor cx,cx
        mov bl,10
Prepare:
        xor ah,ah
        div bl
        add ah,'0'
        push ax
        inc cx
        or al,al
        jnz Prepare
PutChar:
        pop ax
        mov al,ah
        int 29h
        loop PutChar
        ret
Print   endp
 
END start
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2018, 09:23
Ответы с готовыми решениями:

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

Написать программу вычисления количества символов пробела в файле
Написать программу вычисления количества символов пробела в файле. Текст заполняется с клавиатуры

Программа подсчитывающая количества всех символов строки,кроме пробела
Тип данных-строка. Нужно написать как можно проще. Не получается помогите( Добавлено через 40...

Подсчитать процент каждого знака препинания от общего количества символов
Написать программу, которая находит количество знаков препинания в созданном текстовом файле, и...

11
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.06.2018, 09:48 2
Vitalijj556,
Assembler
1
2
3
4
5
6
7
8
       mov si,offset строка с пробелами
       mov di,offset строка без пробелов
       mov cx,длина строки
@1: lodsb
       cmp al,20h;код пробела
       je @0
       stosb
@0:  loop @1
0
0 / 1 / 0
Регистрация: 25.04.2017
Сообщений: 20
20.06.2018, 10:31  [ТС] 3
То есть мне нужно сначала удалить из строки пробелы, и присвоить ее регистру di ,а в cx заложить длину строки?

Добавлено через 34 минуты
Mikl___, я понял, что мне в общем надо переписать все что я до этого написал.
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
20.06.2018, 10:39 4
Если задача только подсчёт без модификации - можете или считать пробелы или только символы без пробелов.
Assembler
1
2
3
4
5
6
7
8
  mov [Count], 0
@1:
  lodsb
  cmp al, ' '
  je @2:
    inc [Count]
@2:
  loop @1
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.06.2018, 10:43 5
Vitalijj556,
длину строки ты знаешь, на эту строку указывает регистр SI. создаешь пустую строку, на неё указывает регистр di. Ты же пытаешься удалить из строки пробелы? Если твоя цель просто посчитать количество пробелов в строке, то это делается либо через команду SCASB
Assembler
1
2
3
4
5
6
7
8
9
10
       mov di,offset строка с пробелами
       mov al,20h
       mov cx,длина строки
       mov bx,0;счетчик пробелов
@0: repne scasb
      jnz @1 
      inc bx
      jcxz @1
      jmp @0
@1:
либо через LODSB
Assembler
1
2
3
4
5
6
7
8
       mov si,offset строка с пробелами
       mov cx,длина строки
       mov bx,0;счетчик пробелов
@1: lodsb
       cmp al,20h;код пробела
       jne @0
       inc bx
@0:  loop @1
0
0 / 1 / 0
Регистрация: 25.04.2017
Сообщений: 20
20.06.2018, 11:05  [ТС] 6
Mikl___, да у меня просто подчет количества символов строки без пробелов, без модификации и вывода строки без пробелов, спасибо я почитал ваш ответ понял, всегда доходчиво объясняете.
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
20.06.2018, 11:06 7
Если через scasb - нужно ещё es настроить на сегмент данных.
Assembler
1
2
mov ax, ds
mov es, ax
1
0 / 1 / 0
Регистрация: 25.04.2017
Сообщений: 20
20.06.2018, 11:38  [ТС] 8
ФедосеевПавел, а каким образом здесь происходит подсчет символов без пробела? В этом примере выходит просто подсчет пробелов, а вот как посчитать символы в строке исключаяя их?
Assembler
1
2
3
4
5
6
7
8
mov [Count], 0
@1:
  lodsb
  cmp al, ' '
  je @2:
    inc [Count]
@2:
  loop @1
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
20.06.2018, 11:49 9
Лучший ответ Сообщение было отмечено Vitalijj556 как решение

Решение

Vitalijj556,
общее количество символов в строке известно это https://www.cyberforum.ru/cgi-bin/latex.cgi?N, ФедосеевПавел предлагает подсчитать количество символов в строке, которые не являются пробелами, в результате получишь число https://www.cyberforum.ru/cgi-bin/latex.cgi?M, теперь внимание на экран, https://www.cyberforum.ru/cgi-bin/latex.cgi?S=N-M это количество пробелов в строке
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
20.06.2018, 11:59 10
Assembler
1
2
3
4
5
6
7
8
mov [Count], 0    ;Count:=0;
@1:               ;for i:=1 to length(S) do
  lodsb           ;  if S[i]<>' ' then
  cmp al, ' '
  je @2:
    inc [Count]   ;    inc(Count)
@2:
  loop @1
0
0 / 1 / 0
Регистрация: 25.04.2017
Сообщений: 20
20.06.2018, 14:02  [ТС] 11
ФедосеевПавел,
Assembler
1
2
3
4
5
6
7
8
mov [Count], 0    ;Count:=0;
@1:               ;for i:=1 to length(S) do
  lodsb           ;  if S[i]<>' ' then
  cmp al, ' '
  je @2:
    inc [Count]   ;    inc(Count)
@2:
  loop @1
Здесь Count это регистр содержащий в себе введенную строку с пробелами? попробовал предложенное решение ответ получил неправильный, хотя функция вывода значения вроде работает правильно. Либо я данный фрагмент неправильно по ходу программы применил.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
.model small
.stack 100h
 
.data
msg   db 10,13, 'VVEDI STROKU S PROBELOM: $'
msg2  db 10,13, 'KOLICHESTVO SIMVOLOV V STROKE BEZ PROBELOV:$'
string db 255, ?,256 dup ('$')
Count db ?
 
.code
start:
        mov ax, @data
        mov ds, ax
 
        mov ah, 9
        lea dx, msg
        int 21h
 
        mov ah, 0Ah
        lea dx, string
        int 21h
        
output:
        mov ah, 9
        lea dx, msg2
        int 21h
        mov al,string+1
        mov [Count], 0
@1:
  lodsb
  cmp al, ' '
  je @2:
    inc [Count]
@2:
  loop @1
   mov al, [Count]
        
    call Print
Exit:
        mov ah, 4Ch
        int 21h
 
Print   proc
        xor cx,cx
        mov bl,10
Prepare:
        xor ah,ah
        div bl
        add ah,'0'
        push ax
        inc cx
        or al,al
        jnz Prepare
PutChar:
        pop ax
        mov al,ah
        int 29h
        loop PutChar
        ret
Print   endp
 
END start
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
20.06.2018, 14:21 12
Нет, Count - это ячейка памяти, переменная. Или можете заменить её на свободный регистр.
Я только идею показал. Программа ваша, вы вольны поступать произвольно.

Добавлено через 2 минуты
Чтобы использовать lodsb - нужно настроить si на адрес строки. Вам же Mikl___ это показал в одном из примеров с разъяснениями по регистрам.
Да и чтение справки никто не отменял.

Добавлено через 1 минуту
Если есть сомнения в правильности исполнения программы - работайте через отладчик и выполняйте по шагам, смотрите содержимое регистров.
1
20.06.2018, 14:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.06.2018, 14:21
Помогаю со студенческими работами здесь

Вывод символов до первого пробела
Как можно вывести из трех слов только первое? Например, вместо &quot;Иванов Иван Иванович&quot; нужно вывести...

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

Реализовать функцию без параметров, определяющую количество символов, отличных от пробела
Задача: Описать функцию next() без параметров, которая считывает с клавиатуры первый символ,...

Как найти количество символов в строке до определённого знака?
есть много разных строк. как в них найти количество символов до определенного знака? в моем случае...

Вывод числа без знака '-'
Доброго времени суток. У ввожу число положительное или отрицательное, когда я ложу отрицательное...

Вывод символов в виде ? знака в ромбе
Вот код &lt;?php header(&quot;Content-Type: text/html;charset=uTf-8&quot;); $b=&quot;Напишем сюда что-нибудь&quot;;...


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

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