Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
мне нужно перечитать С++ так уж исторически сложилось, что я долго говнокодил на ассемблере (не для интел) и если я хочу посмотреть какой-то тонкий момент в С++, я хочу смотреть в ассемблерный листинг я это 100500 раз делал, только в тех случаях язычок был не С++, а кое-какой пропиетарный язычок без рантайма, и архитектура была не интел, но в целом ничего не меняется не надо ржать, и такое бывает думаю пару десятков команд amd64 я осилю, чтоб читать то, во что преврвщаются простейшие и не очень С++ конструкции допустим я буду использовать Linux и архитектуру amd64 для своих изысканий первое, на что нужно обратить внимание в этом случае, это вот этот документ http://www.x86-64.org/documentation/abi.pdf оттуда нужна взять соглашения по вызовам функций ( как параметры передаютя, кто регистры какие должен сохранять и всякая такая фигня) но я вижу что то, что я вижу в книжне и то что в листинге не соответствует одно другому например возвращаемое значение типа инт или лонг в листинге передается через регистр %eax, а в книжке через %raх может это то же самое, но читать неудобно есть ли какая-нибудь дока нормальная по amd64 ABI в линуксе или может быть какая-то нормальная среда где удобно смотреть в листинг С++ компилятора и не ловит 100500 несоответствий между доками и листингом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 19:20 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годно я вижу что то, что я вижу в книжне и то что в листинге не соответствует одно другому например возвращаемое значение типа инт или лонг в листинге передается через регистр %eax, а в книжке через %raх может это то же самое, но читать неудобно соответсвует. мануал говорит автор3. If the class is INTEGER, the next available register of the sequence %rax, %rdx is used %eax - это младшая половина %rax int/long в исследуемом копмиляторе - 32 разряда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 20:36 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
ИзопропилНовый Годно я вижу что то, что я вижу в книжне и то что в листинге не соответствует одно другому например возвращаемое значение типа инт или лонг в листинге передается через регистр %eax, а в книжке через %raх может это то же самое, но читать неудобно соответсвует. мануал говорит автор3. If the class is INTEGER, the next available register of the sequence %rax, %rdx is used %eax - это младшая половина %rax int/long в исследуемом копмиляторе - 32 разряда вот смотри Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. возвращение 8 байт через %eax sizeof(long) == 8 байт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 20:59 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
черт это оптимизация вот так будет возврат через %rax как в книшке можно ее как-то отключть? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 1 .file "test.cpp" 2 .local _ZStL8__ioinit 3 .comm _ZStL8__ioinit,1,1 4 .globl xxx 5 .data 6 .align 8 7 .type xxx, @object 8 .size xxx, 8 9 xxx: 10 0000 19000000 .quad 25 10 00000000 11 .text 12 .globl _Z3foov 13 .type _Z3foov, @function 14 _Z3foov: 15 .LFB971: 16 .cfi_startproc 17 0000 55 pushq %rbp 18 .cfi_def_cfa_offset 16 19 .cfi_offset 6, -16 20 0001 4889E5 movq %rsp, %rbp 21 .cfi_def_cfa_register 6 22 0004 488B0500 movq xxx(%rip), %rax 22 000000 23 000b 5D popq %rbp 24 .cfi_def_cfa 7, 8 25 000c C3 ret 26 .cfi_endproc 27 .LFE971: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 21:18 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
зато я догадываюсь теперь как делается каст из лонг в инт просто movl <лонг value>, % еax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 21:29 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
извинити мне хочется ругаться матом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 21:32 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Год, зачем грустить? movl $25,%eax заполняет нулями старшие разряды %rax movq $25,%rax - инструкция на байт длиннее с++ не виноват, изучай систему команд ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 21:36 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
разве это не должно от компилятора больше зависить? какая-нибудь версия компилятора может и длину поменять.. вот например для андройда wchar то же самое что и char. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 21:39 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Изопропилзачем грустить? movl $25,%eax заполняет нулями старшие разряды %rax movq $25,%rax - инструкция на байт длиннее с++ не виноват, изучай систему команд да понятно все это есть референс на минимальный полезный набор команд? что-то вроде Principles of Operations для zSeries не нужно. я же не на ассемблере писать собрался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 21:41 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
alexy_blackразве это не должно от компилятора больше зависить? у топикстартера sizeof(long)==8 - медитировать не над чем. ему не нравится как работает команда movl $25,%eax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 21:42 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
alexy_blackразве это не должно от компилятора больше зависить? какая-нибудь версия компилятора может и длину поменять.. вот например для андройда wchar то же самое что и char. System V Application Binary Interface это вроде стандартная вещь для всех компиляторов надеюсь люди образумились и сделали общий call stack а в общем случае ты даже не представляешь, какой там п....ц не то что компиляторы, даже приложения могут различаться по тому, как устроен call stack надеюсь люди образумились и больше так не делают ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 21:50 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Изопропилalexy_blackразве это не должно от компилятора больше зависить? у топикстартера sizeof(long)==8 - медитировать не над чем. ему не нравится как работает команда movl $25,%eax мне все нравится но все-таки предпочел бы чтоб регистры одинаково назывались и компилер генерил бы код без оптимизации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 21:53 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годно все-таки предпочел бы чтоб регистры одинаково назывались eax - часть rax как они могут одинаково называться? да система команд прошла две модификации 8086- 80386 - x64 выглядит страшненько благодаря модификаторам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 21:57 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
ИзопропилНовый Годно все-таки предпочел бы чтоб регистры одинаково назывались eax - часть rax как они могут одинаково называться? да система команд прошла две модификации 8086- 80386 - x64 выглядит страшненько благодаря модификаторам посоветуешь quick start tutorial? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 21:59 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годи компилер генерил бы код без оптимизации заслать константу в rax выбрав одну из возможных команд (да -вот такая печалька , для выполнения одного и того же элементарного действия могут использоваться разные команды) хорошая иллюстрация момента, где "здравый смысл" подводит Intel® 64 and IA-32 Architectures Optimization Reference Manual3.5.1.1 Use of the INC and DEC Instructions The INC and DEC instructions modify only a subset of the bits in the flag register. This creates a dependence on all previous writes of the flag register. This is especially problematic when these instructions are on the critical path because they are used to change an address for a load on which many other instructions depend. Assembly/Compiler Coding Rule 33. (M impact, H generality) INC and DEC instructions should be replaced with ADD or SUB instructions, because ADD and SUB overwrite all flags, whereas INC and DEC do not, therefore creating false dependencies on earlier instructions that set the flags. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 22:03 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годкомпилер генерил бы код без оптимизации да ладно! а оптимизировать руками потом? )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 22:04 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годпосоветуешь quick start tutorial? не посоветую.... когда интересно (бывает такое) смотрю толстые интеловские мануалы http://www.intel.ru/content/www/ru/ru/processors/architectures-software-developer-manuals.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 22:09 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
ИзопропилНовый Годи компилер генерил бы код без оптимизации заслать константу в rax выбрав одну из возможных команд (да -вот такая печалька , для выполнения одного и того же элементарного действия могут использоваться разные команды) хорошая иллюстрация момента, где "здравый смысл" подводит Intel® 64 and IA-32 Architectures Optimization Reference Manual3.5.1.1 Use of the INC and DEC Instructions The INC and DEC instructions modify only a subset of the bits in the flag register. This creates a dependence on all previous writes of the flag register. This is especially problematic when these instructions are on the critical path because they are used to change an address for a load on which many other instructions depend. Assembly/Compiler Coding Rule 33. (M impact, H generality) INC and DEC instructions should be replaced with ADD or SUB instructions, because ADD and SUB overwrite all flags, whereas INC and DEC do not, therefore creating false dependencies on earlier instructions that set the flags. ну значит компилеры не должны использовать INC and DEC Instructions, а вместо этого должны использовать ADD and SUB на уровень ниже в микрокоде тоже полно такой фигни например сдвиг влево и и умжодение на 2 это одно и то же но речь то не об етом, речь про С++! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 22:17 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годно речь то не об етом, речь про С++! так что тебе не нравится в кодогенераторе? команды генеримые не всегда понятны и очевидны? а ведь он может вообще остановиться на фазе генерации промежуточного представления - LLVM, например ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 22:23 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
alexy_blackНовый Годкомпилер генерил бы код без оптимизации да ладно! а оптимизировать руками потом? )) я знаю лично только 1 человека, который занимался вы подобными вещами еще с парочкой переписывался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 22:24 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
ИзопропилНовый Годно речь то не об етом, речь про С++! так что тебе не нравится в кодогенераторе? команды генеримые не всегда понятны и очевидны? а ведь он может вообще остановиться на фазе генерации промежуточного представления - LLVM, например мне все нравится нужен только quick start tutorial нихачу читать все комманды ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 22:26 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годнужен только quick start tutorial нихачу читать все комманды цель то какова? просто посмотреть на порождение - общих знаний достаточно. детально разбирать - мануалы придётся раскурить, распухла система команд, нечеловеческой стала интринсики пописать - третье кодогенератор свой писать (кодеки иногда балуются кодогенераций на лету) - четвёртое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 22:39 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
ИзопропилНовый Годнужен только quick start tutorial нихачу читать все комманды цель то какова? просто посмотреть на порождение - общих знаний достаточно. детально разбирать - мануалы придётся раскурить, распухла система команд, нечеловеческой стала интринсики пописать - третье кодогенератор свой писать (кодеки иногда балуются кодогенераций на лету) - четвёртое цель -- просто посмотреть только там невсегда команды из доки используются поэтому нужен еще какой-то набор знать интринсике это же просто ассемблерная вставка, да? типа TYPE __sync_val_compare_and_swap(TYPE *ptr, TYPE oldval, TYPE newval); ? нет не надо эту хрень ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 22:46 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годтолько там не всегда команды из доки используются поэтому нужен еще какой-то набор знать это проблема конкретной доки. Недокументированных команд не так много ( и то они больше к ring0 относятся) в листинге кроме машинных команд попадаются директивы ассемблера (и всякие таблички для корректной свёртки стека при исключениях) Новый Годинтринсике это же просто ассемблерная вставка, да? не совсем - https://software.intel.com/sites/landingpage/IntrinsicsGuide/ Новый Год TYPE__sync_val_compare_and_swap(TYPE *ptr, TYPE oldval, TYPE newval); это просто функция со вполне очевидной семантикой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 22:57 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Год TYPE__sync_val_compare_and_swap(TYPE *ptr, TYPE oldval, TYPE newval); это просто функция со вполне очевидной сcdfмантикой[/quote] это 1 атомарная инструкция "сравнение с обменом" она просто выглядит как функция чтоб С++ программеры не нервничали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 23:20 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годэто 1 атомарная инструкция "сравнение с обменом" сильно зависит от CPU и TYPE, повезёт - отинланится в одну инструкцию типа CMPXCHG или CMPXCHG8B или CMPXCHG16B а может и в рантайм библиотеке быть реализованной Новый Годона просто выглядит как функция чтоб С++ программеры не нервничали один программер сильно нервничает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 23:35 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годэто 1 атомарная инструкция "сравнение с обменом" она просто выглядит как функция чтоб С++ программеры не нервничали У GCC она выглядит чуть иначе: https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2016, 23:37 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Из тех компиляторов, что я видел, гнус генерит самый укуренный код. Самое интересное, что даже на ровном месте умудряется засунуть ненужные инструкции. Причем больше это относится к неоптимизированному коду. Может потом меньше остается ? =) Пример1. Две страницы текста из одной строки Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. Пример2. Уже явным ассемблером написано, что надо, нет мы создаем локальные переменные. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. Если же код посложнее, сам черт ногу сломит. Как получить результат: >gcc -c -g Rem.c >objdump -d -M intel -S Rem.o > Rem.asm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2016, 11:27 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
SiemarglПример2. Уже явным ассемблером написано, что надо, нет мы создаем локальные переменные. >gcc -c -g Rem.c Ну так включите оптимизацию, что ли )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2016, 13:57 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Дело в том, что в ассемблер мне больше приходится лезть на этапе отладки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2016, 18:57 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
SiemarglДело в том, что в ассемблер мне больше приходится лезть на этапе отладки. а с какой целью? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2016, 19:15 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
ИзопропилSiemarglДело в том, что в ассемблер мне больше приходится лезть на этапе отладки. а с какой целью?С самой тривиальной. Отлавливание багов в местах, где солнце не светит нет возможности использовать полноценный отладчик с исходным кодом. Или когда сейчас отлаживаю компилятор/libc. Надо смотреть взаимодействие ABI ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 00:19 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
тест на понимание rvalue и lvalue в выражении x = q; q реально получается rvalue потому что присваивание через временный регистр происходит movl -8(%rbp), %eax movl %eax, -4(%rbp) -- присваивание значения из %eax, в памяти его нет а что нет чтоли команды копирования из памяти в память? %rbp это типа базовый регистр для адресации автоматических переменных удобно кстати сделали курица довольна это команда бы примерно так выглядела если бы было копирование из памяти в память (ето я с мейнфреймовкой команды MVC синтаксис содрал ) толко тут смещение положительное а в инеловских командах отрицательное MVC 4(4,%rbp),8(%rbp) тогда тут было бы и 4(4,%rbp) и 8(%rbp) оба lvalue в термнологии С++ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. то есть как в С++ правильно считать x = q; -- справа это lvalue или rvalue или это зависит от ассемблера? то есть если через временный регистр -- rvalue если из памяти в память -- lvalue или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 02:44 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Siemargl, на всякий случай встряну, ногами не пинать - дебажный ассемблерный код отличается от релизного. Собственно, перед оптимизацией etc, смотреть надо в релизный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 06:46 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годтест на понимание rvalue и lvalue в выражении x = q; q реально получается rvalue потому что присваивание через временный регистр происходит movl -8(%rbp), %eax movl %eax, -4(%rbp) -- присваивание значения из %eax, в памяти его нет а что нет чтоли команды копирования из памяти в память? нет такой команды Новый Год%rbp это типа базовый регистр для адресации автоматических переменных удобно кстати сделали курица довольнаэто регистр для работы со стеком читай учебник по ассемблеру 8086, да хоть Абеля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 07:52 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Интересно, что скажет ТС, когда увидит fpu,mmx,axvx, etc =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 09:12 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
CEMbSiemargl, на всякий случай встряну, ногами не пинать - дебажный ассемблерный код отличается от релизного. Собственно, перед оптимизацией etc, смотреть надо в релизный. а при включении оптимизации вполне можно и не узнать исходный код. так что нечего плакать, что в дебаг режиме под все переменные память выделяется, даже если на регистрах переменная остаётся.живёт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 10:39 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
m_Slaэто регистр для работы со стеком прочитать для чего регистр я сам могу главное что локальная переменная выглядит как смещение от rbp она в стеке конечно но это мне не особо важно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 12:03 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
SiemarglИнтересно, что скажет ТС, когда увидит fpu,mmx,axvx, etc =) мне это не надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 12:05 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годглавное что локальная переменная выглядит как смещение от rbp она в стеке конечно но это мне не особо важно можно адресовать и от SP, не удивляйся если увидишь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 12:08 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годв выражении x = q; q реально получается rvalue потому что присваивание через временный регистр происходит В машинном коде нет r-value. Там все l-value. R-value это артефакт языков высокого уровня, обозначающий значение, чье расположение в памяти не контролируется программистом. Это не строгое определение, но для этого топика сойдет. Конкретно при этом присвоении вводится промежуточная переменная, потому что это технически необходимо для генерации кода, а не потому что это требование языка высокого уровня. Поэтому никакое это не r-value ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2016, 14:40 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый ГодSiemarglИнтересно, что скажет ТС, когда увидит fpu,mmx,axvx, etc =) мне это не надоА компилятору ваше мнение не интересно. Он вполне может нагенерить и mmx, и sse. Так что придется смотреть ВСЕ команды. Или просто забить на это :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 13:05 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
m_SlaНовый Год а что нет чтоли команды копирования из памяти в память? нет такой командыА как же movs? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 13:09 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Barlonem_Slaпропущено... нет такой командыА как же movs? :)сразу два регистра использует si и di ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 13:27 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
m_Slaсразу два регистра использует si и di это никак не мешает считать, что команда существует. проблема в том, что на некоторых процессорах интел команда работала не шибко быстро да и два регистра занимать, которые ещё и загрузить нужно - собственно поэтому и не наблюдаем её в результатах работы c/c++ компиляторов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 16:53 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
если ассемблерной командой копировать из памяти в память где-то в микрокоде все равно будет промежуточная переменная так что a = b использует дополнительную переменную всегда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 17:53 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Годесли ассемблерной командой копировать из памяти в память где-то в микрокоде все равно будет промежуточная переменная так что a = b использует дополнительную переменную всегда если один из операндов регистр - накойхер доп память? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 19:07 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
ИзопропилНовый Годесли ассемблерной командой копировать из памяти в память где-то в микрокоде все равно будет промежуточная переменная так что a = b использует дополнительную переменную всегда если один из операндов регистр - накойхер доп память? если один из операндов регистр -- то не нужно если 2 операнда память -- то нужно считать из памяти куда-то и записать по другому адресу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 21:50 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
плавно перешли к обсуждению микроархитектуры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 21:57 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Изопропилплавно перешли к обсуждению микроархитектуры? не ну нафиг я больше не буду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2016, 22:42 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Старина Торвальдс разразился кирпичами по поводу GCC. Вот такие дела. Что такое "вытеснение константы" - я честно говоря не понял. Кто знает - прошу прояснить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 00:33 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
maytonСтарина Торвальдс разразился кирпичами по поводу GCC. Вот такие дела. Что такое "вытеснение константы" - я честно говоря не понял. Кто знает - прошу прояснить. move $load_balance_mask, -136(%rbp) #, %sfp $load_balance_mask это видимо константа, надо в исходники смотреть ее не надо в стек записывать, а надо непосредственно использовать $load_balance_mask в ассемблерных командах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 00:54 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
а ну да вот Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. должно было быть move $load_balance_mask,%rax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 01:16 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
тоесть movq $load_balance_mask,%rax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 01:16 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
maytonСтарина Торвальдс разразился кирпичами по поводу GCC. Вот такие дела. Что такое "вытеснение константы" - я честно говоря не понял. Кто знает - прошу прояснить. Вообще-то он года два назад разразился на эту тему Если это что-то новое, то для приличия не мешало бы ссылку на то что просите прокомментировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 01:58 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Ага точно. От 2014 года. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 08:36 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Новый Года ну да вот Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. должно было быть move $load_balance_mask,%rax По моему ошибка не в этом, а в movq %r8, -200(%rbp) Т.к под локальные переменные выделено меньше: subq $184, %rsp Но да, баян. Хотя повторюсь про укуренный компилятор ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 16:05 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Siemargl, а я вот посмотрел на асм-сорцы которые генерит gcc для Card-Rayrtracer и остался очень доволен. Там кругом одни xmm регисты а я хотел лезть туда грязными руками и форсировать оптимизацию векторного умножения. Ха... наивняк... Хотя возможно руку можно приложить. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 16:25 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
mayton, XMM тоже медленные операции, AVX быстрее, хотя тут компилятор справится с выбором. На stackoverflow пробегало сравнение в 500 раз разницы. А вот руку надо прикладывать, чтобы параллельно несколько трасс считать. Компилятор сам этого не сделает, руками надо по другому циклы организовывать было. В такую параллелизацию компилятором я пока не верю для нетривиальных случаев. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 17:00 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Siemargl, кажется эту штуку я ищу FMA (Fused-Multiply-Add) http://stackoverflow.com/questions/15933100/how-to-use-fused-multiply-add-fma-instructions-with-sse-avx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 17:36 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
maytonSiemargl, кажется эту штуку я ищу FMA (Fused-Multiply-Add) http://stackoverflow.com/questions/15933100/how-to-use-fused-multiply-add-fma-instructions-with-sse-avx Да, с подобным поведением я тоже сталкивался. Суть проблемы - чтобы не допустить ошибку округления даже порядка 1E-7, компилятор обычно генерит интрисинк функцию, которая считает медленнее раз в 50. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 17:49 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
SiemarglНовый Года ну да вот Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. move $load_balance_mask,%rax По моему ошибка не в этом, а в movq %r8, -200(%rbp) Т.к под локальные переменные выделено меньше: subq $184, %rsp Но да, баян. Хотя повторюсь про укуренный компилятор ) туда можно писать, 128 байт за stack pointer авторThe red-zone is a feature described in the x86-64 ABI. It is a 128 byte long region located directly below the stack pointer. This region is free-for-use for the compiler without the requirement to notify the application / the os or any running interrupt handler. For user applications there is no issue as interrupts and other kernel related code won't interfere with the user stack. In your kernel however things can get ugly, especially so if you have nested interrupts and no red-zone support. Imagine running inside your interrupt handler, gcc puts some data inside the red zone, a nested interrupt occurs and clobbers the red-zone or vice versa. To get around this the red-zone can be disabled by passing -mno-red-zone to GCC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 22:04 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
Тогда в коде вообще нет ошибки, если только это крайняя (leaf) функция. Ясно, https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61904 - это ядро и в нем нельзя использовать red zone Вот пример использования и неиспользования http://stackoverflow.com/questions/13201644/why-does-the-x86-64-gcc-function-prologue-allocate-less-stack-than-the-local-var Кстати, это уже с оптимизацией -О1 и код по прежнему ужасен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 23:09 |
|
||
|
Call stack, assembler listing
|
|||
|---|---|---|---|
|
#18+
а где ассемлерные директивы описаны? вот эти .cfi_startproc .cfi_def_cfa_offset 16 .cfi_def_cfa_register 6 или вот это: автор196 .weak _ZTV1B 197 .section .rodata._ZTV1B,"aG",@progbits,_ZTV1B,comdat 198 .align 32 199 .type _ZTV1B, @object 200 .size _ZTV1B, 40 201 _ZTV1B: 202 0000 00000000 .quad 0 202 00000000 203 0008 00000000 .quad _ZTI1B 203 00000000 204 0010 00000000 .quad _ZN1B3fooEv 204 00000000 205 0018 00000000 .quad _ZN1BD1Ev 205 00000000 206 0020 00000000 .quad _ZN1BD0Ev 206 00000000 я понимаю, что последнее -- это табличка виртуальных функций но вот читать несколько напряжно когда слов не знаешь туториал бы какой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2016, 23:55 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2018495]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
67ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
90ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 209ms |

| 0 / 0 |
