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

Содержимое страницы недоступно на других языках.
Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
Обсуждение правки 193.201.100.154
Строка 47: Строка 47:
* не выводит ничего не экран.
* не выводит ничего не экран.
[[Участник:Gribozavr|Gribozavr]] 18:13, 12 января 2011 (UTC)
[[Участник:Gribozavr|Gribozavr]] 18:13, 12 января 2011 (UTC)

== Некорректная работа программы "пачать файла наоборот"? ==

Здравствуйте. Я набил программу "печать файла наоборот" и полазил в ней дебагером.
В функции <code>read_str:</code> регистр <code>%ecx</code> используется для подсчёта прочитанных байт. Этот регистр используется библиотечными функциями <code>malloc()</code> и <code>fgets()</code>. После их вызова <code>%ecx</code> содержит всё что угодно но не количество прочитанных байт. Тем не менее далее его содержимое сравнивается с размером выделенного буфера.

Хотя, как ни странно, программа работает. :)

P.S. Если в <code>%ecx</code> помещается всякий мусор, и программа всё равно работает, этот регистр можно вообще не использвать?

[[Служебная:Contributions/91.103.66.177|91.103.66.177]] 05:44, 1 апреля 2011 (UTC)

Версия от 05:44, 1 апреля 2011

Мне кажется, что лучше опустить информацию о количестве системных и пользовательских регистров. Поскольку совершенно не понятно, куда автор отнес регистры 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: регистр %ecx используется для подсчёта прочитанных байт. Этот регистр используется библиотечными функциями malloc() и fgets(). После их вызова %ecx содержит всё что угодно но не количество прочитанных байт. Тем не менее далее его содержимое сравнивается с размером выделенного буфера.

Хотя, как ни странно, программа работает. :)

P.S. Если в %ecx помещается всякий мусор, и программа всё равно работает, этот регистр можно вообще не использвать?

91.103.66.177 05:44, 1 апреля 2011 (UTC)[ответить]