Обменять слова с максимальным и минимальным количеством букв «а» - 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

Объяснение кода листинга программы

  1. Объявление и инициализация переменных:
    • CrLf - переменная, содержащая символы возврата каретки и переноса строки
    • Source - исходная строка Abbb
    • Min - строка с минимальным количеством букв а
    • Max - строка с максимальным количеством букв а
    • Len - переменная, содержащая длину строки исходной строки Source
    • Dest - буфер для результирующей строки
    • Imin - переменная, содержащая позицию (отсчет от 0) минимальной строки в исходной строке Source
    • Lmin - переменная, содержащая длину минимальной строки
    • Imax - переменная, содержащая позицию (отсчет от 0) максимальной строки в исходной строке Source
    • Lmax - переменная, содержащая длину максимальной строки
  2. Копирование символов:
    • Начало цикла итераций. В цикле происходит копирование символов из исходной строки в буферную для строк до минимальной строки.
    • После копирования символов, происходит копирование символов из исходной строки в буферную для строк от максимальной строки.
    • Копирование оставшихся символов.
  3. Вывод результатов:
    • Используя прерывание 21h, вывод на экран символов исходной строки, переноса строки и символов буферной строки.
    • Завершение программы. Код выполняет перестановку строк исходной строки Source в буферную строку Dest, меняя местами строки с минимальным и максимальным количеством букв а.

Оцени полезность:

10   голосов , оценка 4.2 из 5
Похожие ответы