Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2016, 15:44   #21
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
что он там наоптимизировал под x64
Я проверял на x86.
Цитата:
Интересно было бы глянуть ассемблерный листинг
Код:
	.file	"main.c"
	.section .rdata,"dr"
	.align 2
LC0:
	.ascii "%\0s\0\12\0\0\0"
	.align 2
LC1:
	.ascii "%\0s\0\0\0"
	.text
	.p2align 4,,15
	.globl	_func
	.def	_func;	.scl	2;	.type	32;	.endef
_func:
LFB13:
	.cfi_startproc
	subl	$28, %esp
	.cfi_def_cfa_offset 32
	movl	32(%esp), %eax
	movl	$LC0, (%esp)
	movl	%eax, 4(%esp)
	call	_wprintf
	movl	36(%esp), %eax
	movl	$LC1, (%esp)
	movl	%eax, 4(%esp)
	call	_wprintf
	addl	$28, %esp
	.cfi_def_cfa_offset 4
	ret
	.cfi_endproc
LFE13:
	.def	___main;	.scl	2;	.type	32;	.endef
	.section .rdata,"dr"
	.align 2
LC2:
	.ascii "f\0i\0r\0s\0t\0\0\0"
	.section	.text.startup,"x"
	.p2align 4,,15
	.globl	_main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
LFB14:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	andl	$-16, %esp
	subl	$32, %esp
	call	___main
	movl	$LC2, 4(%esp)
	movl	$LC0, (%esp)
	call	_wprintf
	movl	32(%esp), %eax
	movl	$LC1, (%esp)
	movl	%eax, 4(%esp)
	call	_wprintf
	xorl	%eax, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
LFE14:
	.ident	"GCC: (i686-posix-dwarf-rev1, Built by MinGW-W64 project) 6.2.0"
	.def	_wprintf;	.scl	2;	.type	32;	.endef

Последний раз редактировалось Croessmah; 20.12.2016 в 15:45. Причина: не тот код впихнул
Croessmah вне форума Ответить с цитированием
Старый 20.12.2016, 15:50   #22
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Не понял, а где "second"?
Похоже, компиль понял, что в данном коде
к нему не обращаются и выпилил его вообще.
Croessmah вне форума Ответить с цитированием
Старый 20.12.2016, 16:42   #23
Sabre
Пользователь
 
Регистрация: 13.09.2016
Сообщений: 16
По умолчанию

На то, что отсутствует second я тоже обратил внимание Причём само тело функции _func компилятор встроил в main, а функцию, не смотря на то, что к ней после встраивания больше не обращаются, выпилить забыл

Код:
	movl	$LC2, 4(%esp)
	movl	$LC0, (%esp)
	call	_wprintf
	movl	32(%esp), %eax
	movl	$LC1, (%esp)
	movl	%eax, 4(%esp)
	call	_wprintf
Переделаю для себя, дабы не потекли мозги от синтаксиса AT&T:
Код:
	mov	[esp+4], LC2
	movl	[esp], LC0
	call	_wprintf
	mov	eax, [esp+32]
	mov	[esp], LC1
	mov	[esp+4], eax
	call	_wprintf
По идее в [esp+32] должен был лежать указатель на выпиленный LC4 Да и в теле функции тоже всё ок, просто параметр №2 "оптимизирован".
Код:
	movl	32(%esp), %eax - первый параметр
...
	movl	36(%esp), %eax - второй параметр +4 в х86
Sabre вне форума Ответить с цитированием
Старый 20.12.2016, 16:54   #24
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Линковщик еще не отработал, потому функция еще на месте.
Croessmah вне форума Ответить с цитированием
Старый 01.02.2017, 18:02   #25
Sabre
Пользователь
 
Регистрация: 13.09.2016
Сообщений: 16
По умолчанию

Подскажите, можно ли сделать макрос, который преобразует прототип функции:
Код:
int Cmp_n(char* str1, char* str2, int size);
в такой:
Код:
int WCmp_n(wchar_t* str1, wchar_t* str2, int size/2)
.
Т.е., чтобы по второму синтаксису можно было вызывать функцию 1?
Sabre вне форума Ответить с цитированием
Старый 01.02.2017, 18:35   #26
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А почему нельзя?
Но можно и просто функцию вызывающую другую функцию.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.02.2017, 01:53   #27
Sabre
Пользователь
 
Регистрация: 13.09.2016
Сообщений: 16
По умолчанию

Намучился, чтобы составить корректно макрос - всё время с синтаксисом у меня были косяки, но вроде получилось:
Код:
#define WCmp_n(A, B, C) Cmp_n((wchar_t*)(A), (wchar_t*)(B), (C*2))
Единственное, валится предупреждение о несовместимых типах. Как побороть пока не придумал.
Sabre вне форума Ответить с цитированием
Старый 02.02.2017, 08:08   #28
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Когда победите предупреждение, функция скорее всего упадет.
Зачем вообще нужна такая гимнастика? В чем суть проблемы?
waleri вне форума Ответить с цитированием
Старый 02.02.2017, 09:29   #29
Sabre
Пользователь
 
Регистрация: 13.09.2016
Сообщений: 16
По умолчанию

Да нет проблемы. Думал макросом макросом обернуть, но, видимо, лучше функцией-обёрткой.
Sabre вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
первые шаги в андройде Виталий.Ч . Помощь студентам 2 11.03.2016 16:19
Первые шаги к свободе 13th Свободное общение 15 19.01.2012 00:58
Первые шаги в QBasic teeshka2 Помощь студентам 2 23.08.2010 14:47
первые шаги в с++ ploik Общие вопросы C/C++ 2 16.07.2010 23:35
Первые шаги trave1er Общие вопросы C/C++ 2 10.09.2008 20:32