docs: в README 1 лабы добавлена секция про ассемблеру
This commit is contained in:
@ -94,7 +94,27 @@ void set_input_mode()
|
|||||||
// нас в общем-то интересуют
|
// нас в общем-то интересуют
|
||||||
tcgetattr (STDIN_FILENO, &tattr);
|
tcgetattr (STDIN_FILENO, &tattr);
|
||||||
tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
|
tattr.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
|
||||||
tattr.c_cc[VMIN] = 1;
|
tattr.c_cc[VMIN] = 0;
|
||||||
|
tattr.c_cc[VTIME] = 0;
|
||||||
tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
|
tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Исправление ассемблерных вставок
|
||||||
|
|
||||||
|
Должен сказать, что я не большой поклонник "inline assembly". На мой субъективный взгляд намного лучше, читаемее и стабильнее добавлять ассемблер на этапе линковки. Это дает несколько приятных бонусов:
|
||||||
|
|
||||||
|
1. Код можно поддерживать на любимом ассемблере
|
||||||
|
2. Код ассемблера можно компилить отдельно
|
||||||
|
3. Код программы на C становится ощутимо чище (*лично на мой взгляд ассемблерные вставки плохо смотрятся в коде*), а также все макросы ассемблера не касаются кода на C
|
||||||
|
4. Меньше потенциальных ошибок из-за того, что вы что-то не так поняли и откомпилировалось все неправильно
|
||||||
|
|
||||||
|
Помимо прочего очень важный момент: я использую gcc для компиляции, а в отличие от clang, он довольно ленивый и наши строки для ассемблера в нетронутом виде отправятся прямо в текст программы, которая затем будет скормлена ассемблеру. Отсюда следует несколько нюансов:
|
||||||
|
|
||||||
|
- Стандартный ассемблер, используемый `gcc` - `as` и по умолчанию он использует синтаксис AT&T. Однако я не очень люблю этот синтаксис, предпочитаю работать с синтаксисом intel. Выхода тут 2:
|
||||||
|
- Дать компилятору флаг -masm=intel, после чего уже собственный ассемблер переключится на intel синтаксис
|
||||||
|
- В начале каждой ассемблерной вставки ставить ".intel_syntax noprefix", а после вставки но перед параметрами ставить ".att_syntax prefix". Это может периодически плохо работать
|
||||||
|
- При написании ассемблера необходимо соблюдать все переносы строк и при этом указывать это явно (поэтому в конце строк у меня и появляются `\n\t` - это поддержание табуляции и переноса строки
|
||||||
|
- Компилятору надо понимать, что будет происходить с переменными и регистрами во время ассемблерной вставки, поэтому и это тоже придется указать отдельно
|
||||||
|
|
||||||
|
Собственно видно, что есть ньансы, которые и заставляют меня сделать выбор в пользу обычного ассемблера и линковки, но раз лаба хочет, чтобы использовался именно inline, то будем использовать inline
|
||||||
|
|||||||
Reference in New Issue
Block a user