Вывести на экран символы, которые содержатся в обеих строках - Assembler

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

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

Здравствуйте! Нужна помощь с программой. Пишу под DOS. Условие: С клавиатуры вводятся две строки, вывести на экран символы, которые содержатся в обеих строках. Вот мой код, работает неправильно, не совсем разобрался с регистром si, а точнее тем, как с ним взаимодействовать.
data segment
     string1 db 100,100 dup ('$') ; буфер ввода
     string2 db 100,100 dup ('$')  ; буфер ввода
     string3 db 100,100 dup ('$') ; буфер вывода
     len1 dw ?
     len2 dw ?
data ends
code segment
assume cs:code, ds:data
START:
        mov ax, data
        mov ds, ax
        mov dl, 0ah
        mov ah, 2
        int 21h
        lea dx, string1
        mov ah, 0ah
        int 21h 
        xor ah, ah 
        lea bx, string1+2 
        xor cx, cx
        mov cl, string1+1
        xor si, si
        mov len1, cx
BB1:
        mov al, [bx]
        mov string1[si] , al
        inc si
        inc bx 
loop BB1 ; окончание ввода 1й строки
        mov dl, 0ah
        mov ah, 2
        int 21h
        lea dx, string2
        mov ah, 0ah
        int 21h 
        xor ah, ah 
        lea bx, string2+2 
        xor cx, cx
        mov cl, string2+1
        xor si, si
        mov len2, cx
BB2:
        mov al, [bx]
        mov string2[si] , al
        inc si
        inc bx 
loop BB2 ; окончание ввода 2й строки
        mov dl, 0ah
        mov ah, 2
        int 21h
        xor bx, bx
        xor si, si
        xor di, di
        xor dx, dx
compare:
        cmp si, len1 ; как только дойдем до конца первой строки, выход
        je OUT1
        mov ah, string1[si] ; в ah - элемент из 1й строки
 
cmp1:
        mov al, string2[di] ; в al - элемент из 2й строки
        cmp ah, al
        jne NO
        mov string3[si], al ; если совпали, заношу элемент в строку на вывод
        jmp NEXT_SI
NO:
        cmp di, len2
        jl NEXT_DI
NEXT_SI:
        inc si
        xor di, di
        jmp compare
NEXT_DI:
        inc di
        jmp cmp1
loop compare
OUT1:
        mov string3[si], '$'
        xor si, si
        lea dx, string3
        mov ah, 09h
        int 21h
        mov ah, 10h
        int 16h
        mov ax, 4C00h 
        int 21h
 code ends
 end START

Решение задачи: «Вывести на экран символы, которые содержатся в обеих строках»

textual
Листинг программы
    mov ax, ds
     mov es, ax

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

  1. Создается переменная ax, которая будет содержать значение текущего сегмента данных (ds - data segment).
  2. Значение переменной ax копируется в переменную es, которая будет использоваться в качестве сегмента данных для записи данных.

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

7   голосов , оценка 4.286 из 5
Похожие ответы