Обменять слова с максимальным и минимальным количеством букв «а» - Assembler
Формулировка задачи:
Привет! Выручайте! Необходимо обменять слова с максимальным и минимальным количеством букв "а". Программа вроде работает, но не выводит преобразованную строку. Помогите найти ошибку и исправить
include "emu8086.inc" data segment mas db 30 dup(?),32 smes4 dw ? adress dw ? smes42 dw ? adress2 dw ? razmernost dw 31 slov1 db 20 dup (?) slov2 db 20 dup (?) slov3 db 20 dup (?) ends stack segment dw 128 dup(0) ends code segment start: ; set segment registers: mov ax, data mov ds, ax mov es, ax call pthis Db 'Vvedite stroky: ', 0 mov di,offset mas mov dx,30 call GET_STRING ;---max--- mov cx,razmernost mov si,offset mas mov di,si xor dx,dx xor bx,bx l1:lodsb cmp al,97 ; sravnivaem s 'a' jne l2 ;esli ne ravno inc dx l2:cmp al,32 ;sravnivaem s probelom jne l4 ; esli ne ravno cmp dx,bx jl l5 ; esli menshe ili ravno mov bx,dx mov adress,di ;nachalo slova max mov smes4,si sub smes4,di ;konec slova max mov di,si xor dx,dx jmp l4 l5: mov bx,dx mov adress2,di ;nachalo slova min mov smes42,si sub smes42,di ;konec slova min l3:mov di,si xor dx,dx l4:loop l1 ;----zapis max i min slov v novie massivi dec adress xor si, si mov si, offset mas; nachalo stroki mov di, offset slov1 ; mov si, adress ; poz.nachala slova max mov cx, smes4 rep movsb dec adress2 xor si, si mov si, offset mas; nachalo stroki mov di, offset slov2 ; mov si, adress2 ; poz.nachala slova max mov cx, smes42 rep movsb ;---zapis mezhdu max i min xor si, si mov si, offset mas ; nachalo stroki mov di, offset slov3 mov si, adress add si, smes4 mov cx, adress2 sub cx, si push cx rep movsb ;---menyaem xor si, si xor di, di mov si, offset slov2 mov di, offset mas mov cx, smes42 mov di, adress rep movsb xor si, si xor di, di mov si, offset slov3 mov di, offset mas mov di, adress add di, smes42 pop cx rep movsb xor si, si xor di, di mov si, offset slov1 mov di, offset mas mov cx, smes4 mov di, adress2 rep movsb ; ---vivod mov si,razmernost sub si,smes4 sub si,2 mov mas[si],0 call pthis Db 13, 10, 'slovomax: ', 0 mov si,offset slov1 call PRINT_STRING mov si,razmernost sub si,smes42 sub si,2 mov mas[si],0 call pthis Db 13, 10, 'slovomin: ', 0 mov si,offset slov2 call PRINT_STRING call pthis Db 13, 10, 'slovo3: ', 0 mov si,offset slov3 call PRINT_STRING mov si,razmernost mov cx, razmernost mov mas[si],0 call pthis Db 13, 10, 'newmas: ', 0 mov si,offset mas call PRINT_STRING mov ah, 1 int 21h mov ax, 4c00h ; exit to operating system. int 21h ends DEFINE_PRINT_STRING DEFINE_GET_STRING DEFINE_PTHIS end start ; set entry point and stop the assembler.
Решение задачи: «Обменять слова с максимальным и минимальным количеством букв «а»»
textual
Листинг программы
LOCALS .model small .stack 100h .data CrLf db 0Dh, 0Ah, '$' Source db 'Abbb ' Min db 'def ' db 'AAgg ' db 'AAhh AAjj ' Max db 'AAAkkkkk' db ' AAllmm', '$' Len equ $-Source-1 Dest db 255 dup('$') Imin dw Min-Source ;отсчёт от 0 Lmin dw 3 Imax dw Max-Source ;отсчёт от 0 Lmax dw 8 .code main proc mov ax, @data mov ds, ax mov ax, ds mov es, ax lea si, Source mov bx, si lea di, Dest cld ;1.Из исходной строки копировать в буферную (Imin-1) символ. @@Item1: mov cx, Imin jcxz @@Item2 rep movsb ;2.Копировать Lmax символов с индекса Imax @@Item2: mov cx, Lmax jcxz @@Item3 mov si, bx add si, Imax rep movsb ;3.Копировать (Imax-Imin-Lmin) символов с индекса (Imin+Lmin) @@Item3: mov cx, Imax sub cx, Imin sub cx, Lmin jcxz @@Item4 mov si, bx add si, Imin add si, Lmin rep movsb ;4.Копировать Lmin символов с индекса Imin @@Item4: mov cx, Lmin mov si, bx add si, Imin jcxz @@Item5 rep movsb ;5.Копировать оставшиеся символы. @@Item5: mov cx, Len sub cx, Imax sub cx, Lmax jcxz @@Item6 mov si, bx add si, Imax add si, Lmax rep movsb @@Item6: jmp @@Exit @@Exit: mov ah, 09h lea dx, Source int 21h mov ah, 09h lea dx, CrLf int 21h mov ah, 09h lea dx, Dest int 21h mov ax, 4C00h int 21h main endp end main
Объяснение кода листинга программы
- Объявление и инициализация переменных:
CrLf
- переменная, содержащая символы возврата каретки и переноса строкиSource
- исходная строкаAbbb
Min
- строка с минимальным количеством буква
Max
- строка с максимальным количеством буква
Len
- переменная, содержащая длину строки исходной строкиSource
Dest
- буфер для результирующей строкиImin
- переменная, содержащая позицию (отсчет от 0) минимальной строки в исходной строкеSource
Lmin
- переменная, содержащая длину минимальной строкиImax
- переменная, содержащая позицию (отсчет от 0) максимальной строки в исходной строкеSource
Lmax
- переменная, содержащая длину максимальной строки
- Копирование символов:
- Начало цикла итераций. В цикле происходит копирование символов из исходной строки в буферную для строк до минимальной строки.
- После копирования символов, происходит копирование символов из исходной строки в буферную для строк от максимальной строки.
- Копирование оставшихся символов.
- Вывод результатов:
- Используя прерывание 21h, вывод на экран символов исходной строки, переноса строки и символов буферной строки.
- Завершение программы.
Код выполняет перестановку строк исходной строки
Source
в буферную строкуDest
, меняя местами строки с минимальным и максимальным количеством буква
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д