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