Ввод двух строк и их сравнение - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д