Ввод двух строк и их сравнение - Assembler

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

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

Доброго времени суток! Нужно написать программу в которой были реализованы следующие действия: Ввод двух строк и их сравнение. В поиске были похожие темы, но текст их мягко сказать непонятен, помогите написать эту программу как можно проще и понятнее. Заранее спасибо!
Мне знакомый скинул код но у меня по чему то не работает не могли бы вы его поправить и прокомментировать...
.MODEL SMALL
   .STACK 100h
   .DATA
str1 DB 10,13,'first string: $'
str2 DB 10,13,'second string: $'
res DB 10,13,'result: $'
strrav DB 10,13,'ravno: $'
strnerav DB 10,13,'ne ravno: $' 
buf1  db 40 dup(?)
buf2  db 40 dup(?)
   .CODE
start:
   mov  ax,@data
   mov  ds,ax                       
   mov  ah,9h
   mov  dx,OFFSET str1      
   int  21h
   mov bx,0
start1: ;VVod 1 str
   mov ah,1
   int 21h
   cmp al,13
   je start2
   mov buf1[bx],al
   inc bx
   jmp start1
start2: 
   mov ah,9h
   mov dx, OFFSET str2
   int 21h
   mov di,0
   start3:   ;VVod 2 str
   mov ah,1
   int 21h
   cmp al,13
   je start4
   mov buf2[di],al
   inc di
   jmp start3
start4: ;sravnenie
   cmp bx,di  
   jne start6
   mov ax,0
   mov dx,0
start44:
   cmp di,0
   je start5
   mov al,buf1[di]
   cmp al,buf2[di]
   jne start6
   dec di
jmp start44
start5: ;vivod ranestva
   mov ah,9h
   mov dx, OFFSET strrav
   int 21h
   jmp start7
start6: ; vivod ne ravenstva
   mov ah,9h
   mov dx, OFFSET strnerav  
   int 21h
start7:
   .exit 0
   END start

Решение задачи: «Ввод двух строк и их сравнение»

textual
Листинг программы
.model small
.stack 100h
.data
m_f db 'Первая строка длиннее второй на $'
m_s db 'Вторая строка длиннее первой на $'
m_b db ' байт$'
m_e db 'Строки равны$'          
buf db 82 dup(?)
.code
out_msg macro msg       ;Выводит строку на экран.
        push ax
        push dx
        mov ah,9
        lea dx,msg
        int 21h
        pop dx
        pop ax
        endm
start:  mov ax,@data
    mov ds,ax
    mov ah,3fh      ;Ввод первой строки.
        mov bx,0        ;Ноль означает клавиатуру.
        mov cx,82       ;Максимальное число вводимых символов(80) плюс 2 (для 0ah и 0dh).
        lea dx,buf      ;Адрес области памяти для вводимой строки.
        int 21h
        push ax         ;Запоминаем длину первой строки в стеке(она на 2 больше реальной длины, но это для сравнения неважно).
        mov ah,3fh      ;Ввод второй строки.
        int 21h         ;Длина второй строки в ax
        pop bx          ;В bx длина первой строки.
        sub ax,bx       ;Сравниваем длины.
        js @f           ;Если результат вычитания отрицательный, первая строка длиннее второй.
        je @e           ;Поднят zf - строки равны.
        out_msg m_s     ;Результат вычитания положительный - вторая строка больше первой.
        call out_b      
        out_msg m_b
        jmp exit        
@f:     neg al          ;Получаем модуль результата вычитания.
        out_msg m_f
        call out_b
        out_msg m_b
        jmp exit
@e:     out_msg m_e
exit:   mov ax,4c00h
    int 21h
out_b proc              ;Выводит двузначное число.
        xor ah,ah
        mov bl,10
        div bl
        or ax,3030h
        int 29h
        mov al,ah
        int 29h
        ret
out_b endp 
end start

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

  1. Объявляются переменные:
    • m_f - строка Первая строка длиннее второй на $
    • m_s - строка Вторая строка длиннее первой на $
    • m_b - строка байт$
    • m_e - строка Строки равны$
    • buf - массив символов для ввода строк
  2. Описывается макрос out_msg, который выводит строку на экран, используя прерывание INT 21h.
  3. В начале программы (start), инициализируются сегмент данных и загружается адрес сегмента данных в регистр DS.
  4. Вводится первая строка с помощью прерывания 21h, функции 3Fh. Массив буфера для ввода строки задается адресом buf.
  5. Затем вводится вторая строка, сохраняется длина каждой строки, и производится сравнение их длин с помощью инструкций ASM, таких как sub, js, и je.
  6. В зависимости от результата сравнения, выводится одно из сообщений: Первая строка длиннее второй на X байт$ (где X - количество байт, на которое первая строка длиннее второй), Вторая строка длиннее первой на X байт$ или Строки равны$.
  7. После вывода результата программа завершает работу, используя прерывание 21h, функцию 4C00h.
  8. Описана процедура out_b, которая выводит двузначное число на экран, конвертируя его в ASCII-коды с помощью инструкций ASM.

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

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