Поиск уникальных символов строки - Assembler

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

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

Здравствуйте. Задание такое: Написать программу, выполняющую следующую функцию. Заданы две строки. Проверить вхождение каждого символа строки 1 в строку 2. Если какой-либо (первый слева) символ строки 1 не представлен в строке 2, то фиксируется номер позиции этого символа в строке 1. то есть на выходе формируется массив индексов уникальных символов я дошел до момента поиска уникальных элементов
data segment
s1 db "zezzezzzezz$"
s2 db "eeeee"
s3 db 50 dup(?)
i db 1h
data ends
 
stk segment stack       
    db  256 dup('*')    
stk ends    
 
assume cs:code, ds: data,es:stk
 
code segment
main:
 
    mov ax,data
    mov ds, ax  
    xor bx, bx
    mov si, offset s1
    mov dx, 50
    mov i,0h
    
m1:
    lodsb
    mov cx, 50
    mov di, offset s2   
    scasb
    jz m2
    mov bl,i
        add i, 48
    mov [si],bl
    inc i
m2:
    inc si
    lodsb
    cmp al,'$'
    je ex
    jmp m1
ex:
        mov AH,9h
        mov dx, offset s1
        int 21h     
        mov ax,4c00h    
        int 21h     
code ends
end main
по сути должно быть примерно следующее z0zz1zzz2zz, но выводится z0zz1zz2ez3, хотя элемента e, там быть не должно. Помогите разобраться, и, если можно помогите с дальнейшей реализацией, а то у меня кончились регистры индексации. может я объясняю некорректно, просто я новичок в ассемблере, буду рад любому совету. Заранее спасибо

Решение задачи: «Поиск уникальных символов строки»

textual
Листинг программы
data segment
s1 db "Hello my friend!$"
s2 db "Can I learn Assembler?$"
pos  db 100 dup (?)
data ends
 
assume cs:code, ds: data
 
code segment
main:
    mov ax,data
    mov ds, ax  
    xor bx,bx ;зануление
    xor cx,cx
    mov si, offset s1 ;записываем в si индекс
m1:
    lodsb ;берем символ по si  и  пишем его в al. si++
    cmp al,'$' ;если равны, выходим
    je ex       
    mov di, offset s2 ;записываем в di индекс
    go:
        cmp [di], al ;сравнмваем
        je m1 ; если равны, берем следующий si
        inc di ;иначе di++
        mov cx, 24h 
        cmp [di], cx ;сравниваем с $
        je m2 ; если дошли до конца, значит символ не найден
    jmp go
m2:
    mov   ax,si ;записываем индекс
    sub   ax, offset s1 ;получаем индекс
    dec   ax ;индекс-- так как при lodsb si++
    mov dl,10
    div dl
    add ax, 3030h ;получаем числа
    mov   byte ptr pos[bx],al ;записываем десятки
    inc bx
    mov   byte ptr pos[bx],ah ;записываем единицы
    inc   bx
    mov   byte ptr pos[bx],' ' ;пихаем пробел
    inc   bx
    jmp m1
ex:
    mov  byte ptr pos[bx],'$'
        mov AH,09h
        lea dx, pos
        int 21h     
        mov ax,4c00h    
        int 21h     
code ends
end main

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

  1. В данном коде на языке Assembler реализуется функция поиска уникальных символов в строке.
  2. Строка s1 содержит исходную строку, а s2 - строку, в которой будут храниться уникальные символы.
  3. Переменная pos является массивом, в который будут записываться уникальные символы.
  4. После инициализации строк и массива pos, происходит сравнение каждого символа строки s1 со всеми символами строки s2.
  5. Если символ не найден в строке s2, он записывается в массив pos.
  6. Если все символы строки s1 были просмотрены, выводится сообщение об успешном выполнении программы.
  7. Если символ найден в строке s2, происходит переход к следующему символу строки s1.
  8. Если все символы строки s1 были просмотрены и не было найдено ни одного уникального символа, выводится сообщение об ошибке.

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


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

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

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