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

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

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

Дали задачку: Ввести 2 строки символов и зарезервировать место под третью строку. Сравнить первые две и если в них есть разные буквы то записать эти буквы в третью строку. Вот код:
include io.asm
Sseg segment stack 
  db 256 dup(?)
Sseg ends
Dseg segment
v1 db 0dh,0ah,'Vvedite stroku N1: $'
v2 db 0dh,0ah,'Vvedite stroku N2: $'
s1 db 5 dup(?)
s2 db 5 dup(?)
s3 dw 5 dup(?)
Dseg ends
Cseg segment 
    assume cs:Cseg,DS:Dseg,SS:Sseg,ES:Dseg
start:
    mov ax,Dseg
    mov ds,ax
    mov es,ax
    
    cld
    lea dx,v1
    outstr 
    mov cx,5
    mov si,0
vvod1:  
    inch s1[si]
    inc si
    loop vvod1
    
    newline
    
    lea dx,v2
    outstr
    mov cx,5
    mov si,0
vvod2:
    inch s2[si]
    inc si
    loop vvod2
    
    lea si,s2
    lea di,es:s1
  
    mov cx,5    
srav:
    repe cmps s1,s2
    mov bx,0
    dec di
    mov s3[bx],di
    inc di
    inc bx
    loop srav
    
    mov cx,5
    
    mov ah, 09   
    lea dx, s3   
    int 21h
    finish
Cseg ends 
end start
Мне чутка подсказали и я переписал код и вот измененный:
include io.asm
Sseg segment stack 
    db 256 dup(?)
Sseg ends
Dseg segment
v1 db 0dh,0ah,'Vvedite stroku N1: $'
v2 db 0dh,0ah,'Vvedite stroku N2: $'
s1 db 5 dup(?)
s2 db 5 dup(?)
s3 db 6 dup(?)
Dseg ends
Cseg segment 
        assume cs:Cseg,DS:Dseg,SS:Sseg,ES:Dseg
start:
        mov ax,Dseg
        mov ds,ax
        mov es,ax
        
        cld
        lea dx,v1
        outstr 
        mov cx,5
        mov si,0
vvod1:  
        inch s1[si]
        inc si
        loop vvod1
        
        newline
        
        lea dx,v2
        outstr
        mov cx,5
        mov si,0
vvod2:
        inch s2[si]
        inc si
        loop vvod2
        
        lea si,s2
        lea di,es:s1
    
        mov cx,5
        mov bx,0
srav:
        repe cmps s1,s2
        dec di
        mov al, [di]
        mov s3[bx], al
        inc di
        inc bl
        loop srav
 
        mov s3[bx],'$'
        lea dx,s3
        outstr
        finish
Cseg ends 
end start
Но проблема все осталась:C Почему происходит такой странный вывод? я не могу разобраться уже 1.5 дня Вот скрины:

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

textual
Листинг программы
include io.asm
Sseg segment stack 
    db 256 dup(?)
Sseg ends
Dseg segment
v1 db 0dh,0ah,'Vvedite stroku N1: $'
v2 db 0dh,0ah,'Vvedite stroku N2: $'
s1 db 5 dup(?)
s2 db 5 dup(?)
s3 db 5 dup(?), '$'
Dseg ends
Cseg segment 
        assume cs:Cseg,DS:Dseg,SS:Sseg,ES:Dseg
start:
        mov ax,Dseg
        mov ds,ax
        mov es,ax
        
        cld
        lea dx,v1
        outstr 
        mov cx,5
        mov si,0
vvod1:  
        inch s1[si]
        inc si
        loop vvod1
        
        newline
        
        lea dx,v2
        outstr
        mov cx,5
        mov di,0
vvod2:
        inch s2[di]
        inc di
        loop vvod2
        
        lea si,s1
        lea di,es:s2
    
        mov cx,5
        mov bx,0
srav:
        repe cmps s1,s2
        jne p1
p1:
        dec si
        lods s1
        mov s3[bx], al
        inc si
        inc bl
        loop srav
exit:
        lea dx,s3
        outstr
        finish
Cseg ends 
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
Похожие ответы