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