Вы не зашли.
кто сталкивался с тем что бы заставить gcc собирать код на asm?
что бы параметры функции передавались через push
а не через mov
платформа x86
по всякому перепробовал
может он этого и неумеет?
__stdcall вместо __cdecl?
Если я правильно понял проблему, попробуй опцию -mpush-args или -mno-accumulate-outgoing-args.
в том то и дело что
-mpush-args или -mno-accumulate-outgoing-args
ничего не меняют
а __stdcall , __cdecl
совершенно не то
ведь параметры все так же через стек идут
токо не командой push а командой mov [esp-.....
reversecode
Покажи полную командную строку, которой запускается gcc.
а -O0 или -Os не помогают?
самое интересное, что -mpush-args действительно не работает
c -Os работает, но при этом идет оптимизация всех инструкций по размеру кода, а это не всегда нужно
Сложно сказать.
int foo (int a, int b)
{
return a + b;
}
int bar (int x)
{
return foo (x, 2) * foo (x, 4);
}Компилируется в:
.file "tmp.c"
# GNU C version 4.1.2 (Gentoo 4.1.2) (i486-pc-linux-gnu)
# compiled by GNU C version 4.1.2 (Gentoo 4.1.2).
# GGC heuristics: --param ggc-min-expand=63 --param ggc-min-heapsize=63297
# переданы ключи: -march=i386 -auxbase -fverbose-asm
# активные ключи: -falign-loops -fargument-alias
# -fbranch-count-reg -fcommon -fearly-inlining
# -feliminate-unused-debug-types -ffunction-cse -fgcse-lm -fident
# -finline-functions-called-once -fivopts -fkeep-static-consts
# -fleading-underscore -floop-optimize2 -fmath-errno -fpcc-struct-return
# -fpeephole -fsched-interblock -fsched-spec -fsched-stalled-insns-dep
# -fshow-column -fsplit-ivs-in-unroller -ftrapping-math -ftree-loop-im
# -ftree-loop-ivcanon -ftree-loop-optimize -ftree-vect-loop-version
# -fverbose-asm -fzero-initialized-in-bss -m32 -m80387 -m96bit-long-double
# -malign-stringops -mfancy-math-387 -mfp-ret-in-387 -mieee-fp
# -mno-red-zone -mpush-args -mtls-direct-seg-refs
# Compiler executable checksum: 0fc900551e93a9af83dbbe81eea806a0
.text
.globl foo
.type foo, @function
foo:
pushl %ebp #
movl %esp, %ebp #,
movl 12(%ebp), %eax # b, b
addl 8(%ebp), %eax # a, D.1280
leave
ret
.size foo, .-foo
.globl bar
.type bar, @function
bar:
pushl %ebp #
movl %esp, %ebp #,
pushl %ebx #
pushl $2 #
pushl 8(%ebp) # x
call foo #
addl $8, %esp #,
movl %eax, %ebx #, D.1286
pushl $4 #
pushl 8(%ebp) # x
call foo #
addl $8, %esp #,
imull %ebx, %eax # D.1286, D.1285
movl -4(%ebp), %ebx #,
leave
ret
.size bar, .-bar
.ident "GCC: (GNU) 4.1.2 (Gentoo 4.1.2)"
.section .note.GNU-stack,"",@progbits-O2 тоже пробовал передавать -- всё равно push'ами в стек аргументы складываются.
reversecode
Возможно локальный глюк. Попробуй другую версию gcc или на другой машине.
разобрался
нужно сразу две опции
-mpush-args -mno-accumulate-outgoing-args
тогда все впорядке
ну еще можно -O
добавить тогда вообще красота
платформа x86
Точно? А может x86_64?
Я никак не мог сообразить, почему я всё время видел именно movl вместо pushl, и почему же, когда я решил проверить, я почему-то не увидел movl... Домой пришёл, попробовал, и, думаю, понял: на x86_64 gcc так поступает. -fpush-args я включил явно, -faccumulate-outgoing-args (которая включена была по-дефолту) я выключил. В низкоуровневых оптимизациях я не секу, поэтому не могу сказать, зачем он так делает, но, думаю, так лучше.
Сделай вот что:
gcc -S -fverbose-asm file.c
А потом загляни в file.s, там будет написано всё про gcc и про опции, которые используются. Собственно в предыдущем моём посте можно видеть пример такого вывода.
Собственно, я не знаю как сделать push'ами. С этими вопросами, наверное, стоит обращаться в списки рассылки gcc. Быть может какой-нибудь из оптимизаторов решает, что push будет не лучшим выходом (и судя по результатам при -Os, так оно и есть). Быть может это не фича, а глюк -- сложно сказать.
>r90
-maccumulate-outgoing-args
почему то включена по дефолту всегда
а в соурсах нашел
что бы был push должен быть отключен accumulate-outgoing-args
нужно обе опции включать
и проще делать objdump -d file.o
тоесть
-mpush-args -mno-accumulate-outgoing-args -O
все просто замечательно
нормально это нигде толком не описано
думаю по нормальному включение -mpush-args должно отключать accumulate-outgoing-args
Включал и отключал. Про -O не догадался. Кстати он у меня ругаться стал когда к push-args и no-accumulate я добавил -O:
gcc -mpush-args -mno-accumulate-outgoing-args -fverbose-asm -O -S tmp.c tmp.c:1: предупреждение: unwind tables currently require either a frame pointer or -maccumulate-outgoing-args for correctness
Отредактировано r90 (19-05-2008 22:53:54)
Поднимем эту старую тему.
gcc -mpush-args -mno-accumulate-outgoing-args test.c test.c:1:0: warning: stack probing requires -maccumulate-outgoing-args for correctness
Как отключить stack probing?