GCC выработка компилятором машинного кода
mal 8 мая, 2011 - 16:31
Привет Всем!
Ради прикола, ради интереса и ради коллекции стало интересно, как будет выглядеть машинный код, и как его посмотреть?
Программный код на с++ "Hello World!" файла hello.cpp будет выглядеть так:
#include <iostream> using namespace std; int main () { cout << "Hello world in ANSI-C++\n"; return 0; }
а ассемблерный "Hello World!" файла hello.cpp через g++ -S hello.cpp -o 1
так:
.file "hello.cpp" .local _ZStL8__ioinit .comm _ZStL8__ioinit,1,1 .section .rodata .LC0: .string "Hello world in ANSI-C++\n" .text .globl main .type main, @function main: .LFB957: .cfi_startproc .cfi_personality 0x0,__gxx_personality_v0 pushl %ebp .cfi_def_cfa_offset 8 movl %esp, %ebp .cfi_offset 5, -8 .cfi_def_cfa_register 5 andl $-16, %esp subl $16, %esp movl $.LC0, 4(%esp) movl $_ZSt4cout, (%esp) call _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc movl $0, %eax leave ret .cfi_endproc .LFE957: .size main, .-main .type _Z41__static_initialization_and_destruction_0ii, @function _Z41__static_initialization_and_destruction_0ii: .LFB961: .cfi_startproc .cfi_personality 0x0,__gxx_personality_v0 pushl %ebp .cfi_def_cfa_offset 8 movl %esp, %ebp .cfi_offset 5, -8 .cfi_def_cfa_register 5 subl $24, %esp cmpl $1, 8(%ebp) jne .L5 cmpl $65535, 12(%ebp) jne .L5 movl $_ZStL8__ioinit, (%esp) call _ZNSt8ios_base4InitC1Ev movl $_ZNSt8ios_base4InitD1Ev, %eax movl $__dso_handle, 8(%esp) movl $_ZStL8__ioinit, 4(%esp) movl %eax, (%esp) call __cxa_atexit .L5: leave ret .cfi_endproc .LFE961: .size _Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii .type _GLOBAL__I_main, @function _GLOBAL__I_main: .LFB962: .cfi_startproc .cfi_personality 0x0,__gxx_personality_v0 pushl %ebp .cfi_def_cfa_offset 8 movl %esp, %ebp .cfi_offset 5, -8 .cfi_def_cfa_register 5 subl $24, %esp movl $65535, 4(%esp) movl $1, (%esp) call _Z41__static_initialization_and_destruction_0ii leave ret .cfi_endproc .LFE962: .size _GLOBAL__I_main, .-_GLOBAL__I_main .section .ctors,"aw",@progbits .align 4 .long _GLOBAL__I_main .weakref _ZL20__gthrw_pthread_oncePiPFvvE,pthread_once .weakref _ZL27__gthrw_pthread_getspecificj,pthread_getspecific .weakref _ZL27__gthrw_pthread_setspecificjPKv,pthread_setspecific .weakref _ZL22__gthrw_pthread_createPmPK14pthread_attr_tPFPvS3_ES3_,pthread_create .weakref _ZL20__gthrw_pthread_joinmPPv,pthread_join .weakref _ZL21__gthrw_pthread_equalmm,pthread_equal .weakref _ZL20__gthrw_pthread_selfv,pthread_self .weakref _ZL22__gthrw_pthread_detachm,pthread_detach .weakref _ZL22__gthrw_pthread_cancelm,pthread_cancel .weakref _ZL19__gthrw_sched_yieldv,sched_yield .weakref _ZL26__gthrw_pthread_mutex_lockP15pthread_mutex_t,pthread_mutex_lock .weakref _ZL29__gthrw_pthread_mutex_trylockP15pthread_mutex_t,pthread_mutex_trylock .weakref _ZL31__gthrw_pthread_mutex_timedlockP15pthread_mutex_tPK8timespec,pthread_mutex_timedlock .weakref _ZL28__gthrw_pthread_mutex_unlockP15pthread_mutex_t,pthread_mutex_unlock .weakref _ZL26__gthrw_pthread_mutex_initP15pthread_mutex_tPK19pthread_mutexattr_t,pthread_mutex_init .weakref _ZL29__gthrw_pthread_mutex_destroyP15pthread_mutex_t,pthread_mutex_destroy .weakref _ZL30__gthrw_pthread_cond_broadcastP14pthread_cond_t,pthread_cond_broadcast .weakref _ZL27__gthrw_pthread_cond_signalP14pthread_cond_t,pthread_cond_signal .weakref _ZL25__gthrw_pthread_cond_waitP14pthread_cond_tP15pthread_mutex_t,pthread_cond_wait .weakref _ZL30__gthrw_pthread_cond_timedwaitP14pthread_cond_tP15pthread_mutex_tPK8timespec,pthread_cond_timedwait .weakref _ZL28__gthrw_pthread_cond_destroyP14pthread_cond_t,pthread_cond_destroy .weakref _ZL26__gthrw_pthread_key_createPjPFvPvE,pthread_key_create .weakref _ZL26__gthrw_pthread_key_deletej,pthread_key_delete .weakref _ZL30__gthrw_pthread_mutexattr_initP19pthread_mutexattr_t,pthread_mutexattr_init .weakref _ZL33__gthrw_pthread_mutexattr_settypeP19pthread_mutexattr_ti,pthread_mutexattr_settype .weakref _ZL33__gthrw_pthread_mutexattr_destroyP19pthread_mutexattr_t,pthread_mutexattr_destroy .ident "GCC: (Gentoo 4.4.5 p1.2, pie-0.4.5) 4.4.5" .section .note.GNU-stack,"",@progbits
»
- Для комментирования войдите или зарегистрируйтесь
gcc hello.cpp -O
gcc hello.cpp -O hello
hexdump hello | less
просто скомпилировав
просто скомпилировав программу вы получите elf файл в котором, огромное количество информации помимо собственно исполняемого кода
если имя скомпиленой
если имя скомпиленой программы program, то
даст вам возможность посмотреть бинарный код с расшифровкой в инструкции проца, с аргументами и прочим.
И еще, если вы хотите посмотреть, как именно gcc оптимизирует тот или иной код, то во первых включите таки оптимизацию (у вас она выключена), и во вторых запихните код, который хотите оптимизировать в отдельную функцию, а потом найдите ее в
objdump -d program
например и там смотрите, чтоб ваш код не путался с всяким "служебным" кодом для инициализации всякого разного.сделал objdump -d /bin/ls -
del
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
единственное что можно
единственное что можно сделать (а может и нет):
и перевести 16-ую систему счисления в 2-ую, кому интересно это выглядит так "Hello World!"
Keep tryin' me jerk off, keep tryin' me... wanna impress her? Impress her with me. Impress her with ME!
Твой опкод не выводит Хелло,
Твой опкод не выводит Хелло, ворлд, - с уважением, ваш КО.
если внимательно посмотреть на крестовый исходник вооруженным взгядом, то можно заметить подключение библиотек, а т.к код собран не статически .....
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
Подскажите пожалуйста, как
Так это же hexdump скомпилированного hello.cpp
Я хочу диктовать 0 и 1 интерпретатору gcc :) в итоге я хочу как-бы обратно запустить компилятор и создать файл с кодом "Hello world!" потом скомпилировать его и запустить.
PS: Если есть язык верхнего уровня который переходит в язык ассемблера который переходит в машинный код (который сводиться к 0 и 1), то получается можно настроить все для с функции обратного действия (как перфокарты), для этого мне и нужно узнать точный код программы.
Keep tryin' me jerk off, keep tryin' me... wanna impress her? Impress her with me. Impress her with ME!
Если честно я нихрена не
Если честно, я нихрена не понял из этого потока сознания, который вы сейчас выдали, но я уверяю вас, что тот код, который приведен в вашей ссылке, не является бинарным представлением исполняемых инструкций вашей программы (это очевидно даже если просто посмотреть на длину этого кода). потому что, как я уже писал выше, в файле с программой кроме кода еще куча другой информации. и его hexdump штука весьма бесполезная.
gry написал(а): бинарным
как увидеть то? код в первом посте, gcc у вас на машине. Аминь!
Keep tryin' me jerk off, keep tryin' me... wanna impress her? Impress her with me. Impress her with ME!
ради коллекции стало
примерно так
:)
сильно зависит от оптимизации, проца и фаз луны. Добратся до процессорного кода в соеременных процах не представляется возможным
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
бред
бред
evadim забанен за хамское поведение и нецензурную речь
что именно ?
что именно ?
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
96
да все вам понятно: как увидеть машинный код программы "hello world" самого низкого уровня?
Keep tryin' me jerk off, keep tryin' me... wanna impress her? Impress her with me. Impress her with ME!
примерно так
примерно так http://ref.x86asm.net/coder.html.
В более читабельной форме так - http://www.realcoding.net/article/view/1771
дальше можешь повтыкать в темплейты асмовского компилятора
Ты скажи толком, что ты хочешь, потому что сдается мне, что ты не там ищешь
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
234
я хочу ясно представлять цепочку событий: с++ передает код ассемблеру, ассемблер передает код машине (мне это и хочется посмотреть, как выглядит то что ассемблер передает машине, когда запускаю компиляцию через g++)
Keep tryin' me jerk off, keep tryin' me... wanna impress her? Impress her with me. Impress her with ME!
ассемблер передает код
ассемблер НЕ передает код машине
Для начала почитай про elf загрузчик ( на Линуксе) или про PE загрузчик ( в виндовсе)
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
Ассемблер - компилятор
Ассемблер - компилятор исходного текста программы, в программу на машинном языке. Я это имел ввиду.
Вы знаете как выглядит программа с первого поста на машинном языке?
например: Программа «Hello, World!» для процессора архитектуры x86 выглядит следующим образом (в шестнадцатеричном представлении по байтно):
BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
Keep tryin' me jerk off, keep tryin' me... wanna impress her? Impress her with me. Impress her with ME!
Вы знаете как выглядит
1) Привиденный вами пример не верен в 98% архитектур :)
2) Вы уверены в что она выглядит именно так ? а как я могу в это проверить ? как минимум ответьте, куда именно, на какое устройство будет выведены искомые буквы :)
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
с++ кроссплатформенный язык
с++ кроссплатформенный язык, компилятор gcc пропускает программу через этапы лексического анализа, синтаксического анализа, контроля типов и генерации кода это мне и нужно (код до появления ELFhello: file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048560
) less hello = http://paste.pocoo.org/show/385918/ или он же в двоичном после hexdump = http://paste.pocoo.org/show/385438/
Keep tryin' me jerk off, keep tryin' me... wanna impress her? Impress her with me. Impress her with ME!
вам в 100-й раз пытаются
вам в 100-й раз пытаются обяснить, что ваш так называемый целевой код
не более, чем профанация.
Я уже упоминал такие слова как elf, PE, загрузчик. могу добавить bfd, ld --as-needed, shared . К сожалению, я не системщик, и не претендую на доскональное знание вопроса.
Поэтому рекомендую узнать побольше про вышеназванные понятия и потом задавть вопросы дальше.
P.S подсказака наверное - start address 0x08048560
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
slepnoga написал(а): вам в
А не будет уже глумиться-то? Все прекрасно поняли суть интересующего ТС вопроса (и вменяемые ответы уже были ему даны), вы же придираетесь к тому, что вопрос был задан без глубинного знания и учёта особенностей сферы, в которой, как вы заметили, ТС безнадёжно плавает... Обрадовались, что можно безнаказанно покусать? Вы что, энергетический вампир, и таким способом подпитываете собственное эго?
Мы тоже не всего читали Шнитке!.. © В. Вишневский
Добро побеждает!
Добро побеждает!
Keep tryin' me jerk off, keep tryin' me... wanna impress her? Impress her with me. Impress her with ME!
Блин, реально мне было
Блин, реально мне было интересно помочь в данном вопросе; может человеку стало реально интересно, как же оно работает, как вкто же читает ельфиков и как они интерпритируются.
В очередной раз убедился - хорошими делами прославится нельзя :( .
НУ и поновой доктрине о ТС либо хорошо, либо никак. Поэтому сделаем так- процитируем одного писателя:
"Лозунг гарный, цель погана"
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
Недавно на форуме была
Недавно на форуме была открыта тема "Общение на форуме". И вот яркий пример некорректного поведения со стороны человека являющегося модератором. Подобные мелочи и составляют не здоровую атмосферу.
evadim забанен за хамское поведение и нецензурную речь
Oochee3m написал(а): И вот
Это ты о ком?
Где именно?
По размышлении смею
По размышлении смею предположить, что если таки грузануть прогу в памаять и сдампить со стратового адреса, не забыв про всякие jmp то вот она, родимая, и будет
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
я про это и говорю, я хочу
я про это и говорю, фрикерство конечно, но я хочу настроить микрофон при продиктовать нули и единицы интерпретатору, а он мне сделает ELF файл и запишет его на диск.
objdump --disassemble hello
Keep tryin' me jerk off, keep tryin' me... wanna impress her? Impress her with me. Impress her with ME!
Изыйди, пожалуйста. Не
Изыйди, пожалуйста. Не нарывайся, на хамство
Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)
Иногда в процессе компиляйии
Иногда в процессе компиляйии (упаковки исходного кода в конечную эксешку), среда программирования, записывает программу не в байт коды, а в коды промежуточного языка. Пусть не столь сильного и скоростного, но зато более универсального чем ассемблер. Например дельфи записывает ехе в коды CIL - это такой промежуточный язык программирования. Для тгго чтобьы при запуски исполняемого файла на другом компьютере (к примеру с процессором отличным от процессора того компа на котором откомпилировали), не возникало ошибки, мол: "при разработки программы использовался несовместимый листинг процессорных команд". Промежуточный язык он принимает на себя весь "удар" во время запуска "ехе" на другом проце. А Он уже в свою очередь на лету переводит коды CIL языка(коды из данной подопытной ехе , разумеется), в байт код данной машины. И так происходит на каждом компьютере где её запускают. Ещё я слышал что Бэйсик вродебы не смотря на свою простоту умеет сразу в байт код проца компилировать. Тоесть универсальную ехе компанует сразу. Но универсальную - это ещё как сказать.... Ведь если её на не совместимой платформе пытаться запускать она же глючеть по идее будет?! ПРограммирпование на Языке маш кодов, дело очень тонкое. И узкоспециализированное. Объясняю почему "узкоспециализированное". Потому что необходимо сразу несколько концепций для себя определить , перед тем чтобы хотябы решить! Учить ли язык машинных кодов или нет... Потому что с дуру, можно начать осваивать язык кодов допотопный процов, таких машин как какойнибудь "рекорд 65" (шутка).А в результате наломать шишек, и очнутся, "блин надо было для интеловской базы подбирать учебники". Например сейчас при 32х разрядной системе. итспользуются в асемблере такие лигатуры как EAX EBX а теже лигатуры для 16х выглядили вроде как АХ ВХ. Я долго изучал системы маш кодирования. Очень интересовался, напрмиер сейчас с ходу могу сказать что функция прерывания инт 19 ш (лень переключать яз) . В шестнадц коде выглядит как CD20 кажется. Тоесть ненадо ассемблер там к приемру искать среду отладки какуюнибудь для асемблирования. Просто HEX редактор любой запускаете и пишите туда (в раздел я чеек) СD20, затем сохраняете в ехе. ну или ком. Запускаетет и всё! ПРоц выполнит прерывание. Также и с кемто из пользователем заявленным HEX кодом программы "здравствуй мир" . Коды все эти "BB 11 01" и т.д вбиваете в hex редактор. Только без пробелов!! Затем save затем запуск. Появляется окошко с фразой. Данный хекс код имеет вполне явную семантику кстати. Первые три каракуля всей этой 20ти значной кодировки означают кажется слово "МОv Bx, 111X".Njtсть смещение строчки кладётся в Б ИКС. Так вот... Впринципе и всё. Давайте вместе подумаем над этими командами пишите в аську. Я кстати кучу софта всякого написал на паске. Например программки для выдёргивания изОГРОМНЕЙШИХ листингов асемблерных кодов, спец теги. Которые другой под программой записываются в лист и создаётся букварь маш кодов. Который ксттаи в дальнейшем можно использовать при разработке своего собственного компилятора!
дилетант
Я не программист, однако
Я не программист, однако поверхностное знакомство с с предметом позволяет сделать предположение о том, что:
1. Вопрос, задаваемый Вами не совсем в тематике форума.
2. Настойчивость, проявленная Вами в выяснении вопроса "как написать единицы и нолики, чтобы процессор меня понял и выполнил", достойна уважения, но только _настойчивость_. Так как только "сферический процессор в ваккууме" интерпретирует на входе единички и нолики.
Отсюда мне хочется сделать вывод: "стремление к знаниям без применения здравого смысла порождает безобразие".
emerge Your world
Gentoogle
+1 Топикстартеру бы
+1
Топикстартеру бы поиграться на чем-нибудь попроще, чем x86. Например, на AVR.
ЗЫЖ Прошу прощения, что встрял.
eegorov
Увы, нет. Начинать с изучения архитектур(ы), режимов работы процессоров, классической теории компиляторов etc.
А так...
Учиться и не размышлять - напрасно терять время, размышлять и не учиться - губительно. ©
Конфуций. 论语
p.s. просто проходил мимо.
Я только за. Только вот,
Я только за. Только вот, похоже, не все хотят