Здраствуйте!
Я действительно запутался в ваших словах так как они для меня не несут информативный характер в связи с незнакомой терминалогией. Решил как то создать методику по обучению самого себя с целью овладения Асма и в следствии написать книгу которая поэтапно будет объяснять всё что касается данного языка. Только я должен сделать эту книгу шедевром так как макулатуры достаточно. Приветсвуются люди вступающие в совместный проект по написанию бесцелера.
Начиная свой нелёгкий путь к постижению Ассемблера хотелось бы чтоб вы (более продвинутые) тоже закрепляли свои знания путём обсуждения трудноперевареемых сторон этого языка, и кто вообще только недавно узнал что ассм является самым актуальным среди высококвалифицированных программистов языком присоединяйтесь ко мне, будем учить его вместе. Так будет веселей.
В качестве начальной литературы я взял электронный вариант книги
Юрова В. И. - "Справочная система по языку ассемблера IBM PC"
которую можно скачать от сюда http://argumentation.narod.ru/assembl.rar
В отличии от полиграфического варианта она(как подсказал freeloader)
более компактна и несёт только реально нужные стороны и ненагружает кору головного мозга непонятными терминами (хотя последнии имеются,но я надеюсь что мы с вами вместе решим это всё без труда).
Скажим "бисмила аллах агбар" и начнем..........
16.5 кб (не сжатый). немного для делфи, не правда ли? Консольное правда и повыкинул лишние библиотеки (а нафиг они?).
Не знаю, практической пользы от него никакой, зато алгоритмы разрабатывать в нём просто до ужаса
Из главы "Программная модель микропроцессора"
я выясняю что самое главное устройство компьютера - микропроцессор имеет 16 пользовательских регистров(РОН) и 16 системных регистров.
далее идет описание пользовательских регистров.
Как пишет автор пользовательские регистры называются потому, что программист может использовать их при написании своих программ.
Далее идет описание регистров процессора которые как я понял, что, они мало могут сказать незная структуру памяти и в этой главе это не расматривается хотя такие понятия как сегмент, смещение употребляется часто. Остаётся в стороне как процессор обращается к памяти и что она вообще из себя представляет(что это последовательность пронумерованных ячеек это понятно только при чём здесь смещение,сегмент, база кадра стёка??????? по крайней мере для меня остаётся загадкой)
Вот она непоследовательная подача информации приводящяя к завихрению мыслей.
Ктонибудь сможет по человечески объяснить?
написать книгу которая поэтапно будет объяснять всё что касается данного языка.
А я лучше визуализатор напишу. Идея такова: есть TreeView, в котором по группам отсортированы русские представления мнемоник. Выбираешь мнемонику, операнды и добавляешь в список. Затем компилируешь и медитируешь
Это очень интересно...
Может раскажешь что из себя представляет плоская модель памяти? И какие еще модели бывают
Тебе более будет полезен при возникновении - Зубков...
3.3.2. Модели памяти и упрощенные директивы определения сегментов
Модели памяти задаются директивой .MODEL
.model модель,язык,модификатор
где модель — одно из следующих слов:
TINY — код, данные и стек размещаются в одном и том же сегменте размером до 64 Кб. Эта модель памяти чаще всего используется при написании на ассемблере небольших программ;
SMALL — код размещается в одном сегменте, а данные и стек — в другом (для их описания могут применяться разные сегменты, но объединенные в одну группу). Эту модель памяти также удобно использовать для создания программ на ассемблере;
COMPACT — код размещается в одном сегменте, а для хранения данных могут использоваться несколько сегментов, так что для обращения к данным требуется указывать сегмент и смещение (данные дальнего типа);
MEDIUM — код размещается в нескольких сегментах, а все данные — в одном, поэтому для доступа к данным используется только смещение, а вызовы подпрограмм применяют команды дальнего вызова процедуры;
LARGE и HUGE — и код, и данные могут занимать несколько сегментов;
FLAT — то же, что и TINY, но используются 32-битные сегменты, так что максимальный размер сегмента, содержащего и данные, и код, и стек, — 4 Мб.
Язык — необязательный операнд, принимающий значения C, PASCAL, BASIC, FORTRAN, SYSCALL и STDCALL. Если он указан, подразумевается, что процедуры рассчитаны на вызов из программ на соответствующем языке высокого уровня, следовательно, если указан язык C, все имена ассемблерных процедур, объявленных как PUBLIC, будут изменены так, чтобы начинаться с символа подчеркивания, как это принято в C.
Модификатор — необязательный операнд, принимающий значения NEARSTACK (по умолчанию) или FARSTACK. Во втором случае сегмент стека не будет объединяться в одну группу с сегментами данных.
После того как модель памяти установлена, вступают в силу упрощенные директивы определения сегментов, объединяющие действия директив SEGMENT и ASSUME. Кроме того, сегменты, объявленные упрощенными директивами, не требуется закрывать директивой ENDS — они закрываются автоматически, как только ассемблер обнаруживает новую директиву определения сегмента или конец программы.
Директива .CODE описывает основной сегмент кода
.code имя_сегмента
эквивалентно
_TEXT segment word public ’CODE’
для моделей TINY, SMALL и COMPACT и
name_TEXT segment word public ’CODE’
для моделей MEDIUM, HUGE и LARGE (name — имя модуля, в котором описан данный сегмент). В этих моделях директива .CODE также допускает необязательный операнд — имя определяемого сегмента, но все сегменты кода, описанные так в одном и том же модуле, объединяются в один сегмент с именем NAME_TEXT.
.stack размер
Директива .STACK описывает сегмент стека и эквивалентна директиве
STACK segment para public ’stack’
Необязательный параметр указывает размер стека. По умолчанию он равен 1 Кб.
.data
Описывает обычный сегмент данных и соответствует директиве
_DATA segment word public ’DATA’
.data?
Описывает сегмент неинициализированных данных:
_BSS segment word public ’BSS’
Этот сегмент обычно не включается в программу, а располагается за концом памяти, так что все описанные в нем переменные на момент загрузки программы имеют неопределенные значения.
.const
Описывает сегмент неизменяемых данных:
CONST segment word public ’CONST’
В некоторых операционных системах этот сегмент будет загружен так, что попытка записи в него может привести к ошибке.
.fardata имя_сегмента
Сегмент дальних данных:
имя_сегмента segment para private ’FAR_DATA’
Доступ к данным, описанным в этом сегменте, потребует загрузки сегментного регистра. Если не указан операнд, в качестве имени сегмента используется FAR_DATA.
.fardata? имя_сегмента
Сегмент дальних неинициализированных данных:
имя_сегмента segment para private ’FAR_BSS’
Как и в случае с FARDATA, доступ к данным из этого сегмента потребует загрузки сегментного регистра. Если имя сегмента не указано, используется FAR_BSS.
Во всех моделях памяти сегменты, представленные директивами .DATA, .DATA?, .CONST, .FARDATA и .FARDATA?, а также сегмент, описанный директивой .STACK, если не был указан модификатор FARSTACK, и сегмент .CODE в модели TINY автоматически объединяются в группу с именем FLAT — для модели памяти FLAT или DGROUP — для всех остальных моделей. При этом сегментный регистр DS (и SS, если не было FARSTACK, и CS в модели TINY) настраивается на всю эту группу, как если бы была выполнена команда ASSUME.
1. у тебя нет ни массивов, ни типа такого! У тебя есть только память как единый и сплошной кусок! В связи с этим w[k]:= - не пойдет, за тебя никто расчитывать ничего не станет
2. у тебя нет length - пиши сам
3. у тебя нет copy - пиши сам
4. тебя нет подобного рода циклов, есть бесконечные с условиями, т.е. юзай метки
5. у тебя нет условий, юзай условные переходы, те же метки
6. SplitEx:=w[index]; - тоже ерунда, возвращаться, впрочем как и приниматься в качестве параметров, в лучшем случае может только DWORD (Long)...
вроде на первый взгляд выполнимы все условия, только вот не знаю как без условий. и если нет условий, как сделать условные переходы? или ты имеешь в виду, что под одним if нельзя писать несколько операторов? тогда тоже реализуемо, хотя проблемы могут возникнуть, не исключаю.
падаю ) не зря же "тайно" написал. Ну думаю, что человека с таким большим опытом как ты нельзя переубедить, да и не нужно.
Просто я обожаю задачи олимпиадные, и решаю на паскале. решал бы на си-ну работали бы побыстрее, не большое дело, надо - переведу. а сплит на асме прикольно смотреть. как приятно, что можно эту всю хренотень не писать а написать просто split ))))))))))))))
2Sharp, ты несколько упростил алгоритм, разделитель может быть строкой, mov [ecx],0 - точно не сработает byte ptr указать забыл
Кстати о однопроходности - размер MyStack неизвестен, чтобы кзнать, надо пройти разок перед тем как выделить на него память...