Обменять слова с максимальным и минимальным количеством букв «а» - 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- исходная строкаAbbbMin- строка с минимальным количеством букваMax- строка с максимальным количеством букваLen- переменная, содержащая длину строки исходной строкиSourceDest- буфер для результирующей строкиImin- переменная, содержащая позицию (отсчет от 0) минимальной строки в исходной строкеSourceLmin- переменная, содержащая длину минимальной строкиImax- переменная, содержащая позицию (отсчет от 0) максимальной строки в исходной строкеSourceLmax- переменная, содержащая длину максимальной строки
- Копирование символов:
- Начало цикла итераций. В цикле происходит копирование символов из исходной строки в буферную для строк до минимальной строки.
- После копирования символов, происходит копирование символов из исходной строки в буферную для строк от максимальной строки.
- Копирование оставшихся символов.
- Вывод результатов:
- Используя прерывание 21h, вывод на экран символов исходной строки, переноса строки и символов буферной строки.
- Завершение программы.
Код выполняет перестановку строк исходной строки
Sourceв буферную строкуDest, меняя местами строки с минимальным и максимальным количеством буква.