From acc1ada69cc3a8b0dfc4a5b730e758bfb8b62c86 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 12 Sep 2024 20:14:32 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=B2=20README=201=20=D0=BB=D0=B0?= =?UTF-8?q?=D0=B1=D1=8B=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=81=D0=B5=D0=BA=D1=86=D0=B8=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=20=D0=B0=D1=81=D1=81=D0=B5=D0=BC=D0=B1=D0=BB=D0=B5=D1=80?= =?UTF-8?q?=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01-asm-basics/README.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/01-asm-basics/README.md b/01-asm-basics/README.md index b0cd612..92b703e 100644 --- a/01-asm-basics/README.md +++ b/01-asm-basics/README.md @@ -94,7 +94,27 @@ void set_input_mode() // нас в общем-то интересуют tcgetattr (STDIN_FILENO, &tattr); 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); } ``` + +## Исправление ассемблерных вставок + +Должен сказать, что я не большой поклонник "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