Поиск уникальных символов строки - Assembler
Формулировка задачи:
Здравствуйте. Задание такое: Написать программу, выполняющую следующую функцию. Заданы две строки. Проверить вхождение каждого символа строки 1 в строку 2. Если какой-либо (первый слева) символ строки 1 не представлен в строке 2, то фиксируется номер позиции этого символа в строке 1.
то есть на выходе формируется массив индексов уникальных символов
я дошел до момента поиска уникальных элементов
по сути должно быть примерно следующее z0zz1zzz2zz, но выводится z0zz1zz2ez3, хотя элемента e, там быть не должно. Помогите разобраться, и, если можно помогите с дальнейшей реализацией, а то у меня кончились регистры индексации. может я объясняю некорректно, просто я новичок в ассемблере, буду рад любому совету. Заранее спасибо
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
Решение задачи: «Поиск уникальных символов строки»
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
Объяснение кода листинга программы
- В данном коде на языке Assembler реализуется функция поиска уникальных символов в строке.
- Строка s1 содержит исходную строку, а s2 - строку, в которой будут храниться уникальные символы.
- Переменная pos является массивом, в который будут записываться уникальные символы.
- После инициализации строк и массива pos, происходит сравнение каждого символа строки s1 со всеми символами строки s2.
- Если символ не найден в строке s2, он записывается в массив pos.
- Если все символы строки s1 были просмотрены, выводится сообщение об успешном выполнении программы.
- Если символ найден в строке s2, происходит переход к следующему символу строки s1.
- Если все символы строки s1 были просмотрены и не было найдено ни одного уникального символа, выводится сообщение об ошибке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д