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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2012, 14:55   #1
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию Получение длинны строки

Код:
Mass:	     mov 	ah,01h
		     int 21h
                     cmp al,13	                                 ;<Enter> ?
                     je Run	                                         ;Да, на сравнение
                     mov [string+bx],al                       	 ;Нет, сохраним символ
                     int 21h
                     inc bx	                                          ;Фактически введено
                     jmp Mass	                                  ;Повторять
ToBegin:  mov bx,0;	     
Test1:        cmp [string+bx],13  ; !!!!! ВОПРОС ПО ЭТОЙ СТРОЧЕ
		     je Test2
		     cmp d1,1
                     je output;
		     inc bx	                                        
output:	     mov ah,02
		     int 21h
		     inc bx
		     jmp Test1
Записывается ли аски код ентера в строку, если нет то как узнать длинну строки или обнаружить конец строки?
pinkiller вне форума Ответить с цитированием
Старый 12.03.2012, 16:00   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Записывается ли аски код ентера в строку
код неполный, так что вряд-ли кто-то скажет определённо...

Цитата:
если нет то как узнать длинну строки или обнаружить конец строки?
методов много:
1. писать в строку с нулями - конец будет там, где встречается ноль
2. сохранить bx (смещение в строке) как длину строки
3. можно использовать завершающий символ строк для доса "$"
и этим всё не ограничивается)

и вообще, по небольшому кусочку кода судить о работе программы сложно...
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 12.03.2012, 16:13   #3
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

Полный код:
Код:
                       %TITLE "HELLO.ASM"
                        IDEAL
                        MODEL small
                        STACK 256
                        DATASEG
password	DB	'camel'                                 	; Пароль
string	        DB	80 DUP(?)	                        ; Буфер для ввода пароля
promt	        DB	13,10,'Enter pass: $'
OK	                DB	13,10,'Correct$'
pass_len = 5                                                        ; Длина пароля
fff                    DB 13,10,'Enter symbols$'

	              CODESEG
start:	      mov ax,@data
                      mov ds,ax
begin:	      mov dx,offset promt	                 ; Адрес запроса
                      mov ah,09h	                                 ;Вывод запроса на ввод пароля
                      int 21h
;Введём пароль
                     mov bx,0	                                         ;Инициализация индексирования ввода
pass:	     mov ah,08h	                                 ;Функция ввода символа в AL без эха
                     int 21h
                     cmp al,13	                                 ;<Enter> ?
                     je compare	                                 ;Да, на сравнение
                     mov [string+bx],al                       	 ;Нет, сохраним символ
                     mov dl,'*'                                 	 ;Запишем на экран *
                     mov ah,02
                     int 21h
                     inc bx	                                         ;Фактически введено
                     jmp pass	                                         ;Повторять


;Сравнение введённого пароля с действительным (сравнение строк)
compare:	Cmp bx,pass_len
	Jne begin	;выйдем, если число введённых символов “> или <” 
	push ds	;Установить ES на сегмент данных
pop es	;es=ds
mov di,offset string	;ES:DI- начало string
mov si,offset password	;DS:SI- начало password
cld	;DF=0- просмотр вперёд
mov cx,pass_len	;Установить счётчик сравнения
repe	cmpsb	;{ds:si - es:di}. Сравнивать, пока символы двух 
		;строк совпадают, но не более CX раз)
jne begin	;Строки не равны
;Вывод сообщения ОК, подтверждающего правильность пароля
mov ah,09h	;Строки равны
mov dx,offset OK
int 21h
;продолжение программы
		     mov ah, 09h;
		     mov dx, offset fff
                     int 21h
		     mov bx,0;
		     jmp Mass
Mass:	     mov 	ah,01h
		     int 21h
                     cmp al,13	                                 ;<Enter> ?
                     je ToBegin1	                                         ;Да, на сравнение
                     mov [string+bx],al                       	 ;Нет, сохраним символ
                     int 21h
                     inc bx	                                          ;Фактически введено
                     jmp Mass	                                  ;Повторять
ToBegin1: mov bx,0
		      jmp Test1	     
Test1:        cmp [string+bx],13
		     je ToBegin2
		     cmp [string+bx],1
                     je output1;
		     inc bx
		     jmp Test1	                                        
output1:	     mov ah,02
		     int 21h
		     inc bx
		     jmp Test1
ToBegin2: mov bx,0
		      jmp Test2
Test2:        cmp [string+bx],13
		     je ToBegin3
		     cmp [string+bx],41h
                     je output2;
		     inc bx
		     jmp Test2	                                        
output2:	     mov ah,02
		     int 21h
		     inc bx
		     jmp Test2
ToBegin3: mov bx,0
		      jmp Test3
Test3:        cmp [string+bx],13
		     je ToBegin4
		     cmp [string+bx],61h
                     je output3;
		     inc bx
		     jmp Test3	                                        
output3:	     mov ah,02
		     int 21h
		     inc bx
		     jmp Test3
ToBegin4: mov bx,0
		      jmp Test4
Test4:        cmp [string+bx],13
		     je BCE
		     cmp [string+bx],21h
                     je output4;
		     inc bx
		     jmp Test4	                                        
output4:	     mov ah,02
		     int 21h
		     inc bx
		     jmp Test4
BCE:           jmp exit
exit:              mov ax,4C00h	                          ;Ввод функции 4С для завершения программы
                      int 21h
errz:	      jmp begin	                                   ;Повторить ввод пароля
END start
Суть программы в том что пользователь ввоодит символы, программа их выводит - сначала все единицы, потом А, потом а, потом !, в том количестве сколько встречено в введенных символах т.е
!!!AA!11aaA1 - введено
111AAAaa!!!! - выведено

Код может содержать уйму ошибок - первый опыт асемблера, но ехешник создался) и ошибок не выдал
pinkiller вне форума Ответить с цитированием
Старый 12.03.2012, 16:19   #4
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

Подожди не отвечай) Переделаю код)
pinkiller вне форума Ответить с цитированием
Старый 12.03.2012, 16:30   #5
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

А нет не переделываю.=( Лучше ответь)
pinkiller вне форума Ответить с цитированием
Старый 12.03.2012, 21:38   #6
pinkiller
Форумчанин
 
Регистрация: 29.10.2011
Сообщений: 141
По умолчанию

справился сам...
pinkiller вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правка EXE файла посредством bin/hex редактора. Вопрос о возможности увеличения длинны строки Вадим Мошев Общие вопросы по программированию, компьютерный форум 7 25.02.2012 00:02
Чтение длинны строки из файла R4peMe Помощь студентам 1 21.02.2011 13:30
получение исходного кода и удаление строки shanluu Работа с сетью в Delphi 3 17.10.2010 21:18
Получение параметров командной строки по PID sadist_ds Win Api 1 25.02.2009 20:22
Получение строки через HTTP запрос Никки JavaScript, Ajax 6 24.04.2008 17:56