Ввести с клавиатуры две строки. Вывести на экран все символы, которые содержатся в обеих строках. - Assembler
Формулировка задачи:
Условие программы:
Ввести с клавиатуры две строки. Вывести на экран все символы, которые содержатся в обеих строках.
Программа:
При компиляции выдает ошибку Underfined symbol: DSEG
вот эта строка
stat: mov ax,dseg
Помогите разобраться
data segment
prmt_str1 db 'Введите первую строку$'
prmt_str2 db 'Введите вторую строку$'
buf1 label byte ;буфер для ввода первой строки
max1 db 80
lnt1 db ?
str1 db 80 dup(?)
buf2 label byte ;буфер для ввода второй строки
max2 db 80
lnt2 db ?
str2 db 80 dup(?)
rslt db 80 dup(?)
data ends
code segment
assume cs: code, ds: data
start: mov ax, data
mov ds, ax
crlf macro ;макрос перевода строки
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
endm
stat: mov ax,dseg ; <--------------- !!!
mov ds,ax
mov es,ax
;Вводим строки в buf1 и buf2
mov ah,09h
mov dx,offset prmt_str1
int 21h
crlf
mov ah,0ah
mov dx,offset buf1
int 21h
crlf
mov ah,09h
mov dx,offset prmt_str2
int 21h
crlf
mov ah,0ah
mov dx,offset buf2
int 21h
crlf
;Ищем символы, присутствующие в обеих строках
mov si,offset str1
mov di,offset str2
xor bx,bx ;индексирование в rslt
xor cx,cx
mov cl,lnt1
ld_al: push cx
push di
lodsb ;в al загружаем символ из первой строки
xor cx,cx
mov cl,lnt2
repne scasb ;и ищем его во второй
jnz nxt ;символ не найден - на загрузку следующего
mov di,offset rslt ;символ найден, проверим, нет ли уже этого
mov cx,80 ;символа в строке результата
repne scasb
jz nxt ;и если уже есть - игнорируем
mov rslt[bx],al ;символа в строке rslt нет, запишем его туда
inc bx
int 29h ;и отобразим на экране
nxt: pop di
pop cx
loop ld_al
;Выход в DOS
mov ax,4c00h
int 21h
code ends
end startРешение задачи: «Ввести с клавиатуры две строки. Вывести на экран все символы, которые содержатся в обеих строках.»
textual
Листинг программы
code segment assume cs:code,ds:data new_line macro mov ah,2 mov dx,0ah int 21h endm out_line macro mov ah,9 int 21h endm start: mov ax,data mov ds,ax mov bx,offset text ;по этому адресу будут вводиться символы mov string_1,bx ;запоминаем адрес с которого, на данный момент будет произведён ввод call in_line ;вызываем процедуру записи new_line ;переход на новую строку mov string_2,bx ;всё то же самое call in_line new_line mov dx,string_1 ;в dx адрес строки, для вывода out_line ;выводим new_line ;переход на новую строку mov dx,string_2 out_line mov ah,10h int 16h mov ah,4ch ;выход int 21h in_line proc mov ah,1 n1: int 21h mov byte ptr [bx],al inc bx cmp al,'.' ;строка ограничена точкой jne n1 mov byte ptr [bx],'$' ;символ конца строки inc bx ret in_line endp code ends data segment string_1 dw 0 ;для сохранения адреса 1 строки string_2 dw 0 ;для 2 строки text db 0 ;для строк не нужно резервировать место data ends end start