Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
65 / 0 / 1
Регистрация: 05.11.2013
Сообщений: 65

Восприятие команд

27.06.2014, 00:46. Показов 1138. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу командную строку и не могу придумать логику для обработчика команд подкиньте какую-нибудь идею покомпактней. Очень полезна оптимизация.
P.S. использую только английский алфавит, цифры и знаки , - = [ ] ; . \
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.06.2014, 00:46
Ответы с готовыми решениями:

Восприятие
Хочу с вами посоветоваться. Во общем в последнее время стал замечать, что у меня какие то события не вызывают эмоций вообще... С...

Восприятие яркости
Помогите понять Закон Вебера — Фехнер, заключающийся в том, что интенсивность ощущения чего-либо прямо пропорциональна логарифму...

Тест на восприятие человека?
Или почему компилер не нашёл очепятку в case? #include<stdio.h> int main() { int a=10; switch(a) ...

8
3 / 3 / 1
Регистрация: 30.05.2014
Сообщений: 34
27.06.2014, 11:05
Простейший вариант - тупо сравнивать содержимое буфера и образца командой CMP, для команд до 4 символов этого вполне хватает. На худой конец можно создать цикл и выуживать из видеопамяти, выбрасывая атрибуты символа. Ну или нечто вроде этого:


Assembler
1
2
3
4
Cmp edx,'DIR '
Jz comand_dir
Cmp edx,'RUN '
Jz comand_run
Получится примитивная консоль.
1
65 / 0 / 1
Регистрация: 05.11.2013
Сообщений: 65
27.06.2014, 12:20  [ТС]
на 3-4 команды это работает а как оптимизировать для большого количества команд длинной более 4 символов
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
27.06.2014, 13:43
artem3213212,
можно подумать, что команды будут отличаться друг от друга более чем 4 символами, покажи для начала полный список своих команд
1
65 / 0 / 1
Регистрация: 05.11.2013
Сообщений: 65
27.06.2014, 15:39  [ТС]
run
proginf
progempy
exit
changeid
progdel
clrscr
libid
dir
open
close
rename
prognew
filenew
dirnew
и др.
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
27.06.2014, 16:56
Лучший ответ Сообщение было отмечено artem3213212 как решение

Решение

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
; esi - адрес строки с командой
 
mov edi,cmd
 
loop0:
push esi
movzx ecx,byte [edi]
inc edi
or ecx,ecx
jz .err
xor eax,eax
repe cmpsb
jecxz @f
add edi,ecx
add edi,4
jmp loop0
@@:
mov eax,[edi]
jmp eax
.err:
; команда не найдена
cmd:
db 4,"copy"
dd copy_cmd
db 3,"rem"
dd rem_cmd
db 6,"remove"
dd rem_cmd
db 0
 
rem_cmd:
; обработка команд rem и remove
copy_cmd:
; обработка команды copy
Думаю, идея ясна
2
3 / 3 / 1
Регистрация: 30.05.2014
Сообщений: 34
27.06.2014, 17:38
А для очень большого числа команд имеет смысл делать древовидную систему команд, типа поиска по суффиксу.
К примеру, open_file. Ищем 'open', переходим к ветке, затем в ветке ищем 'file'.


Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Cmp dword [edx],'OPEN'
Jz Open_istr
Cmp dword [edx],'RUN_'
Jz Run_istr
;...
Jmp invalid_comand
 
Open_istr:
 
Cmp dword [edx+5],'PROG'
Jz Open_program
Cmp dword [edx+5],'FILE'
Jz Open_file
;...
Jmp invalid_comand
 
Run_istr:
;...
В более продвинутом варианте делают также пропуск пробелов. Просто сканируют на наличие 30h (или какой там у пробела опкод) до первого несоответствия, а далее идет уже алгоритм типа того, что предложил sh2ezo,
2
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
27.06.2014, 21:14
Создать массив команд, упорядоченный по алфавиту и искать двоичным поиском (сложность log2n). Это будет работать очень быстро.

Можно ещё ускорить:
1) Разбить команды на 26 групп (по первой букве)
2) Создать массив указателей на группы
3) Теперь для поиска считываем первую букву команды, через массив получаем указатель на начало группы команд и делаем двоичный поиск внутри группы.
1
65 / 0 / 1
Регистрация: 05.11.2013
Сообщений: 65
02.07.2014, 23:14  [ТС]
извиняюсь но теперь появилась ошибка в коде где не вижу но завис происходит
помогите пожалуйста
перед началом в cur2 адрес первого символа в eax-последнего писал на насме
код немного кривой, извиняюсь
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
pusha
mov ebx,[cur2]
mov ecx,text
cmp ebx,eax
ja Enter.stop0
Enter.return0:
        mov dl,[ebx]
        mov [ecx],dl
        inc ebx
        inc ecx
cmp ebx,eax
jna Enter.return0
Enter.stop0:
mov [command_end],ecx
 
worke:
    mov eax,text
    mov bl,[eax]
    cmp bl,' '
    ja Enter.stop00
 
    Enter.return00:
        inc eax
        mov bl,[eax]
    cmp eax,ecx
    ja Enter.stop00
    cmp bl,' '
    jna Enter.return00
    Enter.stop00:
    mov [command_start],eax
 
 
    mov bl,[ecx]
    cmp bl,' '
    ja Enter.stop01
 
    Enter.return01:
        dec ecx
        mov bl,[ecx]
    cmp bl,' '
    jna Enter.return01
    Enter.stop01:
    mov [data_end],ecx
 
    pusha
    inc ecx
    mov byte [ecx],0
    popa
 
    mov eax,[command_start]
    mov bl,[eax]
    Enter.return02:
        inc eax
        mov bl,[eax]
    cmp eax,ecx
    ja Enter.error02
    cmp bl,' '
    ja Enter.return02
    mov [command_end],eax
    jmp Enter.stop02
 
    Enter.error02:
    mov [data_start],eax
    Enter.stop02:
    mov [command_end],eax
 
    mov eax,[command_start]
    mov ebx,[command_end]
    sub eax,ebx
    sub eax,3
    mov ebx,4
    mov edx,0
    mul ebx
    add eax,comm_big_table
    call [eax]
    jmp worke.stop
 
    A3:
    mov ebx,codes3
    jmp decoder1
 
    A4:
    mov ebx,codes4
    jmp decoder1
 
    decoder1:
    mov eax,[command_start]
    Enter.return03:
    mov ecx,[ebx]
    cmp ecx,0
    ja Enter.error03
    add ebx,8
    cmp [eax],ecx
    jna Enter.return03
    sub ebx,4
    call [ebx]
    ret
 
    A5:
    mov ebx,codes5
    jmp decoder2
 
    A6:
    mov ebx,codes6
    jmp decoder2
 
    decoder2:
    mov eax,[command_start]
    Enter.return04:
    mov ecx,[ebx]
    cmp ecx,0
    ja Enter.error04
    add ebx,4
    cmp [eax],ecx
    jna Enter.return04
    mov cx,[ebx]
    add ebx,6
    cmp [eax],cx
    jna Enter.return04
    sub ebx,4
    call [ebx]
    ret
 
    A7:
    mov ebx,codes7
    jmp decoder3
 
    A8:
    mov ebx,codes8
    jmp decoder3
 
    decoder3:
    mov eax,[command_start]
    Enter.return05:
    mov ecx,[ebx]
    cmp ecx,0
    ja Enter.error05
    add ebx,4
    cmp [eax],ecx
    jna Enter.return05
    mov ecx,[ebx]
    add ebx,8
    cmp [eax],ecx
    jna Enter.return05
    sub ebx,4
    call [ebx]
    ret
 
 
    Enter.error03:
    Enter.error04:
    Enter.error05:
    ret
 
worke.stop:
 
jmp mini_data
    text:
    times 80 db 0
    command_start dd text
    command_end dd text+80
    data_start dd text
    data_end dd text+80
    comm_big_table:
    dd A3;0 3
    dd A4;1 4
    dd A5;2 5
    dd A6;3 6
    dd A7;4 7
    dd A8;5 8
    codes3:
    db 'run '
    dd 0
    db 'dir '
    dd 0
    dd 0
    codes4:
    db 'open'
    dd 0
    db 'exit'
    dd 0
    dd 0
    codes5:
    db 'libid '
    dd 0
    db 'close '
    dd 0
    dd 0
    codes6:
    db 'clrscr'
    dd 0
    db 'rename'
    dd 0
    db 'dirnew'
    dd 0
    dd 0
    codes7:
    db 'prognew '
    dd 0
    db 'filenew '
    dd 0
    db 'proginf '
    dd 0
    db 'progdel '
    dd 0
    dd 0
    codes8:
    db 'progempy'
    dd 0
    db 'changeid'
    dd 0
    dd 0
mini_data:
popa
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.07.2014, 23:14
Помогаю со студенческими работами здесь

Неправильное восприятие переменной
procedure modi(var m: integer); var k: real; var t,n,g,i: integer; begin m:= m*m; t:= m; i:= 0; while (t>0) do begin ...

проверка на образное восприятие
Я вообще так и не увидел

Восприятие языка описания аппаратуры
Всем привет. Вникаю в языки описания аппаратуры, в частности в verilog, и на одном вопросе вхожу в ступор. Для примера возьмем два кода: ...

strpos восприятие функцией false и 0
вот пример <?php $mesg="раб"; if (False!=strpos($mesg,"раб")) { echo "неработает"; } ...

Восприятие ПС статей сходных между собой?
Есть статьи с одной было зделано 30 рерайтов, ручных! Совпадений по ним по всем между собой примерно вот такое -> Количество слов в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru