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

Файлы: Подсчитать сумму цифр, содержащихся в строке

15.05.2017, 19:32. Показов 1608. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, помогите, пожалуйста написать программу. Входные данные записать в файл INPUT.TXT. Открыть этот файл для чтения, считать из него строку и, d данной строке подсчитать сумму цифр, содержащихся в ней, записать результат в файл OUTPUT.TXT. При решении можно использовать функции и макросы. Есть решение с помощью процедур и с помощью макросов, код для считывания строки из файла. Не получается полностью все написать.
Решение с помощью макросов:
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
use16
org 100h
macro endl
  {
pusha
mov ah, 2
mov dl, 10
int 21h
mov dl, 13
int 21h
popa
  }
 
macro Show_AX
  {
pusha
 
mov cx, 10
xor di, di
 
Conv:
xor dx, dx 
div cx
add dl, '0'
inc di 
pusha
or ax, ax 
jnz Conv
 
Show:
popa
mov ah, 2
int 21h 
dec di
jnz Show
popa
}
 
mov dx, s1 
mov [s1], 51 
mov ah, 0ah 
int 21h 
 
 
endl
 
mov cl, [s1+1]
mov ch, 0 
cld
mov si, s1+2
mov bx, 0
for: 
lodsb
cmp al, '0'
jb next 
cmp al, '9' 
ja next 
 
sub al, '0'
mov ah, 0 
add bx, ax
next: 
loop for 
 
mov ax, bx 
 
Show_AX
mov ah,8
int 21h 
int 20h
s1 db 53 dup(?)
Решение с помощью процедур:
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
use16 
org 100h 
mov dx, s1 
mov [s1], 51 
mov ah, 0ah 
int 21h 
mov dx, s1 
call endline 
mov cl, [s1+1] 
mov ch, 0 
cld 
mov si, s1+2 
mov bx, 0 
for: 
lodsb 
cmp al, '0' 
jb next 
cmp al, '9' 
ja next 
 
sub al, '0' 
mov ah, 0 
add bx, ax 
next: 
loop for 
 
mov ax, bx 
call Show_AX 
 
 
mov ah,8 
int 21h 
int 20h 
 
endline: 
push ax 
push dx 
mov ah, 9 
mov dx, endlen 
int 21h 
pop dx 
pop ax 
ret 
 
 
Show_AX: 
 
push bx 
push cx 
push dx 
push di 
 
mov cx, 10
xor di, di 
 
@@Conv: 
xor dx, dx 
div cx 
add dl, '0' 
inc di 
push dx 
or ax, ax 
jnz @@Conv 
 
@@Show: 
pop dx
mov ah, 2 
int 21h 
dec di
jnz @@Show 
 
pop di 
pop dx 
pop cx 
pop bx 
pop ax 
ret 
 
s1 db 53 dup(?) 
endlen db 10,13,'$'
Чтение строки из файла и вывод на экран
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
use16
org 100h
jmp start
;------- Определяем переменные ----------
 fileName db 'input.txt',0 ;
 size db 50 
 stroka rb 51 
 handle rw 1 
;----------------------------------------
start:
 mov ah, 3dh 
 xor al, al 
 mov dx, fileName 
 xor cx, cx 
 int 21h 
 jnc m1 
 jmp exit 
m1: mov [handle], ax 
 mov bx, ax 
 mov ah, 3fh
 mov dx, stroka 
 mov cl, byte [size] 
 int 21h 
 jnc m2 
 jmp close_file 
m2:
 mov bx, stroka
 add bx, ax 
 mov byte [bx], '$' 
 mov ah, 9
 mov dx, stroka
 int 21h
close_file:
 mov ah, 3eh 
 mov bx, [handle] 
 int 21h 
exit:
mov ah, 8
int 21h
int 20h
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2017, 19:32
Ответы с готовыми решениями:

Подсчитать сумму цифр, содержащихся в строке
Здравствуйте, помогите,пожалуйста, написать программу на assembler fasm:Данные вводить с...

Подсчитать сумму всех содержащихся в строке цифр
11. подсчитывает сумму всех содержащихся в ней цифр; решите пожалуйста в си шарп

Подсчитать количество содержащихся в строке цифр.
Дана строка. Подсчитать количество содержащихся в ней цифр.

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

1
Модератор
Эксперт по электронике
8477 / 4335 / 1643
Регистрация: 01.02.2015
Сообщений: 13,462
Записей в блоге: 8
11.06.2017, 14:36 2
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
use16
org 100h
        ;получение строки из файла
        ; - открытие файла для чтения
        mov     ah,     3Dh     ;открыть файл
        mov     al,     00h     ;для чтения
        lea     dx,     [InFile];имя файла
        int     21h
        jnc     OkOpenInFile
        jmp     exit
OkOpenInFile:
        mov     [handle],       ax      ;сохранение описателя файла
        ; - чтение из файла
        mov     ah,     3Fh
        mov     bx,     [handle]
        lea     dx,     [s1]
        mov     cx,     80
        int     21h
        jnc     OkReadInFile
        jmp     exit
OkReadInFile:
        mov     [BufLen],       ax
        ; - закрытие файла
        mov     ah,     3Eh
        mov     bx,     [handle]
        int     21h
        ;показать введённую строку
        lea     dx,     [s1]
        mov     cx,     [BufLen];длина строки
        mov     bx,     1       ;вывод на экран
        call    printline       ;функция вывода введенной строки
        call    endline         ;вызываем функцию перехода на новую строку
        ;обработка строки
        mov     cx,     [BufLen]
        lea     dx,     [s1]
        call    CalcSum
        ;преобразование числа в строку
        lea     dx,     [s2]
        call    UInt16ToStr
        ;вывод результата на экран
        lea     dx,     [s2+1]
        mov     cl,     [s2]            ;длина строки
        mov     ch,     0
        mov     bx,     1               ;вывод на экран
        call    printline               ;функция вывода введенной строки
        ;сохранение обработанной строки в файл
        ; - открытие файла для записи
        mov     ah,     3Ch
        mov     cx,     0       ;атрибуты файла - простой файл
        lea     dx,     [OutFile]
        int     21h
        jnc     OkCreateOutFile
        jmp     exit
OkCreateOutFile:
        mov     [handle],       ax      ;сохранение описателя файла
        ; - запись в файл
        lea     dx,     [s2+1]
        mov     cl,     [s2]            ;длина строки
        mov     ch,     0
        mov     bx,     [handle]        ;вывод в файл
        call    printline               ;функция вывода введенной строки
        jnc     OkWriteOutFile
        jmp     exit
OkWriteOutFile:
        ; - закрытие файла
        mov     ah,     3Eh
        mov     bx,     [handle]
        int     21h
 
        ;завершение программы
exit:
        int 20h
 
;------------- функции -----------
;------------------------------
; перевод на новую строку
;------------------------------
endline:
        push    ax              ;помещаем данные из регистров
        push    dx              ;в стек
        mov     ah,     9
        mov     dx,     endlen  ;адрес строки, хранящей 10,13,'$'
        int     21h
        pop     dx              ;восстанавливаем регистры
        pop     ax
ret
 
;-------------------------------
; вывод введенной строки используя
; файловый вывод (на экран или в файл -
; в зависимости от значения в описателе)
;-------------------------------
;на входе:
; bx - описатель файла (bx=1 - вывод на экран)
; dx - адрес строки
; cx - длина строки
;-------------------------------
printline:
        push    ax              ;помещаем данные из регистров
        push    bx              ;в стек
        push    dx
        mov     ah,     40h
        mov     bx,     bx
        mov     cx,     cx
        mov     dx,     dx
        int     21h             ;выводим строку
        pop     dx
        pop     bx
        pop     ax
ret
 
;-------------------------------
;суммирует цифры в строке
;-------------------------------
;на входе:
; ds:dx - адрес строки
; cx    - длина строки
;выходные данные:
; ax - сумма цифр
;-------------------------------
CalcSum:
        push    bx
        push    cx
        push    si
 
        cld            ; направление чтения командой lodsb - вперёд
        mov si, dx     ;адрес строки
        mov bx, 0      ;сумма цифр из строки будет накапливаться в регистре bx
for:
        lodsb          ;читаем символ
        cmp al, '0'    ;пропускаем буквы
        jb next
        cmp al, '9'
        ja next
 
        sub al, '0'    ;превращаем код цифры в число
        mov ah, 0
        add bx, ax     ;суммируем цифры в регистре bx
next:
        loop for
 
        mov ax, bx
 
        pop     si
        pop     cx
        pop     bx
        ret
 
;-------------------------------
; преобразует число из регистра AX в строку
;-------------------------------
; входные данные:
; ax - число для преобразования
; ds:dx - адрес для результирующей строки Pascal типа
;-------------------------------
UInt16ToStr:
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
        push    si
 
        mov     si,     dx
        mov     [si],   byte 0          ;текущая длина строки равнв 0
 
        mov     cx,     10
        xor     di,     di              ; di - кол. цифр в числе
 
 @@Conv:
        xor     dx,     dx
        div     cx              ; dl = num mod 10
        add     dl,     '0'     ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стек
        or      ax,     ax
        jnz     @@Conv
        ; выводим из стека в строку
        mov     ax,     0
        mov     al,     [si]    ;в ячейку с длиной записываем длину строки
        add     [si],   di      ;с учётом возможного символа знака
        inc     si              ;устанавливаем указатель на первую свободную ячейку
        add     si,     ax
@@Show:
        pop     dx              ; dl = очередной символ
        mov     [si],   dl
        inc     si
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     si
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
ret
 
InFile  db      'INPUT.TXT', 0
OutFile db      'OUTPUT.TXT', 0
handle  dw      0
s2      db      0, 53 dup(?)
endlen  db      10, 13, '$'
BufLen  dw      0
s1      db      0
0
11.06.2017, 14:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2017, 14:36
Помогаю со студенческими работами здесь

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

Подсчитать количество содержащихся в строке цифр
Дана строка. Подсчитать количество содержащихся в ней цифр

Подсчитать количество содержащихся в строке цифр
Дана строка. Подсчитать количество содержащихся в ней цифр. Язык С

Подсчитать количество содержащихся в строке цифр
Дана строка. Подсчитать количество содержащихся в ней цифр1|2|3.


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

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