Lab 2: Базовые команды и кодирование для процессора #2

Merged
mrqiz merged 21 commits from labs/02 into main 2024-09-22 18:15:51 +03:00
5 changed files with 120 additions and 0 deletions
Showing only changes of commit 995260cdde - Show all commits

View File

@ -74,11 +74,29 @@
NOTE: По какой-то причине это не указано в руководстве Intel, но по крайней мере если верить сайту, который я использовал для ассемблирования инструкций, то нужно обязательно учитыать префиксы к опкоду прежде чем начинать кодировать (опять же все по опыту):
1. `0x67` - ставится если команда **адресуется** при помощи 32-битных регистров
2. `0x66` - ставится, если программа иссользует хотя бы 1 16-битный регистр
1. `0x66` - ставится, если программа иссользует хотя бы 1 16-битный регистр
2. `0x67` - ставится если команда **адресуется** при помощи 32-битных регистров
Благо для 8-битных операций другие опкоды и хотя бы на них не надо префиксы запоминать)
## Примеры переводов
<!---потом тут появятся адекватные примеры-->
## Решение остальных пунктов
*В целом в этом репозитории лежат файлы, в которых я приложил пока еще не протестированное, но решение для первых нескольких пунктов. Однако в силу того, что память у нас 64-битная, а также я не могу залеть напрямую в видеопамять если не буду собирать модуль ядра. Возможно конечно от нечего делать я сделаю модуль ядра, который позволит выворачивать такие приколы, но это будет точно не на время этого курса.*
### 01 - простучать команды ассемблеру
Тут нечего сказать - есть просто колонка с коммандами и просят их использовать. Тут гугл в помощь.
А вот по поводу полей в команде могу сразу сказать - в 64 битном процессоре все это будет выглядеть немного иначе. Поэтому предлагаю 16-битные регистры заменить в команде на 64 битные и закодировать как для 64 разрядной системы. подробная инструкция как это бы надо бы сделать у меня приведена выше, поэтому тут не буду на этом останаваливаться.
### 02 - Пересылка массива при помощи loop и lea
`lea` - это сокращение от "load effective adress". Она использует использует классическую операцию обращения к памяти, но саму память не затрагивает, а просто записывает высчитанный адрес в переменную
<!--- Пока что я думаю эта инфа лишняя, может потом верну и раскомментирую
### Чутка про префикс REX