Обменять местами слова с максимальной и минимальной длинами - Assembler

Узнай цену своей работы

Формулировка задачи:

Подскажите пожалуйста, где ошибки в коде, начал с асмом разбираться и завис.. Задание таково - в строке поменять местами слова максимальной и минимальной длины.
dseg segment
    t db "maximum min OLOL $"
dseg ends
cseg segment
assume cs:cseg, dsseg
;Поиск слова с мин длинной
start:  mov ax, dseg
        mov ds, ax
        mov cx, 1000 ; длина мин слова
        mov bx, 0 ; длина текущего слова
        lea si, t ;УКАЗАЛИ НА НАЧАЛО СТРОКИ
        mov di, si 
 
begin:  cmp byte ptr [si + bx], '$'
        je  POINTER_MIN_TO_STACK
        cmp byte ptr [si + bx], ' '
        je  nextword
        inc bx
        jmp begin
nextword:
 
        cmp cx, bx
        jl oldlong
        mov di, si
        mov cx, bx
oldlong:
        add si, bx
        inc si
        mov bx, 0     
        jmp begin
POINTER_MIN_TO_STACK:
        INC DI
        PUSH DI ; НАЧАЛО МИН СЛОВА
        ADD CX,DI
        PUSH CX ;КОНЕЦ МИН СЛОВА    
 
;поиск слова с макс длинной       
start1:
        mov cx, 0 ; длина макс слова
        mov bx, 0 ; длина текущего слова
        lea si, t  
begin_max:  cmp byte ptr [si + bx], '$'
        je  POINTER_MAX_TO_STACK
        cmp byte ptr [si + bx], ' '
        je  nextword_max
        inc bx
        jmp begin_max
nextword_max:   
        cmp cx, bx
        jnl oldlong_max
        mov di, si
        mov cx, bx
oldlong_max:
        add si, bx
        inc si; след элемент в строке запомнили
        mov bx, 0 ;обнулили счетчик символов    
        jmp begin_max       
POINTER_MAX_TO_STACK:
        INC DI
        PUSH DI ; НАЧАЛО макс  СЛОВА
        ADD CX,DI
        PUSH CX ;КОНЕЦ макс СЛОВА

OUTPUT:
        LEA SI,T
        MOV DI,SI
        POP AX;КОНЕЦ МАКС СЛОВА
        pop bp;начало макс слова
        pop dx;конец мин слова
        POP CX;начало МИН СЛОВА
        
SHOW_STRING:
        mov ah, 6
        cmp si,bp;замена макс на мин
        JE SHOW_MIN
        cmp si, cx;замена мин на макс
        JE SHOW_MAX
        mov byte ptr dl,[si]
        cmp dl, '$'
        je fin
        int 21h
        inc SI
        JMP SHOW_STRING

SHOW_MIN:
        mov ah, 6       
showword_min:
        mov byte ptr dl,[si]
        cmp dl, ' '
        je OLD_STRING_OUTPUT_CONTINUE
        int 21h
        inc si
        jmp showword_min
OLD_STRING_OUTPUT_CONTINUE:
        mov si,ax
        jmp show_string

SHOW_MAX:
        mov ah, 6       
showword_max:
        mov byte ptr dl,[si]
        cmp dl, ' '
        je OLD_STRING_OUTPUT_CONTINUE2
        int 21h
        inc si
        jmp showword_max
OLD_STRING_OUTPUT_CONTINUE2:
        mov si,dx
        jmp show_string 
 
fin:    mov ax, 04c00h
        int 21h
        
cseg ends
end start
все, спасибо, уже не нужно) решил таки включить голову и применить по прямому назначению, т.е. подумать) извиняюсь за порцию быдлокода)

Решение задачи: «Обменять местами слова с максимальной и минимальной длинами»

textual
Листинг программы
 .model tiny
 org 100h
 .data
    t db 255 dup (?)
 .code
Input proc  
    xor si, si 
        read:       
        mov ah, 01h
        int 21h
        cmp al, 13 
        je start_min
        mov t[si],al
        inc si  
        jmp read
input endp
 
;Поиск слова с мин длинной
start:  mov ax, @data
        mov ds, ax
        call input
start_min: 
        inc si
        mov t[si],' '
        inc si
        mov t[si],'$'
        mov cx, 1000 ; длина мин слова
        mov bx, 0 ; длина текущего слова
        lea si, t ;
        mov di, si ;
 
begin:  cmp byte ptr [si + bx], '$'
        je  POINTER_MIN_TO_STACK
        cmp byte ptr [si + bx], ' '
        je  nextword
        inc bx
        jmp begin
nextword:   
        cmp cx, bx
        jl oldlong
        mov di, si
        mov cx, bx
oldlong:
        add si, bx
        inc si
        mov bx, 0 
probel:
        cmp byte ptr [si], ' '
        jne begin
        inc si
        jmp probel
POINTER_MIN_TO_STACK:
        PUSH DI ; НАЧАЛО МИН СЛОВА
        ADD CX,DI
        PUSH CX ;КОНЕЦ МИН СЛОВА 
;поиск слова с макс длинной       
start1:
        mov cx, 0 ; длина макс слова
        mov bx, 0 ; длина текущего слова
        lea si, t  
begin_max:  cmp byte ptr [si + bx], '$'
        je  POINTER_MAX_TO_STACK
        cmp byte ptr [si + bx], ' '
        je  nextword_max
        inc bx
        jmp begin_max
nextword_max:  
        cmp cx, bx
        jnl oldlong_max
        mov di, si
        mov cx, bx
oldlong_max:
        add si, bx
        inc si; след элемент в строке запомнили
        mov bx, 0 ;обнулили счетчик символов   
probel1:
        cmp byte ptr [si], ' '
        jne begin_max
        inc si
        jmp probel1         
POINTER_MAX_TO_STACK:
        PUSH DI ; НАЧАЛО макс  СЛОВА
        ADD CX,DI
        PUSH CX ;КОНЕЦ макс СЛОВА  
OUTPUT:
        LEA SI,T
        MOV DI,SI
        POP bX;КОНЕЦ МАКС СЛОВА
        pop bp;начало макс слова
        pop di;конец мин слова
        POP CX;начало МИН СЛОВА     
SHOW_STRING:
        cmp si,bp;замена макс на мин
        JE SHOW_MIN
        cmp si, cx;замена мин на макс
        JE SHOW_MAX
        mov ah, 6
        mov byte ptr dl,[si]
        cmp dl, '$'
        je fin
        int 21h
        inc SI
        JMP SHOW_STRING
SHOW_MIN:
        mov si,cx
        mov ah, 6       
showword_min:
        mov byte ptr dl,[si]
        cmp dl, ' '
        je OLD_STRING_OUTPUT_CONTINUE
        int 21h
        inc si
        jmp showword_min
OLD_STRING_OUTPUT_CONTINUE:
        mov si,bx
        jmp show_string
SHOW_MAX:
        mov si,bp
        mov ah, 6       
showword_max:
        mov byte ptr dl,[si]
        cmp dl, ' '
        je OLD_STRING_OUTPUT_CONTINUE2
        int 21h
        inc si
        jmp showword_max
OLD_STRING_OUTPUT_CONTINUE2:
        mov si,di
        jmp show_string  
fin:    mov ax, 04c00h
        int 21h     
end start

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

Вот что получилось:

  1. Код написан на ассемблере.
  2. В начале кода задаётся модель памяти — tiny, что означает, что для работы программы будет выделено 1000 байт.
  3. Затем объявляется сегмент данных, в котором будет храниться строка с символами.
  4. Далее, с помощью процедуры input, в этот сегмент вводится строка.
  5. После ввода строки, в первой части кода (поиск слова с минимальной длиной) выполняются следующие действия: — Переменная si (индекс) инициализируется значением 0. — Переменная cx (счётчик) инициализируется значением 1000 (максимальная длина слова). — Переменная bx (счётчик) инициализируется значением 0 (длина текущего слова). — Переменная t[si] (в данном случае это просто адрес в памяти) получает значение символа, вводимого пользователем. — Значение переменной si увеличивается на 1. — Если вводимый символ — символ новой строки (13), то выполняется процедура start_min, иначе значение переменной t[si] (текущий символ) сохраняется в памяти. — Если длина текущего слова (bx) равна или больше длины минимального найденного слова (cx), то выполняется процедура oldlong, иначе значение переменной si увеличивается на bx, значение переменной bx обнуляется, и выполняется процедура begin (цикл поиска слова с минимальной длиной). — Если вводимый символ — пробел, то выполняется процедура nextword, иначе значение переменной bx увеличивается на 1. — Если длина текущего слова (bx) меньше длины минимального найденного слова (cx), то выполняется процедура begin (цикл поиска слова с минимальной длиной).
  6. Во второй части кода (поиск слова с максимальной длиной) выполняются следующие действия: — Переменные si, bx и t инициализируются так же, как и в первой части кода. — Выполняются процедуры start1, begin_max, nextword_max, oldlong_max, probel1, POINTER_MAX_TO_STACK, SHOW_STRING, SHOW_MIN, OLD_STRING_OUTPUT_CONTINUE2, OLD_STRING_OUTPUT_CONTINUE, POINTER_MIN_TO_STACK, input и fin. Их назначение такое же, как и в первой части кода.
  7. В конце кода выводится сообщение об успешном завершении работы программы.

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

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