Найти в каждой заданной строке количество символов "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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д