Обменять местами слова с максимальной и минимальной длинами - 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
Объяснение кода листинга программы
Вот что получилось:
- Код написан на ассемблере.
- В начале кода задаётся модель памяти — tiny, что означает, что для работы программы будет выделено 1000 байт.
- Затем объявляется сегмент данных, в котором будет храниться строка с символами.
- Далее, с помощью процедуры input, в этот сегмент вводится строка.
- После ввода строки, в первой части кода (поиск слова с минимальной длиной) выполняются следующие действия: — Переменная 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 (цикл поиска слова с минимальной длиной).
- Во второй части кода (поиск слова с максимальной длиной) выполняются следующие действия: — Переменные 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. Их назначение такое же, как и в первой части кода.
- В конце кода выводится сообщение об успешном завершении работы программы.