Найти в каждой заданной строке количество символов "5" - Assembler
Формулировка задачи:
Задать с клавиатуры две строки десятичных чисел,одна стока приемник,вторая-источник.Найти в каждой строке количество символов со знаком "5".Вывести на экран найденное количество "5" в каждой строке
Решение задачи: «Найти в каждой заданной строке количество символов "5"»
textual
Листинг программы
- LOCALS
- .model small
- .stack 100h
- .data
- MaxLen equ 20
- s1 db MaxLen dup(0)
- s2 db MaxLen dup(0)
- kbdBuffer db MaxLen+1, 0, (MaxLen+1) dup(0)
- PromptS1 db 'Input first string: ', '$'
- PromptS2 db 'Input second string: ', '$'
- msgInFirst db 'In first string: ', '$'
- msgInSecond db 'In second string: ', '$'
- CrLf db 0Dh, 0Ah, '$'
- Count1 dw 0
- Count2 dw 0
- .code
- main proc
- mov ax, @data
- mov ds, ax
- ;обработка первой строки
- mov ah, 09h
- lea dx, PromptS1
- int 21h
- lea dx, s1
- call Process
- mov Count1, ax
- ;обработка второй строки
- mov ah, 09h
- lea dx, PromptS2
- int 21h
- lea dx, s2
- call Process
- mov Count2, ax
- ;вывод результата
- mov ah, 09h
- lea dx, msgInFirst
- int 21h
- mov ax, Count1
- call OutInt
- mov ah, 09h
- lea dx, CrLf
- int 21h
- ;вывод результата
- mov ah, 09h
- lea dx, msgInSecond
- int 21h
- mov ax, Count2
- call OutInt
- mov ah, 09h
- lea dx, CrLf
- int 21h
- mov ax, 4C00h
- int 21h
- main endp
- ;обработка строки
- ;на входе
- ;ds:dx - адрес строки
- ;на выходе
- ;ax - количество символов '5' в строке
- Process proc
- ;push ax
- push bx
- push cx
- push dx
- push si
- push di
- call ReadStr
- mov si, dx ;адрес начала строки
- mov bx, 0 ;количество символов '5' в строке
- @@While:
- mov al, [si] ;чтение очередного символа
- cmp al, '$'
- je @@Break ;если это символ - признак конца строки - выйти
- cmp al, '5' ;если это символ '5',
- jne @@Next
- inc bx ;то увеличить счётчик
- @@Next:
- add si, 1 ;перейти к следующему элементу строки
- jmp @@While
- @@Break:
- mov ax, bx ;запись результата в регистр ax
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- ;pop ax
- ret
- Process endp
- ;чтение строки с клавиатуры
- ;на входе
- ;ds:dx - адрес строки
- ReadStr proc
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- ;сохранение адреса введённой строки
- mov di, dx
- ;чтение в буфер из клавиатуры
- mov ah, 0Ah
- lea dx, kbdBuffer
- int 21h
- ;копирование из буфера в переменную строки
- mov cx, 0
- mov cl, [kbdBuffer+1]
- jcxz @@SkipCopy
- push es
- pushf
- push ds
- pop es
- lea si, kbdBuffer+2
- mov di, di
- cld
- rep movsb
- popf
- pop es
- ;добавление признака конца строки
- mov byte ptr [di], '$'
- @@SkipCopy:
- mov ah, 09h
- lea dx, CrLf
- int 21h
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- ReadStr endp
- OutInt proc
- push ax
- push dx
- aam
- add ax, '00'
- mov dl, ah
- mov dh, al
- mov ah, 02
- int 21h
- mov dl,dh
- int 21h
- pop dx
- pop ax
- ret
- OutInt endp
- end main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д