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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2013, 23:23   #1
ВасилийС
Новичок
Джуниор
 
Регистрация: 12.11.2013
Сообщений: 2
По умолчанию Помогите пожалуйста с программой на ассемблере. Не получается реализовать вторую часть

Не получается написать вторую часть программы.

Вот это получилось:

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

А вот это нет:

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

Вот что у меня получилось по первой половине программы:

Код:
.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


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 13.11.2013 в 00:30.
ВасилийС вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уважаемые! Помогите пожалуйста заполнить вторую часть таблицы в примере) Лука Microsoft Office Excel 0 07.07.2009 16:12
Помогите, пожалуйста, реализовать часть кода Horknee Паскаль, Turbo Pascal, PascalABC.NET 2 01.12.2008 23:30