Обсуждение:Ассемблер в Linux для программистов C
Добавить темуРекурсия
[править]Возможно стоит осветить момент с рекурсией подробнее. Я не сразу догадался почему она работает. Было не очевидно, что в стеке много одинаковых адрессов возврата и поэтому код части подпрограммы вычисляющей случай n!=n*(n-1)! будет выполнятеся много раз, а не один.
Регистры
[править]Мне кажется, что лучше опустить информацию о количестве системных и пользовательских регистров. Поскольку совершенно не понятно, куда автор отнес регистры FPU,XMM,SSE и MSR-регистры. 158.250.33.187 10:51, 17 июня 2008 (UTC)
- Немного исправил. Так лучше? Gribozavr 12:27, 17 июня 2008 (UTC)
- Спасибо, стало на много лучше. 194.88.210.254 19:13, 17 июня 2008 (UTC)
Возможно я ошибаюсь, но, кажется, в разделе "Регистровая адресация" попутан порядок операндов у команды movl. --Xaionaro 09:38, 17 декабря 2008 (UTC)
Так же мне кажется, что в разделе "Команда lea" корректнее сказать не "вызовет ошибку при компиляции, так как $0x32 не является адресом", а "вызовет ошибку при компиляции, так как константа $0x32 не имеет адреса". --Xaionaro 09:48, 17 декабря 2008 (UTC)
- Нет, всё дело в том, что у команды lea источник не может быть непосредственным операндом. В документации Intel:
lea r32, m
- Тут используется синтаксис Intel, а не AT&T, lea назначение, источник. --Gribozavr 01:38, 11 мая 2009 (UTC)
Это, конечно, вообще никак не меняет логику кода, но в разделе "Конструкция switch", в "Этот код эквивалентен следующему коду на Си:", в "default" надо убрать "break;", ибо в ассемблерном коде в "case_default:" нет команды "jmp switch_end". --Xaionaro 16:02, 17 декабря 2008 (UTC)
Константы в двоичной системе счисления
[править]В разделе «Логическая арифметика» при описании команды test использована команда «testb $0b00001000, %al». 0b00001000 — это обозначение двоичного 00001000 что ли? Я, как изучавший в университете ANSI C и MASM 4, этого не знал и не сразу догадался. Если это так, то может стоит добавить объясняющий комментарий? 80.86.240.197 17:16, 6 мая 2009 (UTC)
- Да, это так. Добавил коментарий. --Gribozavr 11:43, 18 августа 2010 (UTC)
Intel-only?
[править]Мне совсем не понятно почему в этой статье используется Intel архетектура. На данный момент сушествуют другие очень популярные, такие как arm, mips. Возможно имеет смысл переименовать статью, добавивл слово Intel, или описать другие архитектуры(так как последним заниматься врятли кто будет, можно остановится на первом). [P.S. Говорить что Intel самая популярная смысла нет, наиболее часто если людям и приходится писать на ассебмлере, то как правило под иную архиектуру, типо arm, mips, пусть даже avr] А так очень хорошая статья, спасибо. 193.232.173.109 08:28, 28 июля 2010 (UTC)
- Вполне согласен, что и другие архитектуры забывать не стоит. Даже в текущем виде книга уже немного устарела, так как сейчас уже вполне популярны x86_64, а там очень много своей специфики. Хотелось бы придумать более стройную структуру книги: в каждом разделе сначала идёт общая информация для обоих архитектур, а затем абзацы, специфичные для 32 и 64 отмечены специальными значками.
- Переименовывать не хотелось бы, название вполне красиво звучит. А то может получиться «Ассемблер IA-32, x86_64 в Linux для программистов C с использованием синтаксиса gas в редакторе vim и оболочке bash» --Gribozavr 11:43, 18 августа 2010 (UTC)
Правка участника 193.201.100.154
[править]Здраствуйте! Вы добавили этот абзац в раздел про процедуры:
Существует также возможность реализовать вычисление факториала без функций:
movl $1, %eax /* Аккумулятор результата. 1 исходное значение, поскольку 0! = 1*/ movl $5, %ebx /* счетчик цикла, по совместительству - то самое (n - 1) */ loop_start: mull %ebx decl %ebx cmp $0, %ebx jne loop_start ret
Я не вижу в этом никакого смысла, так как:
- раздел про процедуры;
- этот кусок кода не демнстрирует ничего нового;
- не является самостоятельным;
- не выводит ничего не экран.
Gribozavr 18:13, 12 января 2011 (UTC)
Некорректная работа программы "пачать файла наоборот"?
[править]Здравствуйте. В функции read_str
:
не производится обнуления буфера после выделения malloc()
и realloc()
, что может повлечь ошибку. К сожалению я не знаю как правильнее вассемблере обнулять области памяти: через memset, или прямой инициализацией через цикл.
Alex Yu Yug 08:23, 1 апреля 2011 (UTC)
- Здравствуйте. В той программе не важно, что
malloc()
не заполняет нулями память. Проблема была в том, чтоread_str
неправильно восстанавливал%edi
. Исправил. --Gribozavr 20:54, 30 апреля 2011 (UTC)
Программа поиск наибольшего элемента в массиве и 64 бита.
[править]Приведенный пример не будет собираться на 64х битной системе.
Для строк 37 и 38 будет выдаваться сообщение 37: Error: invalid instruction suffix for `push'. 109.188.125.16 08:13, 22 мая 2015 (UTC)
Правильное название языка - "Язык ассемблера"
[править]«Язык ассемблера», а не «Ассемблер» (ассемблер — название программы-транслятора). 185.5.42.3 15:42, 2 октября 2015 (UTC)