Сравнить две строки и если в них есть разные буквы, то записать эти буквы в третью строку - Assembler

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

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

Дали задачку: Ввести 2 строки символов и зарезервировать место под третью строку. Сравнить первые две и если в них есть разные буквы то записать эти буквы в третью строку. Вот код:
Листинг программы
  1. include io.asm
  2. Sseg segment stack
  3. db 256 dup(?)
  4. Sseg ends
  5. Dseg segment
  6. v1 db 0dh,0ah,'Vvedite stroku N1: $'
  7. v2 db 0dh,0ah,'Vvedite stroku N2: $'
  8. s1 db 5 dup(?)
  9. s2 db 5 dup(?)
  10. s3 dw 5 dup(?)
  11. Dseg ends
  12. Cseg segment
  13. assume cs:Cseg,DS:Dseg,SS:Sseg,ES:Dseg
  14. start:
  15. mov ax,Dseg
  16. mov ds,ax
  17. mov es,ax
  18. cld
  19. lea dx,v1
  20. outstr
  21. mov cx,5
  22. mov si,0
  23. vvod1:
  24. inch s1[si]
  25. inc si
  26. loop vvod1
  27. newline
  28. lea dx,v2
  29. outstr
  30. mov cx,5
  31. mov si,0
  32. vvod2:
  33. inch s2[si]
  34. inc si
  35. loop vvod2
  36. lea si,s2
  37. lea di,es:s1
  38. mov cx,5
  39. srav:
  40. repe cmps s1,s2
  41. mov bx,0
  42. dec di
  43. mov s3[bx],di
  44. inc di
  45. inc bx
  46. loop srav
  47. mov cx,5
  48. mov ah, 09
  49. lea dx, s3
  50. int 21h
  51. finish
  52. Cseg ends
  53. end start
Мне чутка подсказали и я переписал код и вот измененный:
Листинг программы
  1. include io.asm
  2. Sseg segment stack
  3. db 256 dup(?)
  4. Sseg ends
  5. Dseg segment
  6. v1 db 0dh,0ah,'Vvedite stroku N1: $'
  7. v2 db 0dh,0ah,'Vvedite stroku N2: $'
  8. s1 db 5 dup(?)
  9. s2 db 5 dup(?)
  10. s3 db 6 dup(?)
  11. Dseg ends
  12. Cseg segment
  13. assume cs:Cseg,DS:Dseg,SS:Sseg,ES:Dseg
  14. start:
  15. mov ax,Dseg
  16. mov ds,ax
  17. mov es,ax
  18. cld
  19. lea dx,v1
  20. outstr
  21. mov cx,5
  22. mov si,0
  23. vvod1:
  24. inch s1[si]
  25. inc si
  26. loop vvod1
  27. newline
  28. lea dx,v2
  29. outstr
  30. mov cx,5
  31. mov si,0
  32. vvod2:
  33. inch s2[si]
  34. inc si
  35. loop vvod2
  36. lea si,s2
  37. lea di,es:s1
  38. mov cx,5
  39. mov bx,0
  40. srav:
  41. repe cmps s1,s2
  42. dec di
  43. mov al, [di]
  44. mov s3[bx], al
  45. inc di
  46. inc bl
  47. loop srav
  48. mov s3[bx],'$'
  49. lea dx,s3
  50. outstr
  51. finish
  52. Cseg ends
  53. end start
Но проблема все осталась:C Почему происходит такой странный вывод? я не могу разобраться уже 1.5 дня Вот скрины:

Решение задачи: «Сравнить две строки и если в них есть разные буквы, то записать эти буквы в третью строку»

textual
Листинг программы
  1. include io.asm
  2. Sseg segment stack
  3.     db 256 dup(?)
  4. Sseg ends
  5. Dseg segment
  6. v1 db 0dh,0ah,'Vvedite stroku N1: $'
  7. v2 db 0dh,0ah,'Vvedite stroku N2: $'
  8. s1 db 5 dup(?)
  9. s2 db 5 dup(?)
  10. s3 db 5 dup(?), '$'
  11. Dseg ends
  12. Cseg segment
  13.         assume cs:Cseg,DS:Dseg,SS:Sseg,ES:Dseg
  14. start:
  15.         mov ax,Dseg
  16.         mov ds,ax
  17.         mov es,ax
  18.        
  19.         cld
  20.         lea dx,v1
  21.         outstr
  22.         mov cx,5
  23.         mov si,0
  24. vvod1:  
  25.         inch s1[si]
  26.         inc si
  27.         loop vvod1
  28.        
  29.         newline
  30.        
  31.         lea dx,v2
  32.         outstr
  33.         mov cx,5
  34.         mov di,0
  35. vvod2:
  36.         inch s2[di]
  37.         inc di
  38.         loop vvod2
  39.        
  40.         lea si,s1
  41.         lea di,es:s2
  42.    
  43.         mov cx,5
  44.         mov bx,0
  45. srav:
  46.         repe cmps s1,s2
  47.         jne p1
  48. p1:
  49.         dec si
  50.         lods s1
  51.         mov s3[bx], al
  52.         inc si
  53.         inc bl
  54.         loop srav
  55. exit:
  56.         lea dx,s3
  57.         outstr
  58.         finish
  59. Cseg ends
  60. end start

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

  1. Включаем файл io.asm - это файл-библиотека ввода-вывода, который содержит процедуры для работы с консолью.
  2. Создаем сегменты данных Sseg и Dseg - в сегменте Sseg будет стек, а в сегменте Dseg будут размещены переменные.
  3. Переменные v1 и v2 - это строки, в которые считываются две строки от пользователя.
  4. Переменные s1, s2 и s3 - это строки, в которые будут записываться результаты сравнения.
  5. Начальная установка сегментов данных и стека - сегмент данных устанавливается в Dseg, а сегмент стека - в Sseg.
  6. Вывод первой строки на экран - с помощью процедуры outstr выводим на экран первую строку для ввода.
  7. Считывание первой строки от пользователя - с помощью цикла vvod1 считываем 5 символов из первой строки и записываем их в переменную s1.
  8. Вывод второй строки на экран - с помощью процедуры outstr выводим на экран вторую строку для ввода.
  9. Считывание второй строки от пользователя - с помощью цикла vvod2 считываем 5 символов из второй строки и записываем их в переменную s2.
  10. Сравнение символов двух строк - с помощью цикла srav сравниваем символы двух строк. Если символы не совпадают, то записываем их в переменную s3.
  11. Вывод результата на экран - с помощью процедуры outstr выводим на экран результат сравнения в виде трех строк.
  12. Завершение работы программы - здесь ничего не происходит, программа просто заканчивается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

9   голосов , оценка 3.667 из 5

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

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

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