powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Call stack, assembler listing
65 сообщений из 65, показаны все 3 страниц
Call stack, assembler listing
    #39255025
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне нужно перечитать С++

так уж исторически сложилось, что я долго говнокодил на ассемблере (не для интел)
и если я хочу посмотреть какой-то тонкий момент в С++, я хочу смотреть в ассемблерный листинг
я это 100500 раз делал, только в тех случаях язычок был не С++, а кое-какой пропиетарный язычок без рантайма, и архитектура была не интел, но в целом ничего не меняется
не надо ржать, и такое бывает

думаю пару десятков команд amd64 я осилю, чтоб читать то, во что преврвщаются простейшие и не очень С++ конструкции

допустим я буду использовать Linux и архитектуру amd64 для своих изысканий
первое, на что нужно обратить внимание в этом случае, это вот этот документ
http://www.x86-64.org/documentation/abi.pdf

оттуда нужна взять соглашения по вызовам функций ( как параметры передаютя, кто регистры какие должен сохранять и всякая такая фигня)

но я вижу что то, что я вижу в книжне и то что в листинге не соответствует одно другому
например возвращаемое значение типа инт или лонг в листинге передается через регистр %eax, а в книжке через %raх
может это то же самое, но читать неудобно


есть ли какая-нибудь дока нормальная по amd64 ABI в линуксе или может быть какая-то нормальная среда где удобно смотреть в листинг С++ компилятора и не ловит 100500 несоответствий между доками и листингом?
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255039
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годно я вижу что то, что я вижу в книжне и то что в листинге не соответствует одно другому
например возвращаемое значение типа инт или лонг в листинге передается через регистр %eax, а в книжке через %raх
может это то же самое, но читать неудобно
соответсвует. мануал говорит автор3. If the class is INTEGER, the next available register of the sequence %rax,
%rdx is used

%eax - это младшая половина %rax
int/long в исследуемом копмиляторе - 32 разряда
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255042
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилНовый Годно я вижу что то, что я вижу в книжне и то что в листинге не соответствует одно другому
например возвращаемое значение типа инт или лонг в листинге передается через регистр %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.
#include <iostream>

long foo()
{
    return 25;
}

main(int argc, char *argv[])
{
    std::cout << sizeof(long) << std::endl;
    return foo();
}


ak@ak:~/cplusplus/test$ ./a.out 
8


ak@ak:~/cplusplus/test$ g++  -Wa,-ahl test.cpp


   1                    .file   "test.cpp"
   2                    .local  _ZStL8__ioinit
   3                    .comm   _ZStL8__ioinit,1,1
   4                    .text
   5                    .globl  _Z3foov
   6                    .type   _Z3foov, @function
   7                _Z3foov:
   8                .LFB971:
   9                    .cfi_startproc
  10 0000 55            pushq   %rbp
  11                    .cfi_def_cfa_offset 16
  12                    .cfi_offset 6, -16
  13 0001 4889E5        movq    %rsp, %rbp
  14                    .cfi_def_cfa_register 6
   15 0004 B8190000      movl    $25, %eax 
  15      00
  16 0009 5D            popq    %rbp
  17                    .cfi_def_cfa 7, 8
  18 000a C3            ret
  19                    .cfi_endproc


возвращение 8 байт через %eax
sizeof(long) == 8 байт
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255048
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
черт это оптимизация
вот так будет возврат через %rax как в книшке
можно ее как-то отключть?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include <iostream>
long xxx = 25;
long foo()
{
    return xxx;
}

main(int argc, char *argv[])
{
    std::cout << sizeof(long) << std::endl;
    return foo();
}


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:
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255052
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зато я догадываюсь теперь как делается каст из лонг в инт
просто movl <лонг value>, % еax
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255056
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извинити мне хочется ругаться матом
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255057
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Год,
зачем грустить?
movl $25,%eax заполняет нулями старшие разряды %rax
movq $25,%rax - инструкция на байт длиннее

с++ не виноват, изучай систему команд
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255058
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
разве это не должно от компилятора больше зависить? какая-нибудь версия компилятора может и длину поменять.. вот например для андройда wchar то же самое что и char.
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255059
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилзачем грустить?
movl $25,%eax заполняет нулями старшие разряды %rax
movq $25,%rax - инструкция на байт длиннее

с++ не виноват, изучай систему команд

да понятно все это
есть референс на минимальный полезный набор команд?

что-то вроде Principles of Operations для zSeries не нужно. я же не на ассемблере писать собрался
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255060
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackразве это не должно от компилятора больше зависить?
у топикстартера sizeof(long)==8 - медитировать не над чем.

ему не нравится как работает команда movl $25,%eax
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255062
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackразве это не должно от компилятора больше зависить? какая-нибудь версия компилятора может и длину поменять.. вот например для андройда wchar то же самое что и char.

System V Application Binary Interface это вроде стандартная вещь для всех компиляторов
надеюсь люди образумились и сделали общий call stack

а в общем случае ты даже не представляешь, какой там п....ц
не то что компиляторы, даже приложения могут различаться по тому, как устроен call stack
надеюсь люди образумились и больше так не делают
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255063
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилalexy_blackразве это не должно от компилятора больше зависить?
у топикстартера sizeof(long)==8 - медитировать не над чем.

ему не нравится как работает команда movl $25,%eax

мне все нравится
но все-таки предпочел бы чтоб регистры одинаково назывались
и компилер генерил бы код без оптимизации
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255067
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годно все-таки предпочел бы чтоб регистры одинаково назывались
eax - часть rax
как они могут одинаково называться?

да система команд прошла две модификации 8086- 80386 - x64
выглядит страшненько благодаря модификаторам
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255068
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилНовый Годно все-таки предпочел бы чтоб регистры одинаково назывались
eax - часть rax
как они могут одинаково называться?

да система команд прошла две модификации 8086- 80386 - x64
выглядит страшненько благодаря модификаторам
посоветуешь quick start tutorial?
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255069
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годи компилер генерил бы код без оптимизации
заслать константу в 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.
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255070
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годкомпилер генерил бы код без оптимизации да ладно! а оптимизировать руками потом? ))
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255072
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годпосоветуешь quick start tutorial?
не посоветую....

когда интересно (бывает такое) смотрю толстые интеловские мануалы
http://www.intel.ru/content/www/ru/ru/processors/architectures-software-developer-manuals.html
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255076
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилНовый Годи компилер генерил бы код без оптимизации
заслать константу в 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 это одно и то же

но речь то не об етом, речь про С++!
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255077
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годно речь то не об етом, речь про С++!
так что тебе не нравится в кодогенераторе?
команды генеримые не всегда понятны и очевидны?

а ведь он может вообще остановиться на фазе генерации промежуточного представления - LLVM, например
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255078
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackНовый Годкомпилер генерил бы код без оптимизации да ладно! а оптимизировать руками потом? ))
я знаю лично только 1 человека, который занимался вы подобными вещами
еще с парочкой переписывался
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255079
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилНовый Годно речь то не об етом, речь про С++!
так что тебе не нравится в кодогенераторе?
команды генеримые не всегда понятны и очевидны?

а ведь он может вообще остановиться на фазе генерации промежуточного представления - LLVM, например
мне все нравится
нужен только quick start tutorial
нихачу читать все комманды
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255084
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годнужен только quick start tutorial
нихачу читать все комманды

цель то какова?

просто посмотреть на порождение - общих знаний достаточно.
детально разбирать - мануалы придётся раскурить, распухла система команд, нечеловеческой стала
интринсики пописать - третье
кодогенератор свой писать (кодеки иногда балуются кодогенераций на лету) - четвёртое
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255087
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилНовый Годнужен только quick start tutorial
нихачу читать все комманды

цель то какова?

просто посмотреть на порождение - общих знаний достаточно.
детально разбирать - мануалы придётся раскурить, распухла система команд, нечеловеческой стала
интринсики пописать - третье
кодогенератор свой писать (кодеки иногда балуются кодогенераций на лету) - четвёртое

цель -- просто посмотреть
только там невсегда команды из доки используются
поэтому нужен еще какой-то набор знать

интринсике это же просто ассемблерная вставка, да?
типа TYPE __sync_val_compare_and_swap(TYPE *ptr, TYPE oldval, TYPE newval); ?
нет не надо эту хрень
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255096
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годтолько там не всегда команды из доки используются
поэтому нужен еще какой-то набор знать

это проблема конкретной доки.
Недокументированных команд не так много ( и то они больше к ring0 относятся)
в листинге кроме машинных команд попадаются директивы ассемблера (и всякие таблички для корректной свёртки стека при исключениях)

Новый Годинтринсике это же просто ассемблерная вставка, да?
не совсем - https://software.intel.com/sites/landingpage/IntrinsicsGuide/

Новый Год TYPE__sync_val_compare_and_swap(TYPE *ptr, TYPE oldval, TYPE newval);
это просто функция со вполне очевидной семантикой
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255107
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Год TYPE__sync_val_compare_and_swap(TYPE *ptr, TYPE oldval, TYPE newval);
это просто функция со вполне очевидной сcdfмантикой[/quote]

это 1 атомарная инструкция "сравнение с обменом"
она просто выглядит как функция чтоб С++ программеры не нервничали
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255113
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годэто 1 атомарная инструкция "сравнение с обменом"
сильно зависит от CPU и TYPE, повезёт - отинланится в одну инструкцию типа CMPXCHG
или CMPXCHG8B
или CMPXCHG16B
а может и в рантайм библиотеке быть реализованной

Новый Годона просто выглядит как функция чтоб С++ программеры не нервничали
один программер сильно нервничает
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255114
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годэто 1 атомарная инструкция "сравнение с обменом"
она просто выглядит как функция чтоб С++ программеры не нервничали
У GCC она выглядит чуть иначе:
https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255188
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из тех компиляторов, что я видел, гнус генерит самый укуренный код.

Самое интересное, что даже на ровном месте умудряется засунуть ненужные инструкции.

Причем больше это относится к неоптимизированному коду. Может потом меньше остается ? =)

Пример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.
int fna(long long x)
{
	return x % 256;
}


Crazy1.o:     file format pe-i386


Disassembly of section .text:

00000000 <_fna>:
int fna(long long x)
{
   0:	55                   	push   ebp
   1:	89 e5                	mov    ebp,esp
   3:	57                   	push   edi
   4:	56                   	push   esi
   5:	53                   	push   ebx
   6:	83 ec 24             	sub    esp,0x24
   9:	8b 45 08             	mov    eax,DWORD PTR [ebp+0x8]
   c:	89 45 e8             	mov    DWORD PTR [ebp-0x18],eax
   f:	8b 45 0c             	mov    eax,DWORD PTR [ebp+0xc]
  12:	89 45 ec             	mov    DWORD PTR [ebp-0x14],eax
	return x % 256;
  15:	8b 4d e8             	mov    ecx,DWORD PTR [ebp-0x18]
  18:	8b 5d ec             	mov    ebx,DWORD PTR [ebp-0x14]
  1b:	89 d8                	mov    eax,ebx
  1d:	c1 f8 1f             	sar    eax,0x1f
  20:	99                   	cdq    
  21:	89 cf                	mov    edi,ecx
  23:	31 c7                	xor    edi,eax
  25:	89 7d e0             	mov    DWORD PTR [ebp-0x20],edi
  28:	89 df                	mov    edi,ebx
  2a:	31 d7                	xor    edi,edx
  2c:	89 7d e4             	mov    DWORD PTR [ebp-0x1c],edi
  2f:	8b 4d e0             	mov    ecx,DWORD PTR [ebp-0x20]
  32:	8b 5d e4             	mov    ebx,DWORD PTR [ebp-0x1c]
  35:	29 c1                	sub    ecx,eax
  37:	19 d3                	sbb    ebx,edx
  39:	0f b6 f1             	movzx  esi,cl
  3c:	89 75 d8             	mov    DWORD PTR [ebp-0x28],esi
  3f:	89 df                	mov    edi,ebx
  41:	83 e7 00             	and    edi,0x0
  44:	89 7d dc             	mov    DWORD PTR [ebp-0x24],edi
  47:	8b 4d d8             	mov    ecx,DWORD PTR [ebp-0x28]
  4a:	8b 5d dc             	mov    ebx,DWORD PTR [ebp-0x24]
  4d:	89 ce                	mov    esi,ecx
  4f:	31 c6                	xor    esi,eax
  51:	89 75 d0             	mov    DWORD PTR [ebp-0x30],esi
  54:	89 df                	mov    edi,ebx
  56:	31 d7                	xor    edi,edx
  58:	89 7d d4             	mov    DWORD PTR [ebp-0x2c],edi
  5b:	8b 5d d0             	mov    ebx,DWORD PTR [ebp-0x30]
  5e:	8b 75 d4             	mov    esi,DWORD PTR [ebp-0x2c]
  61:	29 c3                	sub    ebx,eax
  63:	19 d6                	sbb    esi,edx
  65:	89 d8                	mov    eax,ebx
  67:	89 f2                	mov    edx,esi
  69:	83 c4 24             	add    esp,0x24
  6c:	5b                   	pop    ebx
  6d:	5e                   	pop    esi
  6e:	5f                   	pop    edi
  6f:	5d                   	pop    ebp
  70:	c3                   	ret    
  71:	90                   	nop
  72:	90                   	nop
  73:	90                   	nop



Пример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.
double remainder(double numer, double denom)
{
	double res;
	asm("fldl %2;"
		"fldl %1;"
		"fprem1;"
		"fstpl %0;"
		"fstp %%st;"
	: "=m"(res)
	: "m"(numer), "m"(denom)
	);
	return res;
}


Rem.o:     file format pe-i386


Disassembly of section .text:

00000000 <_remainder>:
double remainder(double numer, double denom)
{
   0:	55                   	push   ebp
   1:	89 e5                	mov    ebp,esp
   3:	83 ec 20             	sub    esp,0x20
   6:	8b 45 08             	mov    eax,DWORD PTR [ebp+0x8]
   9:	89 45 e8             	mov    DWORD PTR [ebp-0x18],eax
   c:	8b 45 0c             	mov    eax,DWORD PTR [ebp+0xc]
   f:	89 45 ec             	mov    DWORD PTR [ebp-0x14],eax
  12:	8b 45 10             	mov    eax,DWORD PTR [ebp+0x10]
  15:	89 45 e0             	mov    DWORD PTR [ebp-0x20],eax
  18:	8b 45 14             	mov    eax,DWORD PTR [ebp+0x14]
  1b:	89 45 e4             	mov    DWORD PTR [ebp-0x1c],eax
	double res;
	asm("fldl %2;"
  1e:	dd 45 e0             	fld    QWORD PTR [ebp-0x20]
  21:	dd 45 e8             	fld    QWORD PTR [ebp-0x18]
  24:	d9 f5                	fprem1 
  26:	dd 5d f8             	fstp   QWORD PTR [ebp-0x8]
  29:	dd d8                	fstp   st(0)
		"fstpl %0;"
		"fstp %%st;"
	: "=m"(res)
	: "m"(numer), "m"(denom)
	);
	return res;
  2b:	dd 45 f8             	fld    QWORD PTR [ebp-0x8]
}
  2e:	c9                   	leave  
  2f:	c3                   	ret    



Если же код посложнее, сам черт ногу сломит.
Как получить результат:
>gcc -c -g Rem.c
>objdump -d -M intel -S Rem.o > Rem.asm
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255219
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglПример2. Уже явным ассемблером написано, что надо, нет мы создаем локальные переменные.
>gcc -c -g Rem.c
Ну так включите оптимизацию, что ли ))
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255294
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Дело в том, что в ассемблер мне больше приходится лезть на этапе отладки.
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255298
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglДело в том, что в ассемблер мне больше приходится лезть на этапе отладки.
а с какой целью?
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255384
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилSiemarglДело в том, что в ассемблер мне больше приходится лезть на этапе отладки.
а с какой целью?С самой тривиальной. Отлавливание багов в местах, где солнце не светит нет возможности использовать полноценный отладчик с исходным кодом.
Или когда сейчас отлаживаю компилятор/libc. Надо смотреть взаимодействие ABI
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255407
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тест на понимание 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.
int main(int argc, char *argv[])
{
    int q = 6;
    int x = 0;
    x = q; // movl  -8(%rbp), %eax
           // movl  %eax, -4(%rbp)
    return 56;
}



то есть как в С++ правильно считать
x = q; -- справа это lvalue или rvalue или это зависит от ассемблера?
то есть если через временный регистр -- rvalue
если из памяти в память -- lvalue
или как?
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255417
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl, на всякий случай встряну, ногами не пинать - дебажный ассемблерный код отличается от релизного. Собственно, перед оптимизацией etc, смотреть надо в релизный.
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255433
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годтест на понимание rvalue и lvalue

в выражении
x = q;
q реально получается rvalue
потому что присваивание через временный регистр происходит

movl -8(%rbp), %eax
movl %eax, -4(%rbp) -- присваивание значения из %eax, в памяти его нет

а что нет чтоли команды копирования из памяти в память?
нет такой команды
Новый Год%rbp это типа базовый регистр для адресации автоматических переменных
удобно кстати сделали курица довольнаэто регистр для работы со стеком

читай учебник по ассемблеру 8086, да хоть Абеля
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255460
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, что скажет ТС, когда увидит fpu,mmx,axvx, etc =)
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255514
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbSiemargl, на всякий случай встряну, ногами не пинать - дебажный ассемблерный код отличается от релизного. Собственно, перед оптимизацией etc, смотреть надо в релизный.
а при включении оптимизации вполне можно и не узнать исходный код.
так что нечего плакать, что в дебаг режиме под все переменные память выделяется, даже если на регистрах переменная остаётся.живёт
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255579
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slaэто регистр для работы со стеком

прочитать для чего регистр я сам могу
главное что локальная переменная выглядит как смещение от rbp
она в стеке конечно но это мне не особо важно
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255580
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglИнтересно, что скажет ТС, когда увидит fpu,mmx,axvx, etc =)
мне это не надо
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255588
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годглавное что локальная переменная выглядит как смещение от rbp
она в стеке конечно но это мне не особо важно
можно адресовать и от SP, не удивляйся если увидишь
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39255749
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годв выражении
x = q;
q реально получается rvalue
потому что присваивание через временный регистр происходит
В машинном коде нет r-value. Там все l-value.
R-value это артефакт языков высокого уровня, обозначающий значение, чье расположение в памяти не контролируется программистом.
Это не строгое определение, но для этого топика сойдет.

Конкретно при этом присвоении вводится промежуточная переменная, потому что это технически необходимо для генерации кода, а не потому что это требование языка высокого уровня. Поэтому никакое это не r-value
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39256306
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый ГодSiemarglИнтересно, что скажет ТС, когда увидит fpu,mmx,axvx, etc =)
мне это не надоА компилятору ваше мнение не интересно. Он вполне может нагенерить и mmx, и sse. Так что придется смотреть ВСЕ команды. Или просто забить на это :)
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39256312
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_SlaНовый Год а что нет чтоли команды копирования из памяти в память?
нет такой командыА как же movs? :)
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39256329
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlonem_Slaпропущено...
нет такой командыА как же movs? :)сразу два регистра использует si и di
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39256507
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m_Slaсразу два регистра использует si и di
это никак не мешает считать, что команда существует.

проблема в том, что на некоторых процессорах интел команда работала не шибко быстро
да и два регистра занимать, которые ещё и загрузить нужно -
собственно поэтому и не наблюдаем её в результатах работы c/c++ компиляторов.
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39256552
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если ассемблерной командой копировать из памяти в память где-то в микрокоде все равно будет промежуточная переменная

так что a = b использует дополнительную переменную всегда
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39256611
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Годесли ассемблерной командой копировать из памяти в память где-то в микрокоде все равно будет промежуточная переменная

так что a = b использует дополнительную переменную всегда
если один из операндов регистр - накойхер доп память?
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39256663
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилНовый Годесли ассемблерной командой копировать из памяти в память где-то в микрокоде все равно будет промежуточная переменная

так что a = b использует дополнительную переменную всегда
если один из операндов регистр - накойхер доп память?

если один из операндов регистр -- то не нужно
если 2 операнда память -- то нужно считать из памяти куда-то и записать по другому адресу
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39256665
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
плавно перешли к обсуждению микроархитектуры?
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39256687
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилплавно перешли к обсуждению микроархитектуры?
не ну нафиг
я больше не буду
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260020
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старина Торвальдс разразился кирпичами по поводу GCC.

Вот такие дела. Что такое "вытеснение константы" - я честно говоря не понял. Кто знает - прошу прояснить.
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260027
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСтарина Торвальдс разразился кирпичами по поводу GCC.

Вот такие дела. Что такое "вытеснение константы" - я честно говоря не понял. Кто знает - прошу прояснить.

move $load_balance_mask, -136(%rbp) #, %sfp

$load_balance_mask это видимо константа, надо в исходники смотреть
ее не надо в стек записывать, а надо непосредственно использовать $load_balance_mask в ассемблерных командах
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260029
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а ну да вот

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 movq $load_balance_mask, -136(%rbp)
 subq $184, %rsp
movq (%rdx), %rax
movl %edi, -144(%rbp)
movl %ecx, -140(%rbp)
movq %r8, -200(%rbp)
movq %rax, -184(%rbp)
 movq -136(%rbp), %rax
 add %gs:this_cpu_off, %rax

должно было быть
move $load_balance_mask,%rax
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260031
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тоесть
movq $load_balance_mask,%rax
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260040
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСтарина Торвальдс разразился кирпичами по поводу GCC.

Вот такие дела. Что такое "вытеснение константы" - я честно говоря не понял. Кто знает - прошу прояснить.
Вообще-то он года два назад разразился на эту тему
Если это что-то новое, то для приличия не мешало бы ссылку на то что просите прокомментировать.
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260095
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага точно. От 2014 года.
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260519
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый Года ну да вот

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 movq $load_balance_mask, -136(%rbp)
 subq $184, %rsp
movq (%rdx), %rax
movl %edi, -144(%rbp)
movl %ecx, -140(%rbp)
movq %r8, -200(%rbp)
movq %rax, -184(%rbp)
 movq -136(%rbp), %rax
 add %gs:this_cpu_off, %rax

должно было быть
move $load_balance_mask,%rax
По моему ошибка не в этом, а в
movq %r8, -200(%rbp)
Т.к под локальные переменные выделено меньше:
subq $184, %rsp

Но да, баян. Хотя повторюсь про укуренный компилятор )
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260549
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl, а я вот посмотрел на асм-сорцы которые генерит gcc для Card-Rayrtracer и остался очень доволен.
Там кругом одни xmm регисты а я хотел лезть туда грязными руками и форсировать оптимизацию
векторного умножения. Ха... наивняк... Хотя возможно руку можно приложить.

Код: plaintext
1.
2.
3.
	double operator%(const Vector &r) {
		return x * r.x + y * r.y + z * r.z;
	}
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260577
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

XMM тоже медленные операции, AVX быстрее, хотя тут компилятор справится с выбором. На stackoverflow пробегало сравнение в 500 раз разницы.

А вот руку надо прикладывать, чтобы параллельно несколько трасс считать.

Компилятор сам этого не сделает, руками надо по другому циклы организовывать было.

В такую параллелизацию компилятором я пока не верю для нетривиальных случаев.
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260623
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl, кажется эту штуку я ищу FMA (Fused-Multiply-Add)

http://stackoverflow.com/questions/15933100/how-to-use-fused-multiply-add-fma-instructions-with-sse-avx
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260640
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSiemargl, кажется эту штуку я ищу FMA (Fused-Multiply-Add)

http://stackoverflow.com/questions/15933100/how-to-use-fused-multiply-add-fma-instructions-with-sse-avx
Да, с подобным поведением я тоже сталкивался.

Суть проблемы - чтобы не допустить ошибку округления даже порядка 1E-7, компилятор обычно генерит интрисинк функцию, которая считает медленнее раз в 50.
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260642
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаю про Relaxed в GCC.

https://gcc.gnu.org/wiki/FloatingPointMath
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260802
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglНовый Года ну да вот

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 movq $load_balance_mask, -136(%rbp)
 subq $184, %rsp
movq (%rdx), %rax
movl %edi, -144(%rbp)
movl %ecx, -140(%rbp)
movq %r8, -200(%rbp)
movq %rax, -184(%rbp)
 movq -136(%rbp), %rax
 add %gs:this_cpu_off, %rax
должно было быть
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.
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260834
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда в коде вообще нет ошибки, если только это крайняя (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 и код по прежнему ужасен.
...
Рейтинг: 0 / 0
Call stack, assembler listing
    #39260843
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а где ассемлерные директивы описаны?
вот эти

.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

я понимаю, что последнее -- это табличка виртуальных функций
но вот читать несколько напряжно когда слов не знаешь
туториал бы какой
...
Рейтинг: 0 / 0
65 сообщений из 65, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Call stack, assembler listing
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]