Для 64-битного gcc -O3 (4.5.0) в Linux x86_64 это читается как: cout << "Hello World" </strong>
movl $11, %edx ; String length in EDX
movl $.LC0, %esi ; String pointer in ESI
movl $_ZSt4cout, %edi ; load virtual table entry of "cout" for "ostream"
call _ZSt16__ostream_insertIcSt11char_traits...basic_ostreamIT_T0_ES6_PKS3_l
и, для printf ("Hello World")
movl $.LC0, %edi ; String pointer to EDI
xorl %eax, %eax ; clear EAX (maybe flag for printf=>no stack arguments)
call printf
, что означает, что ваша последовательность полностью зависит от любого конкретного
реализация компилятора, его версия и, возможно, опции компилятора.
Ваша правка гласит, что вы используете gcc 4.5.2 (что является довольно новым).
Похоже, 4.5.2 вводит дополнительные 64-битный регистр
эта последовательность по любой причине. Это сохраняет 64-битный RAX в RDI
перед обнулением - что абсолютно бессмысленно (по крайней мере, для меня).
Гораздо интереснее: 3 последовательности вызова аргумента ( g ++ -O1 -S source.cpp ):
void c_proc()
{
printf("%s %s %s", "Hello", "World", "!") ;
}
void cpp_proc()
{
std::cout << "Hello " << "World " << "!";
}
ведет к ( c_proc ):
movl $.LC0, %ecx
movl $.LC1, %edx
movl $.LC2, %esi
movl $.LC3, %edi
movl $0, %eax
call printf
со строками .LCx и без указателя стека !
Для cpp_proc :
movl $6, %edx
movl $.LC4, %esi
movl $_ZSt4cout, %edi
call _ZSt16__ostream_insertIcSt11char_traits...basic_ostreamIT_T0_ES6_PKS3_l
movl $6, %edx
movl $.LC5, %esi
movl $_ZSt4cout, %edi
call _ZSt16__ostream_insertIcSt11char_traits...basic_ostreamIT_T0_ES6_PKS3_l
movl $1, %edx
movl $.LC0, %esi
movl $_ZSt4cout, %edi
call _ZSt16__ostream_insertIcSt11char_traits...basic_ostreamIT_T0_ES6_PKS3_l
Теперь вы понимаете, что это такое.
Привет
БВУ