Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2012, 20:22   #1
Leshkin
 
Регистрация: 22.10.2012
Сообщений: 5
Вопрос Задача 1-реализована.Задача 2-Найти и вывести символы 2-ой строки не совпавшие с символами 1-ой строки

Только начал изучать assemler.
Задача:
Реализовал:1.Написать программу, выполняющую следующую функцию. Заданы две строки. Проверить вхождение каждого символа строки 1 в строку 2.


2.Если какой-либо (первый слева) символ строки 1 не представлен в строке 2, то фиксируется номер позиции этого символа в строке 1.
Как я понимаю нужно при несовпадении строк вывести символы 2-ой строки несовпавшие с символами 1 строки.
помогите пожалуйста со 2 пунктом.

мои наработки:
Код:
.386
    .model flat, stdcall
    option casemap :none
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc 
    include \masm32\include\masm32.inc
    include \masm32\include\kernel32.inc
    include \masm32\macros\macros.asm
    includelib \masm32\lib\user32.lib 
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\kernel32.lib

;Директива EQU присваивает метке значение, которое определяется 
;как результат целочисленного выражения в правой части. 
;Результатом этого выражения может быть целое число, адрес или любая строка символов
Asize equ 60
			;------------------------Инициализация переменных------------------------
.data		;эта секция наиболее универсальная мы резервируем память под данные и сразу же объявляем их
	 msg1 db "Vvedite 1 stroky:		",0dh,0ah				;0dh,0ah перевод на новую строку
	 msg2 db "Vvedite 2 stroky:		",0dh,0ah				
	 msg3 db "---Stroki sovpali---" ,0dh,0ah,0dh,0ah,0dh,0ah				
	 msg4 db "---Stroki ne sovpali---" ,0dh,0ah,0dh,0ah,0dh,0ah

	 .data?		;в данной секции мы нельзя инициализировать переменные
	 str1 db 32 dup (' '),'$' ;Введенные символы
	 str2 db 32 dup (' '),'$' ;Введенные символы


	 stdin dd ?			;dd - 4 байта - 2 слова	=8 символам					
	 stdout dd ?
	 cRead dd ?							
	 cWritten dd ?
	 res  dd ?
.code
start:				
	invoke GetStdHandle,STD_OUTPUT_HANDLE	;Дескриптор стандартного устройства ввода данных. 
											;Вначале, это - дескриптор консольного буфера ввода	
	mov stdout,eax							;копирует значение переменной stdin в регистр eax
	invoke GetStdHandle,STD_INPUT_HANDLE
	mov stdin,eax; 
	invoke WriteConsoleA,stdout,ADDR msg1,SIZEOF msg1,ADDR cWritten,NULL
		invoke ReadConsole,stdin,ADDR str1,Asize,ADDR cRead,NULL	;считываем 1 строку с консоли
	invoke WriteConsoleA,stdout,ADDR msg2,SIZEOF msg2,ADDR cWritten,NULL
		invoke ReadConsole,stdin,ADDR str2,Asize,ADDR cRead,NULL	;считываем 2 строку с консоли



	;-----------------------------------процесс сравнения строк-----------------------------------
	CLD									;направление вперед(с начала в конец)
	MOV ECX,32			;длина строки
	LEA ESI,str1		;загрузка в esi смещения str1(адрес 1 элемента 1 строки)
	LEA EDI,str2		;загрузка в edi смещения str2(адрес 1 элемента 2 строки)
	REPE CMPSB			;само сравнение				repe-префикс повторения; 
						;CMPSB-сравнение строк, расположенных по адресам, содержащимся в регистрах ESI и EDI
						;JNE-переходит тогда,когда приемник!=источнику
	JNE NE_SOVPALO			;если не совпали бежим в NO_SOVPALO	
	JMP _SOVPALO				;если совпали бежим в _SOVPALO	
NE_SOVPALO:									;если не совпали
	invoke WriteConsoleA,stdout,ADDR msg4,SIZEOF msg4,ADDR cWritten,NULL	;выводим что строки не совпали
	invoke Sleep,INFINITE		;не закрываем консоль после выполнения
	invoke ExitProcess,0	;выходим из прогрмаммы   
_SOVPALO:										;если совпали
	invoke WriteConsoleA,stdout,ADDR msg3,SIZEOF msg3,ADDR cWritten,NULL
	MOV ECX,32			
	LEA ESI,str1		;загрузка в esi смещения str1(адрес 1 элемента 1 строки)
	LEA EDI,res 
	L1:
		MOV AL,[ESI]
		MOV [EDI],AL
		INC EDI		;увеличиваем на 1 адрес 1 строки
		INC ESI		;увеличиваем на 1 адрес 2 строки

	LOOP L1
    invoke Sleep,INFINITE		;не закрываем консоль после выполнения

	invoke ExitProcess,0		;выход 
end start
Leshkin вне форума Ответить с цитированием
Старый 23.10.2012, 18:40   #2
Leshkin
 
Регистрация: 22.10.2012
Сообщений: 5
По умолчанию

вроде решил сделать так, но в res почему то всегда ноль,как сделать что вы в данную переменную записывалось не совпавшие символы?
или я не туда это пишу?
Код:
NE_SOVPALO:                                 ;если не совпали
    invoke WriteConsoleA,stdout,ADDR msg4,SIZEOF msg4,ADDR cWritten,NULL    ;выводим что строки не совпали
 
        
            
        mov ebx,res         ;символ для вывода
        invoke wsprintf,addr str3,addr format,ebx ; здесть символ переведется в строку
        invoke MessageBox,0,addr str3,0,MB_OK ; здесь он выведется
 
    invoke Sleep,INFINITE       ;не закрываем консоль после выполнения
    invoke ExitProcess,0    ;выходим из программы
Leshkin вне форума Ответить с цитированием
Старый 27.10.2012, 06:41   #3
Leshkin
 
Регистрация: 22.10.2012
Сообщений: 5
По умолчанию

реализовал все что нужно
Leshkin вне форума Ответить с цитированием
Старый 12.11.2013, 08:57   #4
ВасилийС
Новичок
Джуниор
 
Регистрация: 12.11.2013
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Leshkin Посмотреть сообщение
реализовал все что нужно
Подскажите пожалуйста, что вы прописали во второй части программы????
Не получается реализовать
ВасилийС вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Символы и строки.Задача Nimiroff Помощь студентам 3 10.05.2011 22:09
Задача на С++. Символы,строки. cuzo Помощь студентам 7 07.01.2010 18:16
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27