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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2010, 23:32   #1
Recart
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 15
Восклицание Ввод и сравнение строк

Доброго времени суток. Недавно начал писать программу на ассемблере, используя Masm, и столкнулся с проблемой сравнения строк.
Суть вот в чём: с клавиатуры вводится команда, затем программа проверяет, есть ли в ней такая команда и выполняет её (если есть), в противном случае, выводит сообщение об ошибке и ожидает ввода следующей команды.
Проблема началась с того, когда я начал сравнивать введённую строку и уже имеющуюся в сегменте данных строку с командой. Программа всё время пишет, что команда не найдена.
Прошу Вашей помощи. Подскажите как можно сравнить введенную с клавиатуры строку с уже имеющейся и при этом, выполнить действия связанные с этой командой?
Заранее благодарен.
Recart вне форума Ответить с цитированием
Старый 02.11.2010, 00:09   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

repe cmpsb?)
или АПИ CompareString.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.11.2010, 00:21   #3
Recart
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 15
По умолчанию

Код:
cld
   lea SI, buffer+2
   lea DI, Com_Time  
   mov CX,4
   repe CMPSB
в Com_Time записана уже имеющаяся строка, а в buffer строка, введённая с клавиатуры. Данная комбинация тоже не работала.

Последний раз редактировалось Stilet; 14.11.2010 в 16:42.
Recart вне форума Ответить с цитированием
Старый 02.11.2010, 00:58   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а где далее условие?(je)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.11.2010, 14:22   #5
Recart
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 15
По умолчанию

Условие есть в программе. Но суть в том, что строки buffer и Com_Time не получаются равными.
Код:
cld
lea SI, buffer+2
lea DI, Com_Time 
mov CX,4
repe CMPSB
je M_Time
jmp M_Non;

M_Time:
    <...>
    jmp M_Exit

M_Non:
    <...>
    jmp M_Exit

M_Exit:
    <завершение работы и ожидание ввода новой строки>

Последний раз редактировалось Stilet; 14.11.2010 в 16:42.
Recart вне форума Ответить с цитированием
Старый 02.11.2010, 19:57   #6
BVOG
Python,C++,ASM,Php
Пользователь
 
Аватар для BVOG
 
Регистрация: 29.08.2010
Сообщений: 58
По умолчанию

Это было реализовано, и весьма неплохо в GlukOS на TASM.
Исходники GlukOS
Хакер - это не ламер с завышенным самомнением, а программист с заниженной зарплатой.
Нелегка и неказиста жизнь простого программиста.
BVOG вне форума Ответить с цитированием
Старый 07.11.2010, 08:51   #7
wanes101
Форумчанин
 
Регистрация: 04.06.2010
Сообщений: 212
По умолчанию

Цитата:
cld
lea SI, buffer+2
lea DI, Com_Time
mov CX,4
repe CMPSB
А сколько вообще команд поддерживает программа?
Как в буфере различаются команды между собой (0, пробел, или без раз делений)
И каков размер буфера всех команд?

Попробую написать код.

Последний раз редактировалось wanes101; 07.11.2010 в 08:54.
wanes101 вне форума Ответить с цитированием
Старый 10.11.2010, 14:02   #8
Recart
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 15
По умолчанию

Программа поддерживает 4 команды. Это Cls, Time, RD, Time. В программе они уже записаны как:
Com_Time db 'Time$',0
Com_Clear db 'CLS$',0
Com_RD db 'RD$',0
Com_Exit db 'Exit$',0
Т.е. с этими переменными программа будет сравнивать введенные с клавиатуры команды
Recart вне форума Ответить с цитированием
Старый 14.11.2010, 13:46   #9
wanes101
Форумчанин
 
Регистрация: 04.06.2010
Сообщений: 212
По умолчанию

процедура Actionproc которая запускается с параметром встеке по адресу ss:[bp+4], в котором содержится номер команды напичатоной пользователем. Номера в током же порядке как описаны в сегменте data.
Тебе надо будет просто выбрать параметр в процедуре ActionProc и по нему выполнить нужные действия. К примеру я там написал обработку команды Exit.
Потом если будет, что не понятно пояcню как раблтает, посто сегодня времени нехватает пояснить.
вот код:

Код:
stac segment stack
db 256 dup (?)
stac ends

data segment
;Text
TextEnter		db		"Enter command$"
TextNoCommand	db 		"Such command is not present$"
TextYesCommand	db		"Such command is$"

Buffer			db		5,0,5 dup (?)

;Command
Com_Time 		db		"Time$",0
Com_Clear		db		"CLS&",0
Com_RD			db		"RD$",0
Com_Exit		db		"Exit$",0
data ends

code segment 
assume cs:code, ds:data, ss:stac
;процедура выполнений действий команды
	ActionProc Proc
		push bp
		mov bp,sp
		
		cmp word ptr [bp+4],-1
		je NoCommand2
		cmp word ptr [bp+4],4
		je Quit2
		
		;установка курсора на следующую строку
		mov bh,0
		mov ah,3
		int 10h
		
		inc dh
		mov dl,0
		mov ah,2
		int 10h
		;---------------------------------------------------
		mov dx,offset TextYesCommand
		mov ah,09h
		int 21h
		
		mov ax,1
		jmp Finish
		
		Quit2:
			mov ax,0
			jmp Finish
		
		NoCommand2:
			;установка курсора на следующую строку
			mov bh,0
			mov ah,3
			int 10h
			
			inc dh
			mov dl,0
			mov ah,2
			int 10h
			;---------------------------------------------------
			
			mov ah,09h
			mov dx,offset TextNoCommand
			int 21h
		
		Finish:
		mov sp,bp
		pop bp
		ret 2
	ActionProc endp
	
	Start:
		;init
		mov ax,seg data
		mov ds,ax
		mov bh,0
		mov ax,3
		int 10h
		Cycl3:
			;--------------------------------
			;вывод строки введите комманду
			mov dx,offset TextEnter
				mov ah,09h
			int 21h
			;--------------------------------------------
			;установка курсора на следующую строку
			mov bh,0
			mov ah,3
			int 10h
			
			inc dh
			mov dl,0
			mov ah,2
			int 10h
			;---------------------------------------------------
			;ожидание ввода строки
			mov dx,offset Buffer
			mov ah,0ah
			int 21h
		;--------------------------------------------------------
		;сравнение команды с введённой строкой
		cld
		xor bx,bx
		mov si,offset Com_Time ;загрузка адресса начала комманд
		;es=ds
		mov ax,ds
		mov es,ax
		cycl2:
			xor cx,cx
			mov cl,Buffer[1]
			lea di,Buffer[2]
			repe cmpsb
			pushf 
			inc bx
			popf
			jne NextCommand ;если эта команда не содветсвует команде в буффере, то следующая попытка найти оответствие в следующей команде
			push bx
			call ActionProc
			cmp ax,0
			je Quit
			
			;установка курсора на следующую строку
			mov bh,0
			mov ah,3
			int 10h
			
			inc dh
			mov dl,0
			mov ah,2
			int 10h
			;---------------------------------------------------
			jmp Cycl3
		
		NoCommand:
			mov bx,-1
			push bx
			call ActionProc
			;установка курсора на следующую строку
			mov bh,0
			mov ah,3
			int 10h
			
			inc dh
			mov dl,0
			mov ah,2
			int 10h
			;---------------------------------------------------
			jmp Cycl3
		
		NextCommand:
			;определение в si адресса следующей команды
			cmp bx,5
			je NoCommand
			mov al,0
			mov di,offset Com_Time
			xor dx,dx
			cld
			cycl1:
				mov cx,-1
				repne scasb
				inc dx
				cmp dx,bx
				jb cycl1
			mov si,di
			jmp cycl2
		
		Quit:
			mov ah,4ch
			int 21h
code ends

end Start

Последний раз редактировалось Stilet; 18.11.2010 в 14:15.
wanes101 вне форума Ответить с цитированием
Старый 18.11.2010, 14:10   #10
Recart
Пользователь
 
Регистрация: 01.11.2010
Сообщений: 15
По умолчанию

Спасибо. Очень помогло.
Recart вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение строк в С++ Китти Общие вопросы C/C++ 2 12.10.2010 16:56
Сравнение строк Dasharnb777 Общие вопросы .NET 5 22.09.2010 20:46
Макрос на сравнение и подсчет в первом столбце строк, и сумирование значений этих строк в другом столбце Shpr0T Microsoft Office Excel 8 30.08.2010 17:52
Сравнение строк, ввод пароля (assembler) You_must_help Помощь студентам 7 19.04.2009 23:53
Сравнение строк HOMER Общие вопросы Delphi 7 04.01.2008 05:53