Общая информация

Деятельность:Студент

Пол:Женский

Отношения.

Друзья:Адриан Агрест. Ледибаг

Кот Нуар (ранее)

Маринетт(соперница)

Увлечения

Любит: Не любит:

Адриан Агрест Ледибаг

Лила Росси (итал. Lila Rossi; дубляж Лайла / Лила) - новая ученица коллежа "Франсуа Дюпон". Прибыла из Италии.

В эпизоде "Вольпина", после того, как Ледибаг унизила её перед Адрианом, она стала жертвой акумы. Девушка превращается в Вольпину, мастера иллюзий.

Внешность

Лила - итальянка среднего роста с загорелой кожей и оливково-зелёными глазами. У неё длинные каштановые волосы с прямой чёлкой, перевязанные оранжевой резинкой и две короткие пряди по бокам от лица, также перевязанные резинками.

На правой руке Лила носит три браслета из ткани. Они яркие и имеют зигзагообразный узор, который разделяет цвета. Сверху вниз: первый - вверху пурпурный, внизу гранатовый; второй - вверху оранжевый, внизу изумрудный; третий - вверху красный, внизу зелёный. Она носит коралловый кожаный жакет поверх тёмно-серого ромпера с V-образным вырезом и маленькими белыми точками. На ногах у неё светло-серые леггинсы и коричневые ботинки.

Как Вольпина, она скрывает своё лицо под оранжевой маской с чёрными краями. Волосы перевязаны чёрными резинками. На голове у Вольпины ненастоящие оранжевые ушки с белым и чёрным окрасом внутри. Цвет волос от корней чёрные переходят в каштановый, а кончики уже становятся белыми. На губах оранжевая помада. Кулон с лисьим хвостом висит у неё на шее. Её костюм оранжевый с белой секцией посередине. На бёдрах - пояс, напоминающий лисий хвост.

Её рукава и голени чёрные, на краях воротника чёрные линии, а подошвы белые с рисунком следа. Её оружие - длинная флейта с белыми и оранжевыми полосами.

Личность

Лила хитрая, гордая и общительная девушка, которая с лёгкостью заводит новые знакомства. Она любит внимание, которое иногда привлекает ложью. Она продолжает врать, даже если дело заходит уже дальше слов. Например, когда она покупает кулон, похожий на Камень Лисы, чтобы заставить Адриана поверить в то, что она - потомок супергероини. Ей не нравится, когда кто-то получает больше внимания и признания, чем она и не любит, когда кто-то раскрывает, что её ложь - неправда. Лила в некоторых случаях злопамятная, ведь всё еще злится на Ледибаг, которая опозорила её перед Адрианом. Но в душе она довольно чувствительная, это видно, когда она плакала от стыда и обиды. Она очень популярная, о ней говорил весь коллеж, она привыкла, что всё внимание уделяется ей.

Как у Вольпины, её личность почти не меняется, но доминирует желание отомстить Ледибаг. Она очень умна и убедительна, ведь заставляет Ледибаг и Кота Нуара поверить в то, что она - супергерой, останавливая метеорит, её иллюзию. Желая, чтобы Ледибаг страдала, Вольпина своими иллюзиями почти заставляет её отдать свои серьги два раза.

Отношения

В эпизоде "Вольпина" Лила лжет про то, что она и Ледибаг - друзья, но когда Ледибаг раскрывает эту ложь перед Адрианом и называет её лгуньей, Лила злится на неё. Когда Ледибаг извиняется, Лила не прощает её, говоря, что они никогда не будут друзьями. Вольпина также знает, что Ледибаг нравится Адриан, и она шантажирует Ледибаг, говоря, что сбросит Адриана, если та не отдаст свой Камень Чудес.

Адриан Агрест/Кот Нуар

Лила увлечена Адрианом, делая все, чтобы заполучить его. Она соврала ему, что она – супергероиня-лиса Вольпина, пытаясь так привлечь его внимание к себе. Когда Ледибаг опозорила ее перед Адрианом, Лила убегает, считая, что потеряла все шансы на встречу с ним. Первую вещь, которую она делает, будучи Вольпиной - это меняет картинку на билборде с Ледибаг на неё, спасающую Адриана с сердцем и стрелой на заднем плане. Она приходит домой к Адриану и пытается доказать ему, что она действительно супергероиня, как и говорила на свидании. Она раздражается, когда тот говорит, что это не было свидание, говоря, что лишь могло им стать. Позже, Вольпина пытается шантажировать Ледибаг, угрожая сбросить Адриана (на самом деле, это была иллюзия) с Эйфелевой башни.

Вольпина считает Кота Нуара просто заложником, но делает ему комплимент, говоря, что у него милый костюм.

Способности

Как злодей

Когда Вольпина играет на своей флейте, на её конце появляется оранжевый шарик энергии. Она может бросить этот шарик куда угодно, и на этом месте появляется любая иллюзия, начиная от нескольких копий себя и заканчивая огромным метеоритом или падающим зданием. Однако, иллюзии пропадают, как только их касаются.

Появления

Вольпина

По словам Томаса Астрюка, она может быть ещё одной владелецей Камней Чудес, а может и нет. Это информация позже не потвердилась, когда в октябре 2016 года было раскрыто настоящее имя Вольпины.Томас Астрюк отправил картинку персонажа, напоминающего Вольпину, в Twitter с подписью "Una ragazza italiana in Pariggi". Что в переводе: "Девушка из Италии в Париже".Когда пользователя Tumblr mylydy, которая работала над Miraculous, спросили появится ли Вольпина, она ответила "да и нет".Имя Вольпина похоже на латинское слово vulpine, что означает "напоминающий лису" или "хитрый".Вольпина также похоже на слово Volpe (итальянский - лиса.) Суффикс "-ina" означает "маленький" и часто используется в женских именах среди друзей, в виде прозвища или имени для домашних животных. В грубом переводе, "Вольпина" означает "Лисица" или "Маленькая Лиса" на итальянском.Другое слово, обозначающее группу лис-vulpini.Также существует лишайник Letharia vulpina, известный как Летария волчья или Летария лисья. Этот лишайник ядовит для лис и волков.Также в французском языке есть слово "volpone", означает старый лис (старая лиса) или проницательный человек.Как злодей, Лила использует флейту, как основное оружие. Также флейта была у Мелоди.Лила - единственный подросток женского пола, не появляющийся в опенинге.Лила - дочь дипломата.Во втором сезоне "Лила захочет заполучить сердце Адриана и стать популярной с помощью лжи и манипулирования всей школой".


Небольшое предисловие, которое должно было быть в самой первой статье по этой теме:
Я понятия не имею, как правильно проектировать процессоры. И как неправильно - тоже. Я просто играюсь в конструктор, делаю ошибки, перекраиваю схемы на лету и наслаждаюсь этим забавным и увлекательным процессом.
Перечитывая предыдущие части, я нахожу в них заметное количество косяков и откровенных глупостей. Скажем, я так и не определился с архитектурой процессора, вроде сначала задумав сделать что-то RISC-подобное, но временами замахиваясь на CISC, и огребая от сложности реализации откатывался обратно. В итоге же получается, что я во многом копирую единственную знакомую мне архитектуру x86.
Поэтому: эти статьи рассказывают о том, как делаю я, а не о том, как надо.

Но окей, перейду к делу.
Поскольку теперь у нас есть контроллер памяти и минимально необходимые для функционирования ядра схемы, нужно попытаться собрать их все вместе и оттестировать. Пока набор инструкций крайне мал, тестирование процессора можно производить так: подать ему на вход все возможные наборы инструкций и посмотреть, как он их обработает. При этом следует учесть, что большая часть ошибочных инструкций не отлавливается - подай мы на вход несуществующую команду или несовместимый набор параметров - процессор поведёт себя непредсказуемо. Но отлов ошибок оставляю на потом, сейчас важнее и интереснее проверить работу на корректном наборе инструкций.
Итак, как выглядит вся схема в сборе:

Не очень-то впечатляет =). Но если раскрыть схемы, и представить всё это добро вместе, получится вот так:

Клик для увеличения

Я не стал раскрывать все подсхемы (в которых, в свою очередь, есть ещё подсхемы) - по-моему и так внушительно. Даже Шмигирилову показать не стыдно.
Несколько комментариев к схеме.
- Выход Execute end сделан на будущее. В дальнейшем он будет сигнализировать о том, что процессор выполнил очередь команд и ждёт новых инструкций. Пока же все инструкции выполняются за один так, так что смысла в подобной сигнализации нет.
- Выход ERR - это зачатки системы контроля ошибок. Сейчас на него подаётся сигнал в единственной ситуации: если попытаться работать с памятью на ввод и вывод одной инструкцией (пример: MOV , ).
- В процессе отладки (который я ещё буду описывать) была найдена незначительная ошибка: в блоке команд не стояло несколько согласующих резисторов, отчего невозможны были операции с памятью. Эта ошибка присутствует на схемах, приведённых в предыдущей статье.
- Индикаторы, если кто ещё не догадался, показывают значения регистров и предназначены только для увеличения удобства.
- Память и ядро работают на одной частоте, несмотря на то, что тактовые генераторы у них разные. Теоретически, ничто не должно мешать работать им на разных частотах (если память будет работать быстрее - нужно будет ввести простенький механизм ожидания выполнения), но logisim не позволяет задавать разные частоты двум элементам.

Пожалуй, можно переходить к тестированию, которое, как решено выше, должно заключаться в передаче процессору всех вариантов корректных команд. Такой набор можно сгенерировать вручную, а можно - и даже нужно - написать ассемблер, переводящий читаемые команды в машинный код.
На реализацию этого ассемблера на PHP ушло около часа, побаловаться можно здесь Meighty assembler (название "Meighty" у меня получилось из объединения слов might и eight, так я и назвал свой процессор). Команды вводить в чёрное окошко, жать compile. При удачной трансляции слева от окна появится двоичный байткод, снизу - его шестнадцатеричное представление, которое можно копипастить в logisim (буквально, его компонент ОЗУ корректно воспримет вставку таких данных), при ошибке выдастся описание проблемы.

Клик для увеличения
Ассемблер имеет intel-like синтаксис, регистр значения не имеет, все лишние пробелы игнорируются. Числовые значения задаются только в шестнадцатеричной системе счисления, десятичная и двоичная, возможно, будут сделаны потом. Операнды перечисляются через запятую, и задаются следующим образом:
- константа: значение H , например 10H, FDH, 7h;
- регистр: идентификатор регистра от A до H ;
- порт: @номер порта H , например @03H, @88h;
- адрес в памяти: [адрес H] , например , , ;
Ассемблер пытается отлавливать ошибки, как синтаксические, так и логические, можете поиграться. Комментарии не реализованы. Порты, как понимаете, тоже отсутствуют, выполнение команд чтения-записи для них смысла не имеет.
Пример программы (абсолютно бессмысленной, её цель только продемонстрировать работу):
MOV A,10h
MOV B,A
SUM B,3h
MOV ,B
MOV C,
SHL ,2h
XOR A,
NOP
и т.д.
Меня КРАЙНЕ ломает делать гифку, которая продемонстрировала бы, что эта, да и все другие допустимые программы, выполняются корректно. Гифкоклепание займёт не меньше часа, так что предлагаю просто скачать logisim , взять мою схему и посмотреть всё самим.

Что дальше? Примерно вот что:
- реализация восьми дополнительных служебных регистров вдобавок к восьми имеющимся, которые останутся пользовательскими. Служебные регистры будут предназначены, прежде всего, для организации работ программ в памяти (требуется разделять код и данные - значит нужны аналоги CS и DS) и возможного её увеличения (для адресации за пределами двух килобайт можно ввести сегментацию, тогда понадобится регистр, указывающий на текущий сегмент), а также для выполнения команд условного перехода (команда будет сравнивать два определённых регистра), ну и давно задуманный флаговый регистр. Возможно - счётчик (это будет зависеть от того, как я реализую циклы).
- стек. Его я, как и было задумано ранее, всё-таки реализую на отдельной схеме - пусть будет хоть какое-то значимое отличие от x86. На реализацию четырёх стековых команд (стандартные POP, PUSH, не очень стандартная PEEK и совсем не стандартная POKE) понадобится всего один опкод (т.к. параметр у этих команд будет всегда один, два неиспользуемых бита можно отдать под команду).
- команды условного и безусловного перехода.
- дополнительные команды обработки данных (SUB, MUL, DIV, NOT).
- доработка ассемблера.
- отлов и обработка ошибок.
- ASCII-терминал.


Арифметические операции - ADD, SUB, MUL, DIV. Многие опкоды делают вычисления. Вы можете узнать многие из них по их названиям: add (addition - добавление), sub (substraction - вычитание), mul (multiply - умножение), div (divide - деление).

Опкод add имеет следующий синтаксис:

Add приемник, источник

Выполняет вычисление: приемник = приемник + источник.

Имеются также другие формы:

приемник источник пример
регистр регистр add ecx, edx
регистр память add ecx, dword ptr / add ecx,
регистр значение add eax, 102
память значение add dword ptr , 80
память регистр add dword ptr , edx

Эта команда очень проста. Она добавляет значение источника к значение приемника и помещает результат в приемник. Другие математические команды:

Sub приемник, источник (приемник = приемник - источник) mul множимое, множитель (множимое = множимое * множитель) div делитель (eax = eax / делитель, edx = остаток)

Поскольку регистры могут содержать только целочисленные значения (то есть числа, не, с плавающей запятой), результат деления разбит на частное и остаток. Теперь, в зависимости от размера источника, частное сохраняется в eax, а остаток в edx:

* = Например: если dx = 2030h, а ax = 0040h, dx: ax = 20300040h. Dx:ax - значение dword, где dx представляет старшее word, а ax - младшее. Edx:eax - значение quadword (64 бита), где старшее dword в edx и младшее в eax.

Источник операции деления может быть:

  1. 8-бит регистр (al, ah, cl,...)
  2. 16-бит регистр (ax, dx, ...)
  3. 32-бит регистр (eax, edx, ecx...)
  4. 8-бит значение из памяти (byte ptr )
  5. 16-бит значение из памяти (word ptr )
  6. a 32-бит значение памяти (dword ptr )

Источник не может быть непосредственным значением, потому что тогда процессор не сможет определить размер исходного операнда.

Логические операции с битами - OR, XOR, AND, NOT.Эти команды работают с приемником и источником, исключение команда "NOT". Каждый бит в приемнике сравнивается с тем же самым битом в источнике, и в зависимости от команды, 0 или 1 помещается в бит приемника:

AND (логическое И)устанавливает бит результата в 1, если оба бита, бит источника и бит приемника установлены в 1.

OR (логическое ИЛИ)устанавливает бит результата в 1, если один из битов, бит источника или бит приемника установлен в 1.

XOR (НЕ ИЛИ)устанавливает бит результата в 1, если бит источника отличается от бита приемника.

NOTинвертирует бит источника.

Mov ax, 3406d mov dx, 13EAh xor ax, dx ax = 3406 (десятичное), в двоичном - 0000110101001110. dx = 13EA (шестнадцатиричное), в двоичном - 0001001111101010.

Выполнение операции XOR на этими битами:

Источник = 0001001111101010 (dx) Приемник = 0000110101001110 (ax) Результат = 0001111010100101 (новое значение в ax)

Новое значение в ax, после выполнения команды - 0001111010100101 (7845 - в десятичном, 1EA5 - в шестнадцатиричном).

Другой пример:

Mov ecx, FFFF0000h not ecx FFFF0000 в двоичном это -

Если вы выполните инверсию каждого бита, то получите:

, в шестнадцатиричном это 0000FFFF

Значит после операции NOT, ecx будет содержать 0000FFFFh.

Увеличение/Уменьшение - INC/DEC.Есть 2 очень простые команды, DEC и INC. Эти команды увеличивают или уменьшают содержимое памяти или регистра на единицу. Просто поместите:

Inc регистр; регистр = регистр + 1 dec регистр; регистр = регистр - 1 inc dword ptr ; значение в будет увеличено на 1. dec dword ptr ; значение в будет уменьшено на 1.

Ещё одна команда сравнения - test.Команда Test выполняет операцию AND (логическое И) с двумя операндами и в зависимости от результата устанавливает или сбрасывает соответствующие флаги. Результат не сохраняется. Test используется для проверки бит, например в регистре:

Test eax, 100b jnz смещение

Команда jnz выполнит переход, если в регистре eax третий бит справа - установлен. Очень часто комманду test используют для проверки, равен ли регистр нулю:

Test ecx, ecx jz смещение

Команда jz выполнит переход, если ecx = 0.

Ничего не делающая команда - nop. Эта команда не делает абсолютно ничего (пустая команда). Она только занимает пространство и время. Используется для резервирования места в сегменте кода или организации программной задержки.

Обмен значениями - XCHG. Команда XCHG также весьма проста. Назначение: обмен двух значений между регистрами или между регистрами и памятью:

Mov eax , 237h mov ecx, 978h xchg eax, ecx

в результате:

Eax = 978h ecx = 237h

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

В результате выполнения инструкций ассемблера cmp и test меняется состояние флага нуля (ZF). Это все, что у них общего! Опасно считать эти инструкции похожими и тем более заявлять, что они обе выполняют сравнение. Под катом - основание столь дерзкого заявления:)

Почему вообще появилась эта статья. Постигаю азы ассемблера, читаю всякие источники. Когда первый раз узнал про команду cmp - это был разрыв шаблона! Утверждение, что при равенстве сравниваемых значений команда поднимает флаг нуля (ZF=1) для меня звучало, как парадокс. Позже разобрался, почему так. Потом читаю про якобы аналогичную команду test , и сказано в писании: в случае равенства сравниваемых значений сбрасывается флаг нуля! ЧОйРт побери, WTF?! Разобрался таки..

Важный момент: логика флага нуля (ZF). Он поднимается (равен единице), когда результат операции равен нулю, т.е. все биты результата - нулевые.

Инструкция cmp (сокр. от compare - сравнить) сравнивает два значения - регистр, память, непосредственное значение, - и устанавливает/сбрасывает флаг ZF. При этом процессор, получив инструкцию cmp, вычисляет разность указанных значений . Теперь должно быть понятно: если значения равны, то результат вычитания будет 0, следовательно поднимается флаг нуля (ZF=1). Пример:

Xor ax,ax ;обнуляем регистр mov ax,13d add ax,7 cmp ax,20d ;значения равны => их разность=0 => флаг ZF=1 jz someLabel ;переход будет выполнен

Примечание : инструкция cmp отличается от аналогичной sub (substraction - вычитание) тем, что влияет только на регистр флагов.

Инструкция test . Получив такую команду, процессор выполняет операцию AND (логическое И) с двумя операндами. Т.е. выполняется побитовое логическое умножение . Если логическое И выдаст только нули, тогда поднимается флаг ZF. Инструкция test так же влияет только на регистр флагов, в этом ее отличие от инструкции AND . Пример:

Xor ax,ax mov ax,0011b test ax,0010b ;результат будет не нулевой (второй бит будет равен 1) => ZF=0 jnz someLabel ;флаг нуля сброшен, будет переход

Выводы : во-первых, cmp и test влияют на флаг нуля противоположным образом. Во-вторых, команду test нельзя использовать для проверки равенства значений! Пример:

Mov eax,5 test eax,5 ;установит флаг ZF=0 jnz someLabel ;переход выполнится... test eax,4 ;так же установит флаг ZF=0 jnz someLabel ;переход опять выполнится

Сравниваем одинаковые/разные числа, а переход выполняется в любом случае! Если вместо test поставить cmp, то первый переход не выполнится. Почему такие странности с test? Смотрим запись чисел в двоичной СИ:
5 (10) =0101 (2)
4 (10) =0100 (2)

Результат инструкции test:
test 5,5: 0101 AND 0101=0101
test 5,4: 0101 AND 0100=0100

В результатах обоих операций есть биты равные единице, поэтому флаг нуля не понимается. Вот поэтому нельзя полагаться на такое сравнение значений.

Итак, команда test применяется для битовой проверки состояния флагов и т.п. Есть еще одно применение - проверка нулевого значения регистра:

test eax,eax
jz someLabel ;переход выполнится только если eax=0

Объяснил, как смог:) Сам долго не мог постичь логику, особенно считая, что test и cmp - похожие по назначению команды. Надеюсь, разница понятно изложена.