powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Call stack, assembler listing
25 сообщений из 65, страница 2 из 3
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
25 сообщений из 65, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Call stack, assembler listing
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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