#1
12 марта 2007 в 18:41
Кто-то кодил под эту штуку? <br />Всё что я знаю, что so called "inline..." напоминает <br />больше всего МАСМ. <br /><br />Я немного соприкасался с ТАСМ 5.0 и мне интересно <br />можно ли забить на все остальные компиляторы <br />и учится премудростям машинного кода непосредственно <br />под любимой M$ Visual Cpp 6.0 ? <br /><br />Пример: <br />
[size=7pt]#include <stdio.h><br /><br />char format[] = "%s %s\n";<br />char hello[] = "Hello";<br />char world[] = "world";<br />void main( void )<br />{<br /> __asm<br /> {<br /> mov eax, offset world<br /> push eax<br /> mov eax, offset hello<br /> push eax<br /> mov eax, offset format<br /> push eax<br /> call printf<br /> pop ebx<br /> pop ebx<br /> pop ebx<br /> }<br />}[/size]
#2
12 марта 2007 в 18:46
Ты камрад остановись на чем-нибудь одном ;D :D
#3
12 марта 2007 в 19:00
[quote author=ZASOR link=topic=119.msg2252#msg2252 date=1173725169]<br />Ты камрад остановись на чем-нибудь одном ;D :D<br />[/quote]<br />А я ещё толком и не начинал. Приходишь так с работы: <br />"Сейчас похаваю и сяду... учить... Х.У.Я.С.М." <br /> :D
#5
12 марта 2007 в 19:16
[quote author=ZASOR link=topic=119.msg2254#msg2254 date=1173726949]<br /> ;D ;D ;D<br />[hr]<br />http://static.flickr.com/79/261457181_83009a8652_o.jpg<br />[/quote]<br />Оффтоп, но эту серию я видел - зачёт! ;)
#6
12 марта 2007 в 19:19
что это за бред? Зачем столько поппать ebx? Мы же eax пушим? >:(<br /><br />
#include <stdio.h><br /><br />char format[] = "%s %s\n";<br />char hello[] = "Hello";<br />char world[] = "world";<br />void main( void )<br />{<br /> __asm<br /> {<br /> mov eax, offset world<br /> push eax<br /> mov eax, offset hello<br /> push eax<br /> mov eax, offset format<br /> push eax<br /> call printf<br /> pop ebx<br /> pop ebx<br /> pop ebx<br /> }<br />}
#7
12 марта 2007 в 19:23
[quote author=KRIGSSVIN link=topic=119.msg2256#msg2256 date=1173727182]<br />что это за бред? Зачем столько поппать ebx? Мы же eax пушим? >:(<br /><br />[/quote]<br />Хм, верно. Компилится без предупреждений и ошибок... <br />Проморгал. <br /><br />Надо так(?) <br />
[size=7pt]#include <stdio.h><br /><br />char format[] = "%s %s\n";<br />char hello[] = "Hello";<br />char world[] = "world";<br />void main( void )<br />{<br /> __asm<br /> {<br /> mov eax, offset world<br /> push eax<br /> mov eax, offset hello<br /> push eax<br /> mov eax, offset format<br /> push eax<br /> call printf<br /> pop eax<br /> pop eax<br /> pop eax<br /> }<br />}[/size]
#8
12 марта 2007 в 22:31
Ага теперь правильно!<br />А _asm всегда без предупреждений глупых... на то он и асм. Там только корявый синтаксис - ошибка. :D О других ошибках ты узнаешь по работе программы ;D
#9
13 марта 2007 в 04:50
KRIGSSVIN <br />Можешь мне подбросить какой-нибудь кусок кода на инлайн-АСМе <br />из своей практики? Чуть более серьёзный, потому что этот беспонтовый - <br />вызывает ту же printf, вот блин, поражатели воображения <br /> :-X ;)
#10
13 марта 2007 в 06:08
UAC: Да пожалуйста! Вот тебе код из дума 3, переведённый мною на встроенный АСМ.<br />Вычисляет угол обзора камеры, основываясь на пропорциях экрана<br />r_aspectRatio = 0 -- 4*3<br />r_aspectRatio = 1 -- 16*9<br />r_aspectRatio = 2 -- 16*10<br />и предлагаемом первичном угле по горизонтали X. Возвращает угол по Y и, при необходимомости, правит X.<br /><br />void idGameLocal::CalcFov( float &fov_x, float &fov_y ) const<br />{<br /> unsigned int i360 = 360,<br /> aspect = r_aspectRatio.GetInteger();<br /> float f16_12 = 4.0f/3.0f,<br /> f10_16 = 5.0f/8.0f,<br /> f9_16 = 9.0f/16.0f;<br /> // first, calculate the vertical fov based on a 640x480 view<br /> __asm<br /> {<br /> mov EAX,fov_x<br />// x = 640.0f / tan( base_fov / 360.0f * idMath::PI );<br /> fldpi<br /> fmul float ptr [EAX]<br /> fidiv i360<br /> fptan<br /> ffree st(0)<br /> fincstp<br /> fld f16_12<br />// y = atan2( 480.0f, x );<br /> fpatan<br /> cmp aspect,2<br /> je aspect_2<br /> cmp aspect,1<br /> jne fov_y_fin<br /> push f9_16<br /> jmp short aspect_new<br />aspect_2: push f10_16<br />aspect_new:<br />// y = ratio_y / tan( fov_y / 360.0f * idMath::PI );<br />// fov_x = atan2( ratio_x, y ) * 360.0f / idMath::PI;<br /> fld st(0)<br /> fptan<br /> ffree st(0)<br /> fincstp<br /> fld float ptr [ESP]<br /> add ESP,4<br /> fpatan<br /> fimul i360<br /> fldpi<br /> fdiv<br /> fstp float ptr [EAX]<br />// fov_y = y * 360.0f / idMath::PI;<br />fov_y_fin: fimul i360<br /> fldpi<br /> fdiv<br /> mov EAX,fov_y<br /> fstp float ptr [EAX]<br /> }<br />}<br />