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

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

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

Доброго времени суток! Нужно написать программу в которой были реализованы следующие действия: Ввод двух строк и их сравнение. В поиске были похожие темы, но текст их мягко сказать непонятен, помогите написать эту программу как можно проще и понятнее. Заранее спасибо!
Мне знакомый скинул код но у меня по чему то не работает не могли бы вы его поправить и прокомментировать...
Листинг программы
  1. .MODEL SMALL
  2. .STACK 100h
  3. .DATA
  4. str1 DB 10,13,'first string: $'
  5. str2 DB 10,13,'second string: $'
  6. res DB 10,13,'result: $'
  7. strrav DB 10,13,'ravno: $'
  8. strnerav DB 10,13,'ne ravno: $'
  9. buf1 db 40 dup(?)
  10. buf2 db 40 dup(?)
  11. .CODE
  12. start:
  13. mov ax,@data
  14. mov ds,ax
  15. mov ah,9h
  16. mov dx,OFFSET str1
  17. int 21h
  18. mov bx,0
  19. start1: ;VVod 1 str
  20. mov ah,1
  21. int 21h
  22. cmp al,13
  23. je start2
  24. mov buf1[bx],al
  25. inc bx
  26. jmp start1
  27. start2:
  28. mov ah,9h
  29. mov dx, OFFSET str2
  30. int 21h
  31. mov di,0
  32. start3: ;VVod 2 str
  33. mov ah,1
  34. int 21h
  35. cmp al,13
  36. je start4
  37. mov buf2[di],al
  38. inc di
  39. jmp start3
  40. start4: ;sravnenie
  41. cmp bx,di
  42. jne start6
  43. mov ax,0
  44. mov dx,0
  45. start44:
  46. cmp di,0
  47. je start5
  48. mov al,buf1[di]
  49. cmp al,buf2[di]
  50. jne start6
  51. dec di
  52. jmp start44
  53. start5: ;vivod ranestva
  54. mov ah,9h
  55. mov dx, OFFSET strrav
  56. int 21h
  57. jmp start7
  58. start6: ; vivod ne ravenstva
  59. mov ah,9h
  60. mov dx, OFFSET strnerav
  61. int 21h
  62. start7:
  63. .exit 0
  64. END start

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

textual
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4. m_f db 'Первая строка длиннее второй на $'
  5. m_s db 'Вторая строка длиннее первой на $'
  6. m_b db ' байт$'
  7. m_e db 'Строки равны$'          
  8. buf db 82 dup(?)
  9. .code
  10. out_msg macro msg       ;Выводит строку на экран.
  11.         push ax
  12.         push dx
  13.         mov ah,9
  14.         lea dx,msg
  15.         int 21h
  16.         pop dx
  17.         pop ax
  18.         endm
  19. start:  mov ax,@data
  20.     mov ds,ax
  21.     mov ah,3fh      ;Ввод первой строки.
  22.         mov bx,0        ;Ноль означает клавиатуру.
  23.         mov cx,82       ;Максимальное число вводимых символов(80) плюс 2 (для 0ah и 0dh).
  24.         lea dx,buf      ;Адрес области памяти для вводимой строки.
  25.         int 21h
  26.         push ax         ;Запоминаем длину первой строки в стеке(она на 2 больше реальной длины, но это для сравнения неважно).
  27.         mov ah,3fh      ;Ввод второй строки.
  28.         int 21h         ;Длина второй строки в ax
  29.         pop bx           bx длина первой строки.
  30.         sub ax,bx       ;Сравниваем длины.
  31.         js @f           ;Если результат вычитания отрицательный, первая строка длиннее второй.
  32.         je @e           ;Поднят zf - строки равны.
  33.         out_msg m_s     ;Результат вычитания положительный - вторая строка больше первой.
  34.         call out_b      
  35.         out_msg m_b
  36.         jmp exit        
  37. @f:     neg al          ;Получаем модуль результата вычитания.
  38.         out_msg m_f
  39.         call out_b
  40.         out_msg m_b
  41.         jmp exit
  42. @e:     out_msg m_e
  43. exit:   mov ax,4c00h
  44.     int 21h
  45. out_b proc              ;Выводит двузначное число.
  46.         xor ah,ah
  47.         mov bl,10
  48.         div bl
  49.         or ax,3030h
  50.         int 29h
  51.         mov al,ah
  52.         int 29h
  53.         ret
  54. out_b endp
  55. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы