Ввести с клавиатуры две строки. Вывести на экран все символы, которые содержатся в обеих строках. - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д