Перейти к содержанию

Обсуждение:Ассемблер в Linux для программистов C

Содержимое страницы недоступно на других языках.
Добавить тему
Материал из Викиучебника — открытых книг для открытого мира
Последнее сообщение: 9 лет назад от Arbnos в теме «Правильное название языка - "Язык ассемблера"»

Рекурсия

[править]

Возможно стоит осветить момент с рекурсией подробнее. Я не сразу догадался почему она работает. Было не очевидно, что в стеке много одинаковых адрессов возврата и поэтому код части подпрограммы вычисляющей случай 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)Ответить