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

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

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

Условие программы: Ввести с клавиатуры две строки. Вывести на экран все символы, которые содержатся в обеих строках. Программа:
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
При компиляции выдает ошибку Underfined symbol: DSEG вот эта строка stat: mov ax,dseg Помогите разобраться

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

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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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