Я не вижу здесь описания разницы между машинными кодами и языком ассемблера. Это неверная выдержка из книги. Здесь нет информации по предмету.
Уж поверь мне, машинные коды я знаю достаточно хорошо. Не отлично, но знаю.
Ну, ассемблер это всё таки автомат. И как бы его не "опускали", это такой же компилятор как и любой другой (исклюячая компиляторы для виртуальных машин). C++, Power Basic, Delphi - все компилируют по тому же принципу что и ассемблер. Разница только в том, что они кодируют последовательность операций, в отличие от ассемблера, привязанного к одной команде.
Чем он занимается?
Главное конечно преимущество - это автоматический подсчёт адресов. Т.е. он помнит длину каждой инструкции и для нахождения нужной складывает длины всех предыдущих.
Кроме того, на основании предыдущих данных, ассемблер делает выводы какой длины должен быть переход. Если ты знаешь, то переходы могут быть 3 типов: короткий, средний и длинный. Для каждого типа свои опкоды.
Ассемблер считает длину до искомого адреса и, в зависимости от неё, выбирает подходящий тип перехода.
Следующее, ассемблер упрощает запись непосредственных чисел.
Например из того же Абеля
B8/34/12/0/0 MOV EAX,&H1234
Не правда ли в машинных кодах несколько неудобно записать 16-ричное 1234 в 32-битный регистр? Во первых нужно прибавить недостающие нули(если длина источника меньше при длины приёмника), а а затем ещё и записать побайтно в обратном порядке.
Подгонка операндов.
При записи
MOV AX,[EAX]
ассемблер выбирает из своего списка подходящий по длине операнд:
MOV AX,WORD PTR [EAX]
Вроде бы ничего особенного, но опять же автоматизация кодирования.
Ну и самое главное конечно - это отвлечение от чисел в пользу символических имён.
Например во многих операциях с двумя операндами регистр EAX стоит особняком от других и имеет свои собственные коды для каждой операции:
add eax,1 5/1/0/0/0
add ecx,1 81/C1/1/0/0/0
add edx,1 81/C2/1/0/0/0
add ebx,1 81/C3/1/0/0/0
Но это не всё. При различных длинах операндов уже используются другие опкоды.
cmp ecx,edx 3B/CA
cmp ecx,1 81/F9/1/0/0/0
cmp ecx,[edx] 3B/A
cmp cx,sp 66/3B/CC
cmp cl,2 80/F9/2
Главный недостаток, как и у любого компилятора, это то что возможности ограничены фантазией людей, создававших ассемблер.
Но всё же я бы не рекомендовал программирование в машинных кодах на таких сложных процессорах как Intel. Его можно применять в менее сложных ИС. Хотя например тот же Крис Касперски со мной бы поспорил, но в конечном итоге он же хакер и ему нужно воевать с системой. Хотя может он и прав, кто знает
По поводу правил кодирования пока не могу дать описание. Сам ищу. Мой предыдущий ассемблер, хоть и работает правильно, но всё же работает не по правилам. Я наверное буду полностью переписывать движок на Power Basic.
PS: На будущее. Когда о чём то спрашиваешь не надо показывать свою крутизну. Можешь после.
А то отвечающий подумает что тебе его советы и нафиг не нужны.
По поводу вышесказанного вопросов нет, но вот последнее меня просто удивило
PS: На будущее. Когда о чём то спрашиваешь не надо показывать свою крутизну. Можешь после.
А то отвечающий подумает что тебе его советы и нафиг не нужны.
Перечитал весь этот топик, но так и не нашел ту фразу где бы я сказал что я крутой или что то, что могло бы навести на эту мысль...
Более того в твоем посте я нашел эту крутизну
Я никому не собирался ничего доказывать, я лишь излогал свою точку зрения, возможно она не правильна, тогда меня надо поправить, я прав?
ЗЫ: и не так уж давно я изучаю Ассемблер, что бы уже понтоваться... да и не понтовый человек то я...
Перечитал весь этот топик, но так и не нашел ту фразу где бы я сказал что я крутой или что то, что могло бы навести на эту мысль...
Ты с умным видом говорил глупые вещи. Если бы это меня не касалось, то я бы просто подумал о каше в твоей голове и промолчал. Но так как твои действия, может и не намеренно, подрывают мой авторитет (а, всё равно этот CyRax всё неправильно говорит), то разумеется я пресёк это. А что собственно ты от меня хотел? Чтобы ты меня поливал грязью, а я молчал при этом?
>да быстрее только уже машинные коды...
>Куда же еще гнаться то? CyRax блин скоростной >маньяк )
Возможно это тебя подорвало?
Заявляю, что я говорил без всякой крутости эти слова...
> freeloader,
> Не надо делать различия между ассемблером и >машинными кодами если ты этих различий не знаешь. >Да и воообще я писал не про скорость выполнения, >а про скорость ассемблирования. Перечитай >внимательно.
Неправдо ли, слова высоко летящей птицы?
Ни в каком посте я не поливал грязью тебя и не задавался этой целью...
Ей богу мне это надоело, а тебе нет?
Давай жить дружно!
И еще раз на последок, на wasm.ru я появлялся с такими глупыми вопросами, НО тем не менее по возможности мне старались все разъяснить и доказать или по крайней мере натолкнуть меня самого на какой либо вывод...
По поводу правил кодирования пока не могу дать описание. Сам ищу. Мой
предыдущий ассемблер, хоть и работает правильно, но всё же работает не по
правилам. Я наверное буду полностью переписывать движок на Power Basic.
CyRax? Я чего-то может не понял? Ты не знаешь как работает нормальный
ассемблер?
Тогда я очень удивлен!
По поводу метода: Я тебе хочу сказать что, таки, я имею исходники FASM
(похоже что они на FASM ) - если ты не в курсе что это за вещь, то я тебе
скажу. Это вполне нормальный ассемблер. (OpenSource, какой-то )
Я-то в ассемблере еще не настолько парю чтобы свои ассемблеры писать
Могу послать тебе, если надо. Весит всего 1Мб, вместе с руководством
(200Кб), примерами и своими исходниками под DOS, Windows и Linux (!!!)
PS:
Если еще кому надо... спрашивайте у того, кому я пошлю - с инетом напряг
CyRax, по-моему я его на www.wasm.ru скачал...
По поводу метода: Я тебе хочу сказать что, таки, я имею исходники FASM
(похоже что они на FASM ) - если ты не в курсе что это за вещь, то я тебе
скажу. Это вполне нормальный ассемблер. (OpenSource, какой-то )
Я-то в ассемблере еще не настолько парю чтобы свои ассемблеры писать
Могу послать тебе, если надо. Весит всего 1Мб, вместе с руководством
(200Кб), примерами и своими исходниками под DOS, Windows и Linux (!!!)
Нет, мне не надо. У меня есть куча мануалов от интела в формате PDF. В них всё есть. И даже очень непохо написано. Но тебе конечно их рановато читать.
ISpy,
Ну в общем случае (в общечеловеческой практике) верно. Хотя конечно для каждого свой подход. Правила лучше всё таки наверное в учебнике почитать. Просто мне влом.
Если что непонятно - спрашивай.
Только тем кто спрашивает я хочу подсказать некоторые советы по общению со мной.
1. Не надо меня грузить, это меня злит.
2. Не надо мне доказывать свою крутость. Я тоже человек и как все имею самолюбие. Если ты действительно так крут в этой области скажи свои ники на PowerBasic.com и MasmForum.com, я за тобой понаблюдаю.
3. Не надо переписывать мои примеры, а потом кричать что ты круче всех. Это просто скрыстое проявление эгоизма.
По поводу вопроса о форумах на английском языке, который задал ISpy, из своего опыта (это моё личное мнение) могу сказать что наилучшей производтиельности обучения можно добится именно так. Англичане и американцы - это только часть посетителей этих форумов. Эти форумы являются как бы межнациональными и ответ на свой вопрос очень часто можно получить от жителя другой страны. Ну и обучение английскому, хотя для меня это не актуально.
freeloader,
Ладно, завязываем. Есть вопросы - задавай, есть советы - советуй. Второе предпочтительней
CyRax, тогда я совсем не понял вот это твое изречение
По поводу правил кодирования пока не могу дать описание. Сам ищу. Мой предыдущий ассемблер, хоть и работает правильно, но
всё же работает не по правилам.
ISpy, тогда, IMHO, ты выучишь жаргонный "американский"
CyRax, тогда я совсем не понял вот это твое изречение
Ну вообще то оно сделано по правилам, только эти правила знали те, кто мне их подсказывал (ну и PB(затем MASM32)+WDasm10). Поэтому и ассемблер рабочий получился. После ознакомления с мануалами интела всё стало на свои места и оказалось гораздо проще чем я думал. Однако предыдущая практика оказалась неплохим подспорьем в усвоении полной картины кодирования операций.
В новый движок я собираюсь добавить инструкции сопроцессора и MMX. Про SSE-SSE3 подумаю, потому как вслепую кодировать их не хочется, а мой процессор эти инструкции не поддерживает.
Ну и собственно о цели этого движка. Как и предыдущий(на VB6) он разрабатывается не просто так, а для конкретной цели.
Если прошлый создавался для Local Assembler'а, то этот будет создан для нового полуязыка-полукалькулятора. Принцип таков. Будет TreeView со списком, сгрупированным по типам операций. Причём имена операций будут на русском языке. Выбираешь операцию из этого списка, а из другого операнды и добавляешь в некий третий список, который по сути и есть программа. Что то типа визуального ассемблера. Но раз слово "визуальный" уже используется Микрософтом для дизайна интерфейса, то наверное прийдётся подобрать другое слово.