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

Вывести все числа в строке

03.11.2013, 11:38. Показов 1576. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят, не силён в асме, помогите. Условие: дана строка, состоящая из символов. Вывести на экран все числа этой строки (разделителем является всё, кроме пробела). Вот мой код, что тут не так?
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
.model small
.stack 256h
.data
    input_msg  db       "Please, enter your string (no more than 128 symbols)$"
    str_crlf   db       13, 10, '$'
    first_bit  equ      1000000000000000b
    c10    db       10  
    
    max_length dw       128         ; максимальная длина строки
    len        dw       0           ; реальная длина введенной строки
    string     db       128 dup(?), '$' ; исследуемая строка
    sum        dw       0
    counter_i  dw       0
    counter_j  dw       0
.code
 
;//////Функция преобразования строки в число//////         
EnterNumber PROC 
;-------Сохранение содержимого регистров в стек------- 
    push    ax         
    push    bx
    push    cx
    push    dx
    push    di
    push    si
;----------------------------------------------------
read_xor:
    xor bx, bx ; обнуляем место хранения цифр
    xor     cx, cx ; обнуляем количество введенных цифр
    xor     di, di ; флаг цифры
 
;-----Начало преобразования-----
read_start: 
    mov     si, counter_i
    mov al, string[si]
    inc counter_i
    
    cmp al, 32
    je  read_start
                 
    cmp     al, '0' ; если символ < '0' то пропускаем
    jc  read_not_a_digit
    cmp     al, '9' ; если символ > '9' то пропускаем
    jnc     read_not_a_digit    
 
;-----Чтение очередной цифры числа-----           
read_digit:
    mov di, 1       ; устанавливаем флаг цифры  
 
        push    ax                       
    mov     ax, bx      ; помещаем в ах введенные ранее цифры   
    imul    c10         ; умножаем их на 10
    jo  read_exception  ; в случае переполнения уведомляем об ошибке
    
    pop bx
    add     bx, ax      ; записываем результат обратно в bx 
 
        inc     cx      ; увеличиваем счётчик цифр    
    jmp     read_start 
 
;-----Чтение отличного от цифры символа------
read_not_a_digit:
    cmp di, 0
    je  read_start
 
    jmp read_finish
 
;-----Ветка вывода окна ошибки------
read_exception:
    jmp exit
 
;-----Ветка завершения процедуры-----   
read_finish:       
    mov     ax, bx
    call    WriteNumber
 
    mov cx, len
    cmp counter_i, cx
    jl  read_xor
    
    pop     si
    pop     di
    pop     dx
    pop     cx
    pop     bx
 
    RET   
EnterNumber ENDP
 
;//////Функция ввода исследуемой строки//////
InputString PROC
;-------Сохранение содержимого регистров в стек-------
    push    ax
    push    bx  
 
    xor     bx, bx
;-----------------------------------------------------
begin_input:    
    mov     ah,01h          ; считываем очередной символ
    int     21h
 
    cmp     al, 13          ; если нажан Enter, то заканчиваем ввод
    je  end_input
 
    mov     string[bx], al      ; записываем введённый символ в строку
    cmp     bx, max_length      ; если введено максимальное число символов
    je  end_input
 
    inc     bx          ; увеличиваем bx
    jmp     begin_input
 
end_input:
    mov len, bx
;-------Возврат содержимого регистров-----------------
    pop bx
    pop     ax  
 
    RET
InputString ENDP
 
;//////Функция преобразование числа в строку//////                   
WriteNumber PROC
;-------Сохранение содержимого регистров в стек-------
    push    ax
    push    bx
    push    cx
    push    dx   
 
;-----------------------------------------------------  
    xor     cx, cx ; обнуляем счётчик цифр
    mov     bx, 10 ; константный делитель
 
    test    ax, first_bit ; проверяем первый бит числа (1 - отрицательное, 0 - положительное)
    jz  write_push
 
    push    ax
    mov     dl, '-' ; вывод символа '-' на экран
    mov     ah, 02h
    int     21h
 
    pop     ax
    neg     ax ; отрицательное число приобретает нормальный вид
 
;-------Выделение цифр из исходного числа-----------       
write_push:                          
    xor     dx, dx
 
    div     bx ; деление по основанию 10
    push    dx ; последнюю цифру заносим в стек
    inc     cx ; увеличиваем счётчик цифр
    cmp     ax, 0 ; есди цифры не закончились - возвращаемся к делению
    jne     write_push
 
;-------Непосредственный вывод цифр на экран---------   
write_pop:       
    pop     dx
 
    add     dl, '0' ; добавляем к очередной цифре код '0'
    mov     ah, 02h ; выводим очередную цифру на экран
    int     21h
    loop    write_pop ; циклом выталкиваем все цифры
 
;-------Возврат содержимого регистров---------------
    pop     dx
    pop     cx
    pop     bx
    pop     ax
 
    RET
WriteNumber ENDP
 
;//////Функция перевода курсора на новую строку//////
WriteLine PROC 
    push ax
    push dx
    
    lea dx, str_crlf ; вывод строки с необходимым переводом
    mov ah, 09h
    int 21h
    
    pop dx
    pop ax
   
    RET         
WriteLine ENDP
 
;//////ОСНОВНАЯ ПРОГРАММА//////
start:
    mov     ax, @data ; точка входа в программу
    mov     ds, ax
    
    lea     dx, input_msg
    mov     ah, 09h
    int     21h
 
    call    WriteLine   
    call    InputString
 
    call    EnterNumber 
 
;-------Конец Программы
exit:   
    mov     ah, 4ch
    int     21h
end start
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.11.2013, 11:38
Ответы с готовыми решениями:

Необходимо вывести все числа от 1000 до 2000, которые делятся на 6
Подскажите с решением задачи на ассемблере. Необходимо вывести все числа от 1000 до 2000, которые делятся на 6

Найти все числа в строке и вывести каждое число в отдельной строке (ошибка в коде)
Помогите пожалуйста с кодом. Задание такое: Найти все числа в строке, каждое число вывести в отдельной строке. Даже представления не имею...

Найти и вывести все вещественные числа, содержащиеся в заданной строке
Найти и вывести все вещественные числа, содержащиеся в заданной строке. Только-только начали изучать C#. 2 Предыдущих задания были...

1
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
03.11.2013, 12:19
Что-то больно сложно.
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
;ml -c cio_nums.asm && wlink fi cio_nums form dos
.model  small
.386
dos_inp macro   lbl, sz
_ib_    struc  
max db  sz      ; наибольшая длина строки
len db  ?               ; сюда вернется настоящая длина
bf  db  sz dup(?)   ; тут будет то, что ввели
_ib_    ends            
lbl _ib_ <>
endm
.stack  100
.data
req db  'Enter string:$'
dos_inp buf, 100
.code   
start:  
    mov ax, @data
    mov ds, ax
    mov es, ax
; Вывод на экран 
    mov     ah, 09h
    lea     dx, req
    int     21h
; ввод строки
    mov ah, 0Ah
    lea dx, buf
    int 21h
;;
    movzx   cx, byte ptr buf.len
    lea si, buf.bf
    xor bx, bx
@loop:  lodsb
    cmp al, 30h
    jb  @non_dig
    cmp al, 39h
    ja  @non_dig
    int 29h
    xor bx, bx
    jmp @next
@non_dig:
    or  bx, bx
    jnz @next
    mov ax, 0A0Dh
    int 29h
    xchg    ah,al
    int 29h
    inc bx
@next:  loop    @loop
; выход
    mov ah, 4Ch
    int 21h
    end start
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.11.2013, 12:19
Помогаю со студенческими работами здесь

Нужно считать все символы (числа) в строке и вывести их в текстовые окна на форме
Нужно считать все символы(числа) в строке и вывести их в текстовые окна на форме, после чего перейти на следующую строку и провести ту же...

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

Дан массив А(п). Вывести в порядке следования: все отрицательные числа, затем все положительные числа
Дан массив А(п). Вывести в порядке следования: все отрицательные числа, затем все положительные числа.

подскажите: как вывести на экран числа от 0 до 20.... и еще одна: вывести все четные числа от 0 до 20...
подскажите: как вывести на экран числа от 0 до 20.... и еще одна: вывести все четные числа от 0 до 20... эт надо очень срочно....

Вывести сначала все положительные числа и нули, а следом - все отрицательные числа
Дан массив действительных чисел, содержащий n элементов. Вывести сначала все положительные числа и нули, а следом - все отрицательные...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
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