Сравнить две строки и если в них есть разные буквы, то записать эти буквы в третью строку - Assembler
Формулировка задачи:
Дали задачку:
Ввести 2 строки символов и зарезервировать место под третью строку. Сравнить первые две и если в них есть разные буквы то записать эти буквы в третью строку.
Вот код:
Мне чутка подсказали и я переписал код и вот измененный:
Но проблема все осталась:C
Почему происходит такой странный вывод? я не могу разобраться уже 1.5 дня
Вот скрины:
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 startinclude 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Решение задачи: «Сравнить две строки и если в них есть разные буквы, то записать эти буквы в третью строку»
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
Объяснение кода листинга программы
- Включаем файл io.asm - это файл-библиотека ввода-вывода, который содержит процедуры для работы с консолью.
- Создаем сегменты данных Sseg и Dseg - в сегменте Sseg будет стек, а в сегменте Dseg будут размещены переменные.
- Переменные v1 и v2 - это строки, в которые считываются две строки от пользователя.
- Переменные s1, s2 и s3 - это строки, в которые будут записываться результаты сравнения.
- Начальная установка сегментов данных и стека - сегмент данных устанавливается в Dseg, а сегмент стека - в Sseg.
- Вывод первой строки на экран - с помощью процедуры outstr выводим на экран первую строку для ввода.
- Считывание первой строки от пользователя - с помощью цикла vvod1 считываем 5 символов из первой строки и записываем их в переменную s1.
- Вывод второй строки на экран - с помощью процедуры outstr выводим на экран вторую строку для ввода.
- Считывание второй строки от пользователя - с помощью цикла vvod2 считываем 5 символов из второй строки и записываем их в переменную s2.
- Сравнение символов двух строк - с помощью цикла srav сравниваем символы двух строк. Если символы не совпадают, то записываем их в переменную s3.
- Вывод результата на экран - с помощью процедуры outstr выводим на экран результат сравнения в виде трех строк.
- Завершение работы программы - здесь ничего не происходит, программа просто заканчивается.